gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:43:03 26 4
gpt4 key购买 nike

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

mov rdi, [0xdeadbeef]

但我对 AT&T 风格(或一般的组装)知之甚少。我搜索了它,但所有的例子都是关于 mov我得到的不包括这个。

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

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

最佳答案

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

mov edi, [0xdeadbeef] ; Intel
movl 0xdeadbeef, %edi ; AT&T

在 AT&T any literal that is not prefixed by $ is an address

但是在 x86_64 64-bit absolute addressing is not allowed ,所以你不能使用 movq 0xdeadbeef, %rdi像上面一样。唯一具有 64 位立即数的指令是 mov ( movabs in gas),它可以为任何寄存器分配一个 64 位常量,或 move value at a 64-bit absolute address to Areg
mov rax, [0xdeadbeef]   ; Intel
movabs 0xdeadbeef, %rax ; AT&T

如果您确实需要将值从 64 位绝对地址移动到不同于 Areg 的寄存器,您必须 use indirect addressing instead
mov rdi, 0xdeadbeef     ; Intel
mov rdi, [rdi]

movq $0xdeadbeef, %rdi ; AT&T
movq (%rdi), %rdi

或者,如果您希望将值同时复制到 rax 和 rdi,则
mov rax, [0xdeadbeef]   ; Intel
mov rdi, rax

movabs 0xdeadbeef, %rax ; AT&T
movq %rax, %rdi

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

In AT&T syntax the size of memory operands is determined from the last character of the instruction mnemonic. Mnemonic suffixes of b, w, l and q specify byte (8-bit), word (16-bit), long (32-bit) and quadruple word (64-bit) memory references. Intel syntax accomplishes this by prefixing memory operands (not the instruction mnemonics) with byte ptr, word ptr, dword ptr and qword ptr. Thus, Intel mov al, byte ptr foo is movb foo, %al in AT&T syntax.

In 64-bit code, movabs can be used to encode the mov instruction with the 64-bit displacement or immediate operand.

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

关于assembly - 如何将内存中某个地址的值复制到 gcc AT&T 风格的寄存器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19484649/

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