为什么无论实际地址是多少,跳转指令中的转移位移都不变?
实际地址由段地址和偏移地址组成,而在跳转指令中转移位移又是偏移地址的组成部分,所以说转移位移应该会随着实际地址的改变而改变啊?http://tiebapic.baidu.com/forum/w%3D580/sign=acc2ecc9b3c27d1ea5263bcc2bd4adaf/179896eef01f3a2955088ba38e25bc315e607ce3.jpghttp://tiebapic.baidu.com/forum/w%3D580/sign=c8efa3a1d4cec3fd8b3ea77de689d4b6/3c23cc1b9d16fdfadeac9883a38f8c5496ee7be3.jpg “实际地址由段地址和偏移地址组成”,偏移地址,是指代码在代码段内的偏移地址 或者 数据在数据段内的偏移地址 或者 堆栈在堆栈段内的偏移地址
而“在跳转指令中转移位移又是偏移地址的组成部分”,更准确的说法是叫“相对偏移”,具体怎么计算的看9.3节。
两个都有相对某个对象的偏移的概念,但是一点关系都没有,不要把它们混为一谈。 SВ 发表于 2020-5-26 08:38
“实际地址由段地址和偏移地址组成”,偏移地址,是指代码在代码段内的偏移地址 或者 数据在数据段内的偏移 ...
这个概念我知道,比如:
start:
; ...
loop start
next:
则loop start指令的编码为E2 xx,xx=offset start - offset next
可是我觉得如果start的地址改变了的话,loop的转移位移不也改变了吗?小甲鱼却说无论标号处地址是多少,loop指令的转移位移是不变的,就是这句话我理解不了 本帖最后由 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位置之间的差值是没有发生变化的。
页:
[1]