汇编语言实验八-《汇编语言-王爽老师》

8、实验八

首先将程序编译连接,然后debug调试跟踪。

查看一下寄存器内容

在这里插入图片描述

发现IP的初始值为5,说明代码段前面还有其他内容(start前面的两条程序结束指令)。然后查看一下各个指令所占的内存空间

在这里插入图片描述

在这里插入图片描述

结合这个结果,对两个offset进行分析(不实际计算offset的值也不影响分析这个程序的结果)

在这里插入图片描述

其中 mov ax,cs:[si] 指令将 s2 标记处的第一条指令 jmp short s1 复制到 AX 中,并通过下一条指令 mov cs:[di],ax 将 AX 中内容即 s2 标记处的第一条指令 jmp short s1 复制到 s 标记处的前两个字节中,即覆盖了原有的两个 nop 指令。

可以暂时简单理解为程序代码发生了如下变化(实际有些区别,后面再说):

在这里插入图片描述

接下来逐步执行

在这里插入图片描述

两个占位指令 nop,起到占位作用。继续执行

在这里插入图片描述

从这里也能看到,两条 offset 指令以及随后的两条 mov 指令的目的是将后面 s2 标记处的指令复制到标记 s 处。继续执行。

在这里插入图片描述

可见执行完 jmp short s 后,下一条指令按照前面的分析来说,应该是执行 jmp short s1,可为什么程序显示的下一条指令为 jmp 0000,不是跳转到 s1 标记的地址处执行呢?

根据我们前面学习的知识,我们知道像 jmp short、jmp near ptr、jcxz、loop 等短转移指令,它们在执行时对 IP 的修改是根据转移目的地址和转移起始地址之间的位移来进行的。所以本程序中在 s2 标志处的 jmp 指令,它的作用就是把 IP 往回修改 8 个单位(-8,因为 s1 和 s2 之间的位移是 8)以便可以跳转到 s1 执行。所以将这条指令对应的机器码复制到 s 标记处时,执行时仍是将 IP 往回修改 8 个单位(-8),这样就会跳转到代码段最开始定义的两条程序结束语句,然后结束程序。

在这里插入图片描述

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陌兮_

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值