如何以 gcc AT&T 风格将内存中某个地址的值复制到寄存器

Gni*_*ohz 4 assembly x86-64 att

我想使用 AT&T 风格的汇编将内存中某个地址的值复制到寄存器。我知道这应该不难,我认为在英特尔风格中它是这样的:

mov rdi, [0xdeadbeef]
Run Code Online (Sandbox Code Playgroud)

但我对 AT&T 风格(或一般的组装)了解不多。我搜索了它,但我得到的所有例子mov都不包括这个。

那么谁能告诉我该指令是什么样的?

另外,在哪里可以找到 AT&T 风格的 x86_64 汇编指令的完整列表?

phu*_*clv 5

要将内存中某个地址的值复制到32 位模式下的寄存器,我们使用

mov edi, [0xdeadbeef] ; Intel
movl 0xdeadbeef, %edi ; AT&T
Run Code Online (Sandbox Code Playgroud)

在 AT&T 中,任何不带前缀的文字$都是地址

但在x86_64中不允许64位绝对寻址,所以你不能movq 0xdeadbeef, %rdi像上面那样使用。唯一具有 64 位立即数的指令是movmovabs在 Gas 中),它可以将64 位常量分配给任何寄存器,或将64 位绝对地址处的值移动到Areg

mov rax, [0xdeadbeef]   ; Intel
movabs 0xdeadbeef, %rax ; AT&T
Run Code Online (Sandbox Code Playgroud)

如果您确实需要将值从 64 位绝对地址移动到与 Areg 不同的寄存器,则必须使用间接寻址

mov rdi, 0xdeadbeef     ; Intel
mov rdi, [rdi]

movq $0xdeadbeef, %rdi  ; AT&T
movq (%rdi), %rdi
Run Code Online (Sandbox Code Playgroud)

或者如果您希望将值复制到 rax 和 rdi 那么

mov rax, [0xdeadbeef]   ; Intel
mov rdi, rax

movabs 0xdeadbeef, %rax ; AT&T
movq %rax, %rdi
Run Code Online (Sandbox Code Playgroud)

这里q后缀表示四字(64位)寄存器

在 AT&T 语法中,内存操作数的大小由指令助记符的最后一个字符确定。助记符后缀bwlq指定字节(8 位)、字(16 位)、长(32 位)和四字(64 位)内存引用。Intel 语法通过在内存操作数(不是指令助记符)前添加byte ptrword ptrdword ptr来实现此目的qword ptr。因此,Intelmov al, byte ptr foo采用movb foo, %alAT&T 语法。

在64位代码中,movabs可用于对mov具有64位位移或立即操作数的指令进行编码。

https://sourceware.org/binutils/docs/as/i386_002dVariations.html

有关 64 位mov指令的更多信息,请参见此处:Difference Between movq and movabsq in x86-64。正如您所看到的,没有从 32 位绝对地址移动到 64 位寄存器的版本,因此即使在地址适合 32 位(例如 0xdeadbeef)的极少数情况下,您仍然必须使用movabs Areg, moffs64


归档时间:

查看次数:

19310 次

最近记录:

3 年,6 月 前