logo资料库

熟悉DEBUG调试环境实验报告.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
熟悉 DEBUG 调试环境实验报告 姓名:xxx 学号:xxx 班级:xx 任课教师:李济生 一、 实验目的与要求 1. 进一步学习汇编语言基本指令使用方法; 2. 学习 DEBUG 调试工具的基本使用方法;掌握 debug 调试命令 a、u、r、d、t、g 等 3. 逐条观察程序指令的执行过程,理解指令的功能,理解程序自动、顺序地执行的概 念,实践其过程(重点)。 二、 实验内容 1. 编写、输入一个 32 位二进制数相加程序,逐条执行指令,观察指令执行情况。 2. 使用已经过汇编和连接的小程序(t3-2.exe),将其装入内存,逐条执行指令,观察执 行过程和结果。在实验过程中,使用 D 命令修改 XXX 和 YYY 单元中的数据,再重新 计算其结果。 三、 实验步骤 1 1、启动计算机的 WINDOWS 操作系统,运行 DEBUG 程序 2、开始编程 3、在启动的 debug 程序里逐条输入 32 位二进制数相加程序的指令,完成无符号数 5B68F271H 和 0AC6D5698H 的加法操作,指令执行情况见下图 1:
图 1 可以看到,对 32 位数的低 16 位操作时,存放地址是 13B8:0100,指令长度为 3,即在寄 存器类型的指令上增加 1,在进行 ADC 加法指令时,考虑到了进位 CF,所以指令长度为 4。 使用 r 命令后,可以看到指令执行前各寄存器的内容,CS:IP 的内容为 0100,执行的指令为 MOV AX,F271,操作数寻址为立即数寻址,内存单元的值为 0F271。 使用 t 命令单步执行指令后,所得结果见下图 2,执行过程中,CS:IP 的内容随指令长度的变 化依次增加,标志位寄存器只有 AF,PF,CF 的值在计算过程中有变化,最后 AF=AC,说明低 4 位向高 4 位有进位,而 CF=CY,说明最高位有进位,OF=NV,表明计算结果没有溢出。 对程序使用 r 命令查看寄存器 AX,DX 的值,可知,AX=4909,DX=07D6,CF=1,说明运 算结果低 16 位为 4909,高 16 位为 07D6,还有一位进位 1,即结果是 107D64909,计算正 确。 图 2 2 使用已经过汇编和连接的小程序(t3-2.exe),将其装入内存,逐条执行指令,观察执行 过程和结果。在实验过程中,使用 D 命令修改 XXX 和 YYY 单元中的数据,再重新计算其结 果。 打开 t3-2.exe,并使用-u 命令反汇编的将结果如下图:
通过观察上面图可以看到,CS:IP 的内容变化范围是 0000-002E,执行每一条指令时 IP 都跳 跃指令长度的内存单元,指向下一条将要执行的指令,操作数涉及寄存器和立即数寻址时, 指令长度为 3,如图 5 中第一条指令 MOV AX,1429;当操作数只涉及寄存器时,指令长度为 2, 如图 5 中第二条指令 MOV DS,AX;当操作数涉及双字节内存地址时,指令长度为 4,例如图 8 中指令 MOV [0006],DX。 ZF 标志寄存器在执行 DX 的异或指令时为 1,表明 DX 内容初始化为 0000H,但在执行 对 AX 内存的累加时,DX 作为高位的寄存器,执行 DX←DX+0000H+CF,见图 7,前几次执行 ADC DX,00 时,结果都是 ZF=ZR,DX=0000H,说明计算结果没有向高位产生进位,;当标志 寄存器 OF 连续两次为 OV,显示溢出,并且 CF=CY,显示最高位有进位时,AX=2340H,再次执 行 DX←DX+0000H+CF,ZF 的标志为 NZ,DX=0001H,表明计算结果非零,说明低 16 位的计 算有进位,也显示了指令 ADC 的实现过程. 随后进行 AX←AX+[0002],判断 DX 的内容是否为空,然后利用指令 MOV [0004],AX 和 MOV [0006],DX , 按照低地址放低字节,高地址放高字节,分别将加法的计算结果存入内存 单元[0004]和[0006],完成计算。 源程序中语句 MOV WORD PTR ZZZ,AX; MOV WORD PTR ZZZ+2,DX,在程序执行过程中被 解释为 MOV [0004],AX 和 MOV [0006],DX ,利用了 PTR 运算符的转义功能,将伪指令中 zzz 的类型由 dd 转换为了 dw,而[0004]和[0006]则体现了 zzz 的内存地址与 xxx 和 yyy 的内存 地址是连续的。
使用 d 命令查看程序运行过后的结果如下图,可以看到,内存单元的存放顺序是低地址放低 字节,高地址放高字节,同时数据的存放是按顺序连续存放的,指令的存放与数据是同时的, 都存放在连续的内存地址中 使用 e 命令对内存单元的内容进行修改,再次运行程序,可见结果也有了相应的改变。 四、 实验体会 通过这次实验,熟悉 DEBUG 调试环境,了解了 debug 调试命令 a、u、r、d、t 等的作 用,进一步学习了汇编语言基本指令使用方法。 思考题: 1、程序中的数据和指令都是按顺序分别在不同的段内存地址中存放的,低地址放低字 节,高地址放高字节。 2、之所以说程序是按顺序执行的,是因为在程序执行时,指向代码段的内存偏移地址 寄存器 IP 按照指令长度,从小到大,自动顺序跳跃。 3、标志位寄存器中的数是用来指示当前指令执行之前各部分的状态,如从 OF 可以知 道上次执行计算时有没有产生溢出,从 ZF 可以判断上条指令执行后是不是结果为 0,同时, 有的标志位寄存器还参与运算,如 CF,AF,在算数运算中,标志位寄存器中的值是运算结 果的一部分。 4、用户装入内存的汇编语句是连续存放的,修改前后指令的长度,,长度增加会覆盖原 来位置的内容,使得程序不能正常运行。 5、在执行 debug 程序时,需要给出.exe 文件的后缀名,否则会报错,这是因为在生成.exe 文件时,同时生成了.obj 和.lst 文件,它们都是同名的,而 debug 程序是不能自动识别要调 试的文件后缀的,所以报错。 附件
一、DSEG SEGMENT XXX DW 1234H YYY DW 5678H ZZZ DD ? DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START:MOV AX,F271 ADD AX,5698 MOV DX,5B68 ADC DX,AC6D CSEG ENDS END START 二、t3-2.asm DSEG SEGMENT XXX DW 1234H YYY DW 5678H ZZZ DD ? DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START:MOV AX,DSEG MOV DS,AX MOV AX,XXX XOR DX,DX ADD AX,AX ADC DX,0 ADD AX,AX ADC DX,0 ADD AX,AX ADC DX,0 ADD AX,AX ADC DX,0 ADD AX,YYY ADC DX,0 MOV WORD PTR ZZZ,AX MOV WORD PTR ZZZ+2,DX
MOV AH,4CH INT 21H CSEG ENDS END START
分享到:
收藏