遒羽 发表于 2013-2-3 22:55:53

请教jmp指令位移量的计算问题

请问JMP指令中位移量是怎么计算的?比如以下代码:

s:      inc ax

jmp s0

mov bx,3

s0:      inc bx

jmp s

nop
对上图解释存在疑惑:1,为什么位移量以s和nop为两点,以‘mov bx,3’和‘s0:      inc bx’为两点?
2,或者说,计算位移量到底是以哪两个点来计算的??
谢谢!!

刘金伟 发表于 2013-2-3 22:55:54

楼上已经回答的很详细了。

我再简化一下~~其实所谓的跳转(jmp)是以位移来决定的

一般位移量的计算方式为:
jmp指令的下一指令的偏移地址-jmp要跳转到的标号内的第一个指令的偏移地址或两者调换一下相减(具体看jmp的跳转方向,位移量向上为负,向下为正)

推荐 复习一下 小甲鱼 汇编视频第九章的实验八。是一个经典的关于jmp指令位移量深入理解的例题

メ㊣逆ご帅☆ 发表于 2013-2-4 02:38:27

本帖最后由 メ㊣逆ご帅☆ 于 2013-2-4 11:57 编辑


s:      inc ax
jmp s0
mov bx,3
s0:      inc bx
jmp s
nop就以图上的来举例好了

由于各个指令的地址无法确定
我们地址都是假设的


首先我们推出各个指令的地址

假设标号s的指令inc ax所在的地址为0000 由于inc ax机器码为40占一个字节
所以下一个指令 jmp s0所在的地址向下推1,也就是0001
jmp s0的机器码EB03,占2个字节
所以下一个指令 mov bx,3所在的地址向下推1,也就是0003


mov bx,3占3个字节
所以下一个标号为s0的指令 inc bx所在的地址向下推6,也就是0006
以此类推出所有指令的地址
跟图一样


于是我们得出这样的
0000:s: inc ax

0001:   jmp s0

0003:mov bx,3

0006:s0: inc bx

0007    jmp s

0009   nop

接下来是你要看的重点,
位移,这个东西简单讲就是我们要跳过去的那个地方的地址
距离我们现在这个指令的地址有多远

举个例子:
jmp s0这个指令的所在地址是0001
它要跳去的指令时inc bx所在的地址是0006
它们的距离就是从jmp s0这个指令的尾部(屁股后面)到inc bx的头部
jmp s0这个指令的尾部是这个指令的结束(只占2个字节,所以结束是下2个字节),也就是0003
inc bx的头部也就是这个指令刚要开始,还没开始的地址,也就是mov bx,3的尾部,mov bx,3占3个字节
占0003 0004 0005 ,尾部就是0005

那么距离可以算出来了
00030004 0005
那么位移就是3



简单不用多想就是
JMP指令所在位置的地址同   要跳转地址    两个指令之间   的指令   所占的字节数就是 距离
也就是位移
jmp s0

mov bx,3

s0: inc bx
这两个指令中间夹着的mov bx,3
那么mov bx,3的指令所占字节数就是位移


上面绿色字体实在理解不了可以看白色字体
其实也无碍

不然也可以在问一些语言表达能力强的吧
我说的不太好。。 +_+



感谢楼下的补充:
那么我在补充一句好了
我们想上跳转位移量是负的

负数都是用补码表示的
就如图一样-9的补码是F7
其他以此类推

遒羽 发表于 2013-2-4 12:06:39

メ㊣逆ご帅☆ 发表于 2013-2-4 02:38 static/image/common/back.gif
就以图上的来举例好了

由于各个指令的地址无法确定


讲得很详细,解决我很大部分的疑惑!谢谢!

遒羽 发表于 2013-2-4 12:07:50

刘金伟 发表于 2013-2-4 12:05 static/image/common/back.gif
楼上已经回答的很详细了。

我再简化一下~~其实所谓的跳转(jmp)是以位移来决定的


讲得很精辟,完全懂了!谢谢!

穷山恶水出刁民 发表于 2013-2-4 12:32:46

讲得很精辟,

林之白狼 发表于 2013-2-5 10:04:18

{:5_91:},你帅讲的很细,完全理解了
页: [1]
查看完整版本: 请教jmp指令位移量的计算问题