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

本文详细解析了一段包含指令如mov, add, push, pop等的asm程序,并通过Debug工具追踪其执行过程,展示了每个步骤中相关寄存器内容及栈顶变化。涉及PSP初始状态和指令对栈的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验

将以下程序保存为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的内容就发生了变化:

暂不知原因

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Mercurial

请我喝杯焦糖玛奇朵叭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值