实验
将以下程序保存为asm文件,并使用Debug跟踪它的执行过程,写出每一步后,相关寄存器中的内容和栈顶的内容。
assume cs:codeseg
codeseg 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
codeseg ends
end
PSP的头两个字节是
CD20
解答
1. 现将以上程序保存为asm文件
2. 进入Debug模式
3. 查看PSP的头两个字节是否为CD20
关于PSP的相关内容,请查看第四章 第一个程序中的4.9小节。
4. 使用T命令逐步执行,遇到int 21H
命令后,要使用P命令。
- 寄存器的初始状态:
从寄存器的初始状态可以看出来,PSP的起始地址为075C:0000
,程序的起始地址CS:IP为076C:0000
。 mov ax,2000H
栈顶地址为076B:0000
,内容为:0000
mov ss,ax
和mov sp,0
(栈段寄存器SS
被改变后,下一条指令也紧接着被执行,有关这部分的内容,可看实验2 用机器指令和汇编指令编程)。
栈顶地址为2000:0000
,内容为:0000
add sp,10
栈顶地址为2000:0000A
,内容为:0000pop ax
栈顶地址为2000:000C
,内容为:0000pop bx
栈顶地址为2000:000E
,内容为0000push ax
栈顶地址为2000:000C
,内容为0000push bx
栈顶地址为2000:000A
,内容为0000pop ax
栈顶地址为2000:000C
,内容为0000pop bx
栈顶地址为2000:000E
,内容为0000
5. 程序的退出
(1)正常使用T命令执行mov ax,4c00H
。
(2)使用P命令执行int 21H
。
问题
在我的dosbox中,这个程序的初始栈顶地址总是被指定为2000:0000
,当程序还没有执行改变栈段地址和偏移地址的汇编指令时,2000:0000~000F
的内容为0:
但是一旦被执行了相关汇编指令后,即执行了以下三条命令:mov ss,ax
,mov sp,0
, add sp,10
,2000:0000~000F
的内容就发生了变化:
暂不知原因