在GCC中内联asm,通过表达式指定偏移量

时间:2016-01-21 18:06:47

标签: c gcc mingw inline-assembly

不完全确定如何标题,但是 我想模仿这段代码:

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

但我想在C

中可变地指定偏移量

尝试:

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

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

错误为bad memory operand '%eax'

1 个答案:

答案 0 :(得分:2)

对于您编写的内容,编译器会将第一个操作数转换为%fs:%eax,因为它会选择%eax作为保存mee值的寄存器。我认为您尝试使用的寻址模式是 base offset ,偏移量必须是而不是寄存器。这是错误“坏内存操作数”的原因。它适用于%fs:0x30案例,因为0x30是一个直接值。

要将寄存器%eax用作偏移量,请尝试取消引用它%%fs:(%1)以获取寄存器中的值

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

另请参阅this guide,其中包含内联汇编中内存访问的一些可能有用的示例(及更多)。