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

Convert AT&T syntax to Intel Syntax (ASM)

本文关键字:语法 英特尔 ASM 转换 AT      更新时间:2023-10-16

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

由于某种奇怪的原因,该代码仅在AT&T语法中工作,但是当我尝试使用Intel语法时,它无法给出相同的值。当然,我有一个错误。所以我问..

如何转换:

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

到英特尔语法?

我试过了:

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

和:

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

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

有什么想法吗?

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