gpt4 book ai didi

linux - 对寻址模式与 jmp 和 far jmp 的 AT&T 汇编语法感到困惑

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:23 27 4
gpt4 key购买 nike

在 AT&T 汇编语法中,文字值必须以 $ 符号为前缀

但是,在内存寻址中,文字值没有$ 符号

例如:

mov %eax, -100(%eax)

jmp 100 
jmp $100, $100

不同。

我的问题是为什么 $ 前缀如此困惑?

最佳答案

jmp 100 是跳转到绝对地址 100,就像 jmp my_label 是跳转到 my_label 处的代码一样。 EIP = 100 或 EIP = my_label 的地址。

(jmp 100 汇编成一个带有 R_386_PC32 重定位的 jmp rel32,要求链接器填写与 jmp 指令自身到绝对目标的地址。)

因此在 AT&T 语法中,您可以将 jmp x 视为 EIP 中的 LEA。

或者另一种理解方式是代码获取从指定的内存位置开始。立即数需要 $ 并没有多大意义,因为直接近距离跳转的机器编码使用的是相对位移,而不是绝对位移。 (http://felixcloutier.com/x86/JMP.html)。

此外,间接跳转使用不同的语法(jmp *%eax register indirect 或 jmp *(%edi, %ecx, 4) memory indirect),所以不需要立即与内存之间的区别。


但是跳是另一回事

jmp ptr16:32jmp m16:32 都在 32 位模式下可用,因此您需要区分 ljmp *(%edi ) 对比 ljmp $100, $100

直接远跳转(jmp far ptr16:32)确实将绝对段:偏移量编码到指令中,就像add $123, %eax 将立即编码进入指令。

关于linux - 对寻址模式与 jmp 和 far jmp 的 AT&T 汇编语法感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17690119/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com