请对源程序文件中的源程序 利用debug进行调试分析,
请提交调试截图(截图加上适当标记或注释)以及 通过调试分析收获理解了的知识点、体会等文字叙述。
DSEG SEGMENT ORG 10H VARB DB 'ABCDE' EVEN VARW DW 3 DUP(5),4 DUP(-1) BUFW EQU THIS WORD BUFBB LABEL BYTE VARD DD 1234H,5678H,3 DUP(5) BUFB EQU BYTE PTR VARD DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG START: MOV AX, DSEG MOV DS, AX MOV AX, TYPE VARB MOV BX, LENGTH VARW MOV CX, SIZE VARD MOV SI, SEG VARD MOV DI, OFFSET VARD MOV BH, BYTE PTR VARD MOV DI, WORD PTR VARD MOV DL, BUFBB MOV DH, BUFB MOV BP, BUFW .RADIX 16 MOV AH,0EF MOV AX, 4C00H INT 21H CSEG ENDS END START
在执行masm task1.asm后,输出了task1.obj和task1.lst。task1.lst可以看到机器码和汇编的源码。
执行link task1.obj,输出了可执行文件task1.exe。
对task1.exe进行调试,输入debug task1.exe
输入-u进行反汇编
其中,
076E:0000指令对应了源汇编程序的MOV AX,DESG,desg为段地址076A
076E:0003指令调用的都是变量而不是常量。
076E:0005指令对应了MOV AX, TYPE VARB。TYPE VARB为VARB的类型DB,值为1。
076E:0008指令对应了MOV BX, LENGTH VARW。LENGTH VARW为VARW的第一个DUP前的数值3。
076E:000B指令对应了MOV CX, SIZE VARD。SIZE VARD为VARD的LENGTHTYPE=14=4。
076E:000E指令对应了MOV SI, SEG VARD。SEG VARD为VARD的段地址。VARD在DSEG段内,段地址为076A。
076E:0011指令对应了MOV DI, OFFSET VARD。OFFSET VARD为VARD的偏移地址0024。
076E:0014指令对应了MOV BH, BYTE PTR VARD。[0024]表示访问偏移地址0024内的值。
076E:0018指令对应了MOV DI, WORD PTR VARD。[0024]表示访问偏移地址0024内的值。
076E:001C指令对应了MOV DL, BUFBB ,BUFBB为byte类型的label,标在了VARD上,而VARD偏移地址为0024.
076E:0020指令对应了MOV DH, BUFB。在数据段,BUFB EQU BYTE PTR VARD。BUFB等效于VARD的指针,指向VARD偏移地址0024。
076E:0024指令对应MOV BP, BUFW。在数据段,BUFW EQU THIS WORD。而当前指向的存储单元就是VARD偏移地址0024.
上述提到的bufbb,bufb,bufw与地址的对应关系都可以在lst文件中直观地看到。
.RADIX 16为伪指令,使得后续汇编语句都操作十六进制数。
076E:0028和076E:002A分别对应MOV AH,0EF和MOVAX, 4C00H。
076E:002D对应INT 21H,引发中断。
输入-g 20,将程序运行到第20H行(第32行)但不退出,创建断点并输出该断点时各个变量的值。(如果没有创建断点,则会导致程序正常结束运行而不能观察此时内存状态)
AX的值由MOV AX, TYPE VARB决定,为01。
BX的值由MOV BX, LENGTH VARW决定,为03。
CX的值由MOV CX, SIZE VARD决定,为04.
DX的值没有被汇编语句重新写入,用作通用寄存器作为地址寄存器。
SP的值没有被汇编语句重新写入,用作堆栈指针。
SI的值由MOV SI, SEG VARD决定,为076A。
DI的值由MOV DI, OFFSET VARD决定,为0024存的字1234H。
DS的值由MOVDS, AX决定,而AX的值由MOV AX, DSEG决定,此时DS和AX的值均为DSEG段地址076A.
SS是堆栈寄存器。
CS的值由ASSUMECS: CSEG决定,CS为CSEG段地址076E。
IP为instruction pointer。
输入-d ds:0 ,可以看到当前内存情况。
数据段的ORG 10H使得数据块的起始地址从0010开始,所以第一行的值全是0.
从0010开始,VARB DB 'ABCDE’使得前五个数据分别对应ABCDE的十六进制ASCII码。
EVEN使得数据对齐。
VARW DW 3 DUP(5),4 DUP(-1) 生成了3个5和4个-1,占两个字节,高高低低存储。对应了05 00 05 00 05 00和FF FF FF FF FF FF FF FF。
VARD DD 1234H,5678H,3 DUP(5)生成了1234H、5678H,3个5,每个数据占4字节。高高低低存储。对应了34 12 00 00、78 56 00 00和3个05 00 00 00。