实验3 编程、编译、连接、跟踪

实验

将以下程序保存为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,axmov sp,0(栈段寄存器SS被改变后,下一条指令也紧接着被执行,有关这部分的内容,可看实验2 用机器指令和汇编指令编程)。

    栈顶地址为2000:0000,内容为:0000
  • add sp,10

    栈顶地址为2000:0000A,内容为:0000
  • pop ax

    栈顶地址为2000:000C,内容为:0000
  • pop bx

    栈顶地址为2000:000E,内容为0000
  • push ax

    栈顶地址为2000:000C,内容为0000
  • push bx

    栈顶地址为2000:000A,内容为0000
  • pop ax

    栈顶地址为2000:000C,内容为0000
  • pop 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,102000:0000~000F的内容就发生了变化:

暂不知原因

posted @ 2022-05-10 18:05  Mer_curiail  阅读(102)  评论(0)    收藏  举报  来源