在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/