王爽汇编浅显易懂,虽然前面两个实验都做完了,但是都是吊儿郎当做完的。
看到第三次实验比较好写心得,就写了。
原码如下,用提到的LINK.EXE和MASM.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
首先是用debug 跟踪t1.exe执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容。
程序即将开始运行,这时候给出了下一条指令 mov ax,2000H
这时候ax至FFFF,DS和CS差10H,IP偏移地址为0。
输入t执行,可以看到ax已经变成2000H了,因为是寄存器和立即数,所以占3个字节,IP变成0003,其他未变。
继续t执行。
ss变成了ax内存放的2000H。中间原本有一行指令 mov sp,0但是因为debug的对栈操作,直接在mov ss,ax后立刻执行,所以下一条语句是add sp,10
sp变成了000AH
因为pop的缘故,栈向上增长,sp增加了2字节,变成000CH
同理sp=000EH,这时候发现了AX从2000H变成了0000H,因为栈本来就是空的,又无故出栈,pop把SS:SP当时的字单元给到了AX,于是AX置0,如果BX有值的话也为0。
SP变了回去,因为POP和PUSH都用一个字节,IP每次增长1H。
后面其实也可以看到,SP又反弹了=-=。
最后两个是返回语句,AX变成4C00H,IP+3,指令地址又变成CS:IP=F000:14A0。
至此第二问结束。
(3)PSP的头两个字节是CD 20。用DEBUG加载t1.exe,查看PSP的内容。
PSP就是DS和CS之间的0010H*16=256字节
下面就不必要看了,就是这256字节就是t1.exe的说明。
实验结束,开开心心