2014-02-23 57 views
2

我一直在试图访问一个可执行的PEB信息在这里看到:Access x64 TEB C++ & Assembly转换AT&T语法英特尔语法(ASM)

的代码只能在AT & T语法一些奇怪的原因,但是当我尝试使用英特尔语法,但未能赋予相同的值。我当然有一个错误。所以我问..

我怎么能转换:

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

任何想法?

回答

4

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

+0

这解决了它,但是,为什么只有第一条指令?我会将这个答案标记为当它让我。 – Brandon

+1

@Cant因为剩下的指令只是执行指针算术和解引用。你不能在C中做什么。 – IInspectable

+0

另外请注意,你忘记告诉编译器你有clobber'rax'。 – Jester