2016-01-21 137 views
1

不能完全确定偏移如何标题这一点,但 想模仿这个代码:联汇编GCC中,指定由表达

asm("movl %%fs:0x30, %0" : "=r" (peb) : :); 

,但我想指定用C

可变偏移尝试:

int mee = 48; 
asm("movl %%fs:%1, %0" 

    : "=r" (peb) 
    : "r" (mee) 
    : 
    ); 

错误是bad memory operand '%eax'

回答

2

对于您写的内容,编译器会将第一个操作数转换为%fs:%eax,因为它选择%eax作为保存值为mee的值的寄存器。我认为你试图使用的寻址模式是基地偏移和偏移量必须是而不是寄存器。这是错误“内存操作数错误”的原因。它在%fs:0x30的情况下工作,因为0x30是立即值。

要使用寄存器%eax作为偏移,尝试它%%fs:(%1)一提领得到寄存器价值

 int mee = 48; 
     asm("movl %%fs:(%1), %0" : "=r" (peb) : "r" (mee) :); 

又见this guide,其中包含的内存访问一些可能有用的例子(内联汇编)。

+0

工作感谢您的解释 –