跳转到_汇编语⾔跳转指令中跳转地址的计算
x86 指令集包含⼤量的条件跳转指令。它们能⽐较有符号和⽆符号整数,并根据单个 CPU 标志位的值来执⾏操作。条件跳转指令可以分为四个类型:
基于特定标志位的值跳转
基于两数是否相等,或是否等于(E)CX 的值跳转
基于⽆符号操作数的⽐较跳转
基于有符号操作数的⽐较跳转
本⽂以jmp跳转指令为例,说明跳转地址如何计算。
jmp short 标号(转到标号处执⾏指令)
这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。
段内转移,只修改IP,⽐如jmp ax段间转移,同时修改CS和IP,⽐如jmp 1000:200短转移,IP取值范围-
128-127, 8位近转移,IP取值范围-32768-32767,16位。
图⼀
上图是清华⼤学王爽⽼师编写的汇编语⾔教材中⼀个⽤于说明跳转地址计算的例⼦,这个例⼦在跳转地址的计算稍微有点复杂,下⾯对这个例⼦进⾏说明。
该程序的运⾏结果如图2所⽰。从图2可以看出,指令mov ax,4c00h;int 21h的作⽤仅仅是将IP指针指向了它们的下⼀条指令:
start:mov ax,0。
图⼆
利⽤反汇编指令,对上述程序得出图3。从图中可以看出,标号s1的物理地址是076A:0018H,标号s2的物理地址是076A:0020H,⽽指令s2:jmp short s1的指令机器码是EBF6,其中EB的意义是jmp,⽽F6则代表该指令的跳转距离。该距离值计算如下:当CPU将机器码EBF6读⼊以后,其IP指针的内容指向了下⼀条指令nop,其物理地址是076A:0022H,由该地址到标号s1的物理地址076A:0018H 的距离是10(⼗进制),由于是向上跳转,则其值取负值,⽽⼗进制-10的补码正是F6,其地址计算由0022H+F6H=0018H得出。
汇编语言跳转指令图三
从图3还可以看出,在076A:0008和076A:0009两个存储单元中存储的是两个NOP指令,其机器码都是90H,如图4所⽰。
图四
再对上述程序单步运⾏,当运⾏到指令mov cs:[di],ax时,如图5所⽰,
图五
图六
此时076A:0008和076A:0009两个存储单元中存储的内容变成了EBF6,如图6所⽰。继续单步运⾏指令s0:jmp short s,此时CS和IP 变为076A:0008H,然后CPU读⼊机器码EBF6,接着IP变为0010H,再按照前述的地址跳转计算⽅法,得出当机器码EBF6执⾏完成后,IP将变为0000H,因此接着将再次执⾏指令mov ax,4c00h;int 21h,当该指令再次执⾏完成以后,整个程序将跳出结束,如图7所⽰。由以上过程也可以看出,当指令mov ax,4c00h;int 21h放在程序开始的地⽅,其作⽤仅仅是将IP指针指向这条指令的下⼀条指令地址,⽽当这条指令在程序执⾏过程中被执⾏的时候,却将使得IP指针跳出整个程序。
图七
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论