c++ - 将 AT&T 语法转换为 Intel 语法 (ASM)

标签 c++ gcc assembly inline-assembly

我一直在尝试访问可执行文件的 peb 信息,如下所示:Access x64 TEB C++ & Assembly

由于某些奇怪的原因,该代码仅适用于 AT&T 语法,但当我尝试使用 Intel 语法时,它无法给出相同的值。当然,这其中有我的错误。所以我才问..

如何转换:

int main()
{
    void* ptr = 0; //0x7fff5c4ff3c0
    asm volatile
    (
        "movq %%gs:0x30, %%rax\n\t"
        "movq 0x60(%%rax), %%rax\n\t"
        "movq 0x18(%%rax), %%rax\n\t"
        "movq %%rax, %0\n"
        : "=r" (ptr) ::
    );
}

到英特尔语法?

我尝试过:

asm volatile
(
    "movq rax, gs:[0x30]\n\t"
    "movq rax, [rax + 0x60]\n\t"
    "movq rax, [rax + 0x18]\n\t"
    "movq rax, %0\n"
    : "=r" (ptr) ::
);

和:

asm volatile
(
    "mov rax, QWORD PTR gs:[0x30]\n\t"
    "mov rax, QWORD PTR [rax + 0x60]\n\t"
    "mov rax, QWORD PTR [rax + 0x18]\n\t"
    "movq rax, %0\n"                     //mov rax, QWORD PTR [%0]\n
    : "=r" (ptr) ::
);

它们不会打印与 AT&T 语法相同的值:0x7fff5c4ff3c0

有什么想法吗?

最佳答案

您忘记在最后一行反转操作数顺序。也就是说,由于 gs 段覆盖,您在 asm 中需要的唯一指令是第一个指令,其余指令可以在 C 中完成。

关于c++ - 将 AT&T 语法转换为 Intel 语法 (ASM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21974224/

相关文章:

c++ - 在 C++ 中创建可变数量的 vector

c - 为什么 read() 返回不正确的字节数?

assembly - ARM 并行指令 ASX 和 SAX 的用途?

mysql - 使用gcc的C代码无法链接到mysql头?

c - 为什么编译器认为 GCC 中嵌套函数(GNU 扩展)的地址为 "not constant"?

assembly - shl 指令抛出 'error A2070 : invalid instruction operands'

assembly - 如何找出逆向工程汇编中的第二个参数/寄存器?

c++:使用具有二进制函数的 boost 范围转换适配器

c++ - OpenGL glfwGetVideoMode 导致段错误

c++ - 如何从 boost::hana::tuple_t 中检索类型?