在AT&T汇编语法中,文字值必须以$符号作为前缀
但是,在内存寻址中,文本值没有$符号
例如:

mov %eax, -100(%eax)


jmp 100
jmp $100, $100

是不同的。
我的问题是,$前缀为何如此混乱?

最佳答案

问:我的问题是为什么前缀$如此混乱?
$prefix用于按原样加载/使用值。
例子:

 movl $5, %eax #copy value 5 to eax
 addl $10,%eax # add 10 + 5 and store result in eax

$5,$10是值(常量),不取自寄存器或内存等外部源
在内存寻址中,特别是“直接寻址模式”,我们希望使用存储在特定内存位置的值。
例子:
movl 20, %eax

以上将得到存储在内存位置20的值。
实际上,由于内存位置是用十六进制(0x00000000到0xfffffffff)来编号的,所以很难在指令中用十六进制来指定内存位置。所以我们给这个位置指定了一个符号
例子:
.section .data
mydata:
long 4

.section .text
.globl _start
_start
movl mydata, %eax

在上述代码中,mydata是给定存储值“4”的特定内存位置的符号表示。
我希望上面的话能澄清你的困惑。

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

10-12 23:21