Y喜东东J 发表于 2019-11-4 15:51:00

王爽9.9 根据位移进行转移的意义

书上的意义我没有看懂,有人能解释下 根据位移转移到底有什么意义啊,标号换位置了 位移自然也换了,那地址肯定也换了啊 两个都能正常跳转啊?想不明白。。。。。。

kikiatw 发表于 2019-11-4 17:44:54



看圖說故事. 這個跟機械碼有關係
JCXZ的機械碼是E3
第一行的機械碼E334, JCXZ 0058 是跳到58, 但是他的機械碼34並不是58,
這是因為它使用了根據位移進行轉移,
你會說這不是廢話嗎, 我就是不懂"根據位移進行轉移"
且聽我細細道來, 你看綠色的下標,
JCXZ的下一行位址是24
24 位移(OFFSET) 34 就是58
所以 E334這個機械碼翻譯成 JCXZ 0058

那麼我們在看下面紅色的地方,
JCXZ 0054 的機械碼是 E329
那就是說下一行指令 002B位移了29 就是這個JCXZ要跳轉的地方, 29+2B = 0054

其實呢, 機械碼會把直接數字直接顯示在機械碼中, 但是JMP/JCXZ....等等的跳轉指令, 它顯示在機械碼上的值, 就是位移值, 而不是直接跳轉的值
所以才說這是根據位移進行轉移, 後面的轉移就是JMP跳轉的意思



Equinox 发表于 2020-5-16 14:46:34

我的理解是,编译器在编译时并不知道系统会把这段程序放在内存中哪一段,所以跳转指令无法知道准确的跳转地址,所以只好用偏移的方式给出跳转地址

xie1234abc 发表于 2020-5-16 16:33:09

本帖最后由 xie1234abc 于 2020-5-16 16:42 编辑

比如:
1000:0100                EB02            jmp        0104
1000:0102                40                inc        ax
1000:0103                43                inc        bx
1000:0104                89D8           movax,bx

请看上面4条指令,第一条指令 EB02,02就是“位移”值。
CPU执行了EB02 后,就向下跳“02”,去执行“89D8”,就是这个意思。
页: [1]
查看完整版本: 王爽9.9 根据位移进行转移的意义