鱼C论坛

 找回密码
 立即注册
查看: 4120|回复: 6

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

[复制链接]
发表于 2013-2-3 22:55:53 | 显示全部楼层 |阅读模式
2鱼币
请问JMP指令中位移量是怎么计算的?比如以下代码:

  1. s:        inc ax

  2. jmp s0

  3. mov bx,3

  4. s0:        inc bx

  5. jmp s

  6. nop
复制代码

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

QQ截图20130203225143.png

最佳答案

查看完整内容

楼上已经回答的很详细了。 我再简化一下~~其实所谓的跳转(jmp)是以位移来决定的 一般位移量的计算方式为: jmp指令的下一指令的偏移地址-jmp要跳转到的标号内的第一个指令的偏移地址或两者调换一下相减(具体看jmp的跳转方向,位移量向上为负,向下为正) 推荐 复习一下 小甲鱼 汇编视频第九章的实验八。是一个经典的关于jmp指令位移量深入理解的例题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-3 22:55:54 | 显示全部楼层
楼上已经回答的很详细了。

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

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

推荐 复习一下 小甲鱼 汇编视频第九章的实验八。是一个经典的关于jmp指令位移量深入理解的例题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-4 02:38:27 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-2-4 11:57 编辑

  1. s:        inc ax
  2. jmp s0
  3. mov bx,3
  4. s0:        inc bx
  5. jmp s
  6. 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
以此类推出所有指令的地址
跟图一样


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

  2. 0001:   jmp s0

  3. 0003:  mov bx,3

  4. 0006:  s0: inc bx

  5. 0007    jmp s

  6. 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

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



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

mov bx,3

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


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

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



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

负数都是用补码表示的
就如图一样-9的补码是F7
其他以此类推
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-4 12:06:39 | 显示全部楼层

评分

参与人数 1鱼币 +3 收起 理由
メ㊣逆ご帅☆ + 3 不用谢。我讲的比较啰嗦了,SORRY(@﹏@)~ 下.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-4 12:07:50 | 显示全部楼层
刘金伟 发表于 2013-2-4 12:05
楼上已经回答的很详细了。

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

讲得很精辟,完全懂了!谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-4 12:32:46 | 显示全部楼层
讲得很精辟,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-5 10:04:18 | 显示全部楼层
,你帅讲的很细,完全理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-18 10:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表