汇编程序调试实验报告Word格式.docx
《汇编程序调试实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《汇编程序调试实验报告Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
2.确定解决问题的思路和方法。
3.将解决问题的方案编制成程序流程图。
4.根据流程图,逐条编写程序。
5.上机调试,验证程序是否正确。
(三)汇编程序调试
MASM汇编程序的主要功能是:
把源文件转换成用二进制代码表示的目标文件,并生成列表文件;
在转换过程中汇编程序将对源程序进行扫描,检查源程序是否有语法错误并指出源程序的语法错误。
汇编语言源程序的调试过程需要经过编辑、汇编、连接、运行、调试等几个步骤:
1.编辑:
使用编辑程序,将编写好的程序输入计算机,建立一个扩展名为ASM的汇编语言源文件*.ASM。
2.汇编:
使用汇编程序,将*.ASM文件经汇编后生成扩展名为*.OBJ。
3.连接:
使用连接程序,把一个或多个目标程序连接成可执行文件*.EXE。
4.运行:
运行可执行文件,验证程序是否正确。
5.调试:
如果运行中有问题,可使用编辑或调试程序进行修改和调试,重复上述步骤,直到运行正确为止。
四、调试实例
(一)实例一
要求:
编写程序,将MBUF为起始单元的5个数按相反次序传送到NBUF开始的存储单元中。
实验思路:
本例采用顺序结构和循环结构,合理利用堆栈,通过堆栈实现数据按照相反次序传送。
源程序:
DATASEGMENT;
数据段开始
MBUFDB0,1,2,3,4;
每个数据分配一个存储单元
NBUFDB5DUP(0);
空5个存储单元备用
DATAENDS;
数据段结束
STACKSEGMENTPARASTACK;
堆栈段开始,定位类型是PARA
DB100DUP(0)
STACKENDS
CODESEGMENT;
代码段开始
ASSUMECS:
CODE,DS:
DATA,SS:
STACK;
段分配伪指令
START:
MOVAX,DATA;
数据传送
MOVDS,AX;
存储器数据传送到段寄存器中
MOVSI,OFFSETMBUF;
取第一组操作数的偏移地址
MOVDI,OFFSETNBUF;
取第二组操作数的偏移地址
MOVCX,5;
数据个数5传送到CX中
LOP1:
MOVAX,[SI];
PUSHAX;
数据入栈
INCSI;
指针加1
LOOPLOP1;
循环
LOP2:
POPAX;
数据出栈
MOV[DI],AX;
INCDI
LOOPLOP2
MOVAH,4CH;
终止进程
INT21H
CODEENDS
ENDSTART
(二)实例二
编写程序,将内存中某数据块中的正数和负数分开,并分别将这些正数和负数送同一数据段的两个缓冲区中,并在屏幕上显示正数和负数的个数。
本例中要求将正数和负数分开,因此应先判断数据块中数据的正负,然后将不同符号的数分别传送到两个缓冲区中,同时分别计数。
利用分支结构和循环结构解决问题。
数据段
BUFDB5,2,7,-4,-2,-3,4,9,-6
COUNTEQU$-BUF;
等值语句,COUNT等于BUF数据长度
ZSDB
FSDB
STR1EQUBUF+20;
正数首地址
STR2EQUBUF+30;
负数首地址
DATAENDS
STACKSEGMENTSTACK;
堆栈段
代码段
ASSUMECS:
CODE,DS:
STACK
MOVAX,DATA
初始化
MOVBX,OFFSETBUF;
取BUF中操作数的偏移地址
MOVCX,COUNT
MOVZS,0
MOVFS,0
MOVSI,OFFSETSTR1
MOVDI,OFFSETSTR2
LOP:
MOVAL,[BX]
CMPAL,0;
带符号数比较
JGLOP1;
数据大于0时跳转至LOP1
JLLOP2;
数据小于0时跳转至LOP2
INCZS;
正数计数加1
MOV[SI],AL;
正数数据存入SI寄存器中
INCBX
INCSI
LOOPLOP
JMPLAST
INCFS
MOV[DI],AL;
负数数据存入DI中
LAST:
MOVDL,ZS
MOVAH,06H;
显示字符
MOVDL,FS
MOVAH,06H
MOVAH,4CH
(三)实例三
编写程序,从内存BLOCK开始,存放着10个字节的有符号数,从这些数中找出绝对值最大的那个最大的数,将其存入MAX中。
DATASEGMENT
BLOCKDB1,-1,2,-3,4,5,3,-1,2;
设置数据
COUNTEQU$-BLOCK;
置计数值
MAXDB;
存最大值
STACKSEGMENTSTACK
CODESEGMENT
MOVDS,AX
MOVSI,OFFSETBLOCK;
数据首地址
MOVMAX,0
MOVCX,COUNT;
CX为计数器
AGAIN:
MOVAL,[SI];
将第一个数据存在AL中
判断正负
JSJDZ;
小于0转到JDZ
CMPAL,MAX;
比较数据与最大值
JGBIG;
AL大转到BIG
JMPLOP1
JDZ:
NEGAL;
求补,即绝对值
JMPLOP1;
跳转至LOP1
BIG:
MOVMAX,AL
指针加1,指向下一个数
DECCX;
计数值减1
MOVAH,MAX;
最大值存入AH
JNZAGAIN;
跳转至AGAIN
(四)实例四
编写程序,将内存中N个无符号数从大到小排序后输出显示。
BUFDB1H,9H,6H,15H,10H
COUNTEQU$-BUF
DB100HDUP()
置计数器
外层循环减1
MOVSI,CX
MOVDI,1;
交换标志DI=1
取数组中第一个偏移地址
MOVAL,[BX];
第一个数据送到AL中
CMPAL,[BX+1];
两数进行比较
JAELOP3;
大于等于转到LOP3
XCHGAL,[BX+1];
小于交换两数位置,AL存大数
MOV[BX],AL
MOVDI,0;
交换标志DI=0
LOP3:
INCBX;
数据指针指向下一位
LOOPLOP2;
循环LOP2
CMPDI,0;
交换标志为0继续,交换标志为1结束
JNZOK;
不等于0转到OK,结束
MOVCX,SI
等于0循环LOP1
OK:
BX为BUF首地址的偏移地址
LOP4:
MOVDL,[BX];
BX中的数放在DL中
输出显示
指针指向下一字符
LOOPLOP4;
循环LOP4
结束进程
INT21H;
返回DOS
五、实验总结
本次实验,虽然花费时间较长,但通过实验的完成,我的收获也很多。
(一)实验收获
无论是知识方面还是能力方面,本次实验都让我得到了很大提升。
知识方面,本次实验需要编写符合要求的程序。
首先要进行程序的设计,明确实验目的和设计思路,画出程序框图,然后进行程序的编写。
通过程序的设计与编写,使我能够更加深入的了解和掌握80486了指令系统。
程序编写完成后,便需要进行调试,最初编写的程序中出现了很多错误,在编译过程中发现错误后,不断进行修正,直到程序正确,可以实现所需功能。
在这一过程中,我逐渐熟悉了汇编程序编辑、编译、连接、调试的过程,并能通过这些软件的功能找到自己的错误加以改正,最终实现实验目的。
能力方面,由于系统原因,不能直接在电脑当前系统中进行汇编程序的调试,因此我安装了虚拟机,在虚拟机安装过程中遇到很多问题,通过对搜索引擎的有效利用,我解决了安装过程中的问题并成功安装了XP系统,建立了实验所需环境,为实验的完成打下基础。
本次实验,提高了我分析问题和解决问题的能力,能够通过查阅资料获得所需信息,解决实验过程中所遇到的各种问题。
(二)实验感悟
本次实验对知识和能力的要求都比较高,开始完成实验室,遇到了很多阻碍,但通过资料的查找和优秀视频的参考,我逐渐找到问题的解决办法,最终实现了实现所需的功能,完成了这项任务。
在这一过程中,我更深刻地体会到,任何知识的学习和掌握都是时间和汗水的积累。
只有真正认真思考,坚定完成任务的信念,找到解决问题的办法,才能学会知识和技能。