实验2 用机器指令和汇编指令编程

本文介绍了Debug工具中D命令的使用,通过实例展示了如何查看和操作内存中的数据,包括查看代码段、栈段的内容。在执行T命令时,如果遇到修改栈段寄存器SS的指令,下一条指令也会被立即执行。实验任务部分详细记录了执行特定指令后的内存和寄存器变化,揭示了栈操作的过程。

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

1. 预备知识:Debug的使用

(1)关于D命令

之前的实验中,我们知道D命令是用来查看内存单元的命令:d 段地址:偏移地址

我们又知道段地址是存放在寄存器中的,在D命令后直接给出段地址,debug在执行D命令时,会将段地址送入段寄存器中。因此D命令也提供了这样的一种方式:d 段寄存器:偏移地址:

-r ds
:1000
-d ds:0				//查看从1000:0开始的内存区间中的内容

-r ds
:1000
-d ds:10 18			//查看1000:10~1000:18中的内容

-d cs:0				//查看当前代码段中的指令代码

-d ss:0				//查看当前栈段中的内容
(2)在E、A、U命令中使用段寄存器
-r ds
:1000
-d ds:0				//查看从1000:0开始的内存区间中的内容

-r ds
:1000
-d ds:10 18			//查看1000:10~1000:18中的内容

-d cs:0				//查看当前代码段中的指令代码

-d ss:0				//查看当前栈段中的内容
(3)下一条指令执行了吗?


如图所示:

  • 执行完第一个T命令后,ax=2000,ss=073F,sp=00FD
  • 执行完第二个T命令后,ax=2000,ss=2000,sp=0010

注意到这里的SP变了,但是应该是在执行第三次T命令后,SP的值才会改变。也就说,执行完第二个T命令后,MOV SP,0010命令紧接着就被运行了。

这主要是因为中断机制,这是后面章节的重要内容,这里并不展开。现在只要记住:T命令在执行修改栈段寄存器SS的指令时,下一条命令也紧接着被执行。

实验任务

(1)

写入以下命令:

逐条执行后,根据实际情况填写(红色字体为所填内容):
开始执行:

  1. 起始各寄存器的状态:
  2. mov ax,[0] ax=C0EA
  3. add ax,[2] ax=C0FC
  4. mov bx,[4] bx=30F0


5. add bx,[6] bx=6021

6. push ax sp=00FE,修改的内存单元(两个内存单元,称为字单元。下同)的地址是:2200:00FE,内容是:C0FC

7. push bx sp=00FC,修改的内存单元的地址是:2200:00FC,内容是:6021

8. pop ax sp=00FE ax=6021

9. pop bx sp=0100 bx=C0FC

10. push [4] sp=00FE,修改的内存单元的地址是:2200:00FE,内容是:30F0

11. push [6] sp=00FC,修改的内存单元的地址是:2200:00FC,内容是:2F31

(2)为什么2000:0~2000:f中的内容会发生改变?


输出结果显示,靠近栈顶的几个字单元存储了CS:IP的值。
猜测: 定义栈段时,对运行环境进行了暂存。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_Mercurial

请我喝杯焦糖玛奇朵叭

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

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

打赏作者

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

抵扣说明:

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

余额充值