将AT& T语法转换为英特尔语法(ASM)

时间:2014-02-23 20:40:54

标签: 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

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

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