《汇编语言》读书笔记(4)——一个奇怪的程序

assume cs:codesg

codesg 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

 

codesg ends

end start

这个程序可以正常运行吗???

我们知道程序中:

mov di,offset s

mov si,offset s2

mov ax,cs:[si]

mov cs:[di],ax

四条指令的作用是将标号s2处的一条指令复制到标号s处。

这时我们应该关心所复制的语句"jmp short s1"对程序的影响:我们知道在段内直接短转移指令所对应的

机器码中,并不包含转移的目的地址,而包含的是转移的位移量(如对此概念还不太熟悉,请查看书中第

167页的内容)。也就是说,在源程序的编译过程中,编译器遇到段内直接短转移’[形如:jmp short

]时就会自动算出其要跳转的位移量,以便程序在执行段内直接短转移的指令时就根据位移量进行(

前或向后)跳转。通过调试中的U命令我们可以看到指令's2:jmp short s1'所对应的机器码是EBF6

F6h(-10d的补码)就是跳转的位移量[此位移量也可由指令's2:jmp short s1'处的偏移地址18h减去指

's2:jmp short s1'后一个字节的偏移地址22h得出]。这时我们就知道了其实复制到标号s处的指令所对

应的机器码就是EBF6(刚好取代两个nop所对应的机器码),它的作用就是将当前IP向前移动10个字节

当程序执行标号s0处的指令后,程序便跳到标号s处接着执行标号s处的指令。s处的指令的作用是向前

10字节,于是便跳到了代码中的第一条指令,继续执行后便实现了程序的正常返回  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值