- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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:32
和 jmp 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/
我是一名优秀的程序员,十分优秀!