《汇编语言(第三版)》王爽,实验八

本文探讨了一段特定的程序代码,在不修改跳转指令的情况下简单复制机器代码可能导致的不可预期行为。通过分析一个具体例子,解释了为什么程序能够意外地正确结束。

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

分析下面的程序,在运行前思考:这个程序可以正确返回吗?

运行后再思考:为什么是这种结果?

通过这个程序加深对相关内容的理解。

assume cs:code

 

 

code segment

    mov ax,4c00h

    int 21h

start:

    mov ax,0

s:  nop

    nop

   

    mov di,offset s

    mov si,offset s2

    mov ax,cs:[si]

    mov cs:[di],ax

   

s0: jmp short s

 

s1: mov ax,0

    int 21h

    mov ax,0

   

s2: jmp short s1

    nop          

                           

code ends

end start

该程序可以正确返回,原因如下:

(s2的机器语言表示为上图中的蓝色高亮部分)

(s2复制到s的代码的机器语言表示为上图中的蓝色高亮部分)

由截图可以看出,s2原本的机器码为:

07116: EB 235 ?

07117: F0 240 ?

而复制到s处的机器码也为

07116: EB 235 ?

07117: F0 240 ?

而jmp等转移指令又是先将转移的目的地址和转移指令地址的后一位地址做差,然后将差值的补码放入机器代码中,所以一味的复制机器代码而不修改其中跳转指令所需要的值,会对程序产生不可预料的后果,就如同本题一样,原本应该跳转到s1的代码却跳转到了

mov ax,4c00h

int 21h

里面,但是却很幸运地正常结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值