实验一 DEBUG 的使用一、实验目的 1. 掌握汇编程序的编辑, 编译, 连接和执行的全过程; 2. 学习和掌握用 DEBUG 调试程序的方法. 二、实验任务及内容用 DEBUG 将可执行文件调入, 并进行调试. (1) 用D 命令观察数据区在内存中的具体内容, 记录单元 A和B 的具体地址. A 的地址是: 0B89H : 0000H ;B 的地址是: 0B89H : 0001H (2) 用U 命令对目标代码反汇编, 观察反汇编后的结果. 注意发现源程序的起始位置, 并记录这个起始地址. DATA 段段基址: 0B89H A 的偏移地址: 0000H B 的偏移地址: 0001H Y 的偏移地址: 0002H Z 的偏移地址: 0005H STACK 段段基址: 0B8AH CODE 段段基址: 0B91H 第一条指令的偏移地址: 000H 子程序 SUB1 入口的偏移地址: 003FH (3) 用T 命令作单步跟踪调试. 比较每条指令执行后的结果和原来的理解是否一致. 得出程序运行的结果: 它们是写在什么单元, 具体内容是什么; 并判断结果是否正确. 1 、这是第一次调用 SUB1 子程序退出后的结果,从图中可以看出 Y 存储的数据是 400 ,即是 A*A 的结果。 2 、这是第二次调用 SUB1 子程序退出后的结果,从图中可以看出执行完“ MUL AH ”指令后, AX 存储的数据是 225 ,即是 B*B 的结果,子程序退出后 Y 存储的数据是 625 ,即是 400+225 的结果。 3、这是第三次调用 SUB1 子程序的结果, 从图中可以看出执行完“ MUL AH ”指令后,AX 存储的数据是 300 ,即是 A*B 的结果,子程序退出后 Y 存储的数据是 925 ,即是 625 + 300 的结果。 4 、这是程序退出时的最终结果,从图中可以看出, Y 存储的数据最终为 1225 ,即为(A+B)*(A+B) 的结果。结果正确。(4) 在子程序 SUB1 的入口处设一断点,用G 命令执行程序. 在断点处观察堆栈的内容,比较堆栈的内容和程序返回地址是否一致. 从图中可以看出, IP 指针的变化说明调用了子程序 SUB1 , 而堆栈段段基址 SS 和栈顶指针 SP 的值都没有改变。程序返回地址一致。(5) 用E 命令修改单元 A,B 的内容, 重新执行程序, 并记录结果. 从图中可见,分别将 A、B 的值分别改为 1、1 之后,程序执行完毕, Y 存储的内容是+4 , 结果正确。(6) 用M 命令和 A 命令对程序进行修改: 将主程序中最后两条指令(ADD 和 ADC) 修改为一条 CALL SUB1 指令, 重新执行程序. 反汇编发现程序最后的 ADD 指令在 CODE 段的偏移地址为 0035 ,将此处改为调用 SUB 1 子程序的指令,然后将 0038 处改为 RETF 。重新执行后,查看 Y 的内容,结果正确。(7) 退出 DEBUG. (8) 重新使用编辑软件, 把源程序最后一句中的 STAR 去掉. 再次生成可执行文件, 并用 DEBUG 调入内存. 当使用 U 命令时, 显示的结果与前一次( 未加 STAR) 的结果有何不同? 观察到两点不同(虽然不明了其原因), 其一:不能立即进入程序,需执行许多冗余指令; 其二:不能正确退出程序。三、源程序 DAT SEGMENT A DB 20 ;( 自定)B DB 15 ;( 自定)Y DB 3 DUP(0) Z DB 0,0 DAT ENDS STA SEGMENT STACK DW 50 DUP(?) STA ENDS COD SEGMENT ASSUME CS:COD,DS:DAT STAR PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DAT MOV DS,AX MOV AX,STA MOV SS,AX MOV AL,A MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,B MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,A MOV Z,AL MOV AL,B MOV Z+1,AL CALL SUB1 ADD WORD PTR Y,AX ADC BYTE PTR[Y+2],0 RET STAR ENDP SUB1 PROC MOV AL,Z MOV AH,Z+1 MUL AH ADD WORD PTR Y,AX ADC BYTE PTR[Y+2],0 RET SUB1 ENDP COD ENDS END STAR 四、预习题:若 SS=2000H,SP=FFFFH, 向堆栈中压入 4 字节数据后, 如何用 D 命令显示压入堆栈的内容? 答:使用 debug 指令“
北邮微机原理软件实验报告资料 来自淘豆网m.daumloan.com转载请标明出处.