鱼C论坛

 找回密码
 立即注册
查看: 2997|回复: 3

为什么无论实际地址是多少,跳转指令中的转移位移都不变?

[复制链接]
发表于 2020-5-25 21:48:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
实际地址由段地址和偏移地址组成,而在跳转指令中转移位移又是偏移地址的组成部分,所以说转移位移应该会随着实际地址的改变而改变啊?

                               
登录/注册后可看大图

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-26 08:38:56 | 显示全部楼层
“实际地址由段地址和偏移地址组成”,偏移地址,是指代码在代码段内的偏移地址 或者 数据在数据段内的偏移地址 或者 堆栈在堆栈段内的偏移地址
而“在跳转指令中转移位移又是偏移地址的组成部分”,更准确的说法是叫“相对偏移”,具体怎么计算的看9.3节。
两个都有相对某个对象的偏移的概念,但是一点关系都没有,不要把它们混为一谈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 15:04:37 | 显示全部楼层
SВ 发表于 2020-5-26 08:38
“实际地址由段地址和偏移地址组成”,偏移地址,是指代码在代码段内的偏移地址 或者 数据在数据段内的偏移 ...

这个概念我知道,比如:
start:
; ...
loop start
next:

则loop start指令的编码为E2 xx,xx=offset start - offset next
可是我觉得如果start的地址改变了的话,loop的转移位移不也改变了吗?小甲鱼却说无论标号处地址是多少,loop指令的转移位移是不变的,就是这句话我理解不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-27 07:24:11 | 显示全部楼层
本帖最后由 3-3 于 2020-5-27 07:26 编辑
喜欢小黄花 发表于 2020-5-26 15:04
这个概念我知道,比如:
start:
; ...


loop转向的是相对偏移。一定要弄清相对地址与绝对地址的区别。
“start的地址变化”是指start的绝对地址发生了变化,在这样的情况样,Loop的绝对地址发生了变化,但loop start的相对地址没有变。
比如 开始start位于0x00000000,loop位于是0x0000010,这样loop start的话是向前跳转16个字节,变化后start位于0x10000000,此时loop位于0x10000010,这时候loop start的话依然是向前跳转16个字节。 loop与start位置之间的差值是没有发生变化的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 18:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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