(1)将下面程序保存为t1.asm,生成可执行文件t1.exe。
assume cs:codesg codesg segment mov ax,2000H mov ss,ax mov sp,0 add sp,10 pop ax pop bx push ax push bx pop ax pop bx mov ax,4c00H int 21H codesg ends end
(2)用debug跟踪t1.exe的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶内容。
step 0:通过debug t1.exe加载程序后:
ax=0000H;bx=0000H;
cx=0016H(表示程序长度,为22个字节);
ds=13D5H(表示操作系统给t1.exe分配的空闲区域的段地址);
cs=13e5H(=ds+10H,与之前描述一致);
ss=13e5H,sp=0000H;通过d 13e5:0 1命令查看栈顶内容,为00b8H;
step1:单步执行第一条指令后:
ax=2000H;bx=0000H;
其余cx,ds,cs,ss,sp均不变;
此时栈顶内容理应不变,查看依旧为00b8H;
step2:单步执行第二条指令后,自动连带执行第三条指令:
ax=2000H;bx=0000H;
其余cx,ds,cs均不变;ss和sp被重置,栈顶指向:2000:0,查看栈顶内容,为:0ff1H;
step3:单步执行第四条指令后:
ax=2000H;bx=0000H;
其余cx,ds,cs,ss均不变;sp被重置,栈顶指向:2000:0a,查看栈顶内容,为:615fH;
step4:单步执行第五条指令后:
ax=615fH(与上一步所得一致);bx=0000H;
其余cx,ds,cs,ss均不变;sp=sp+2,栈顶指向:2000:0c,查看栈顶内容,为:0DF0H;
----------因重新debug,导致前后ax不一致-----------
step5:单步执行第六条指令后:
ax=13e5H;bx=0DF0H(与上一步所得一致);
其余cx,ds,cs,ss均不变;sp=sp+2,栈顶指向:2000:0E,查看栈顶内容,为:0B16H;
step6:单步执行第七条指令后:
ax=13e5H;bx=0DF0H;
其余cx,ds,cs,ss均不变;sp=sp-2,栈顶指向:2000:0C,查看栈顶内容,为:13E5H(与AX一致);
step7:单步执行第八条指令后:
ax,bx,cx,ds,cs,ss均不变;sp=sp-2,栈顶指向:2000:0A,查看栈顶内容,为:0DF0H(与BX一致);
step8:单步执行第九条指令后:
ax=0DF0H(与上步查看一致);
bx,cx,ds,cs,ss均不变;sp=sp+2,栈顶指向:2000:0C,查看栈顶内容,为:13E5H;
step9:单步执行第十条指令后:
bx=13E5H(与上步查看一致);
ax,cx,ds,cs,ss均不变;sp=sp+2,栈顶指向:2000:0E,查看栈顶内容,为:0B16H;
(3)PSP头两个字节为CD 20,用debug加载t1.exe.查看PSP内容:
PSP区域地址范围为:ds:0~ds:ff.