GCC 中的内联汇编,通过表达式指定偏移量

Inline asm in GCC, specifying offset by expression

不太确定如何命名这个标题,但是 我想模拟这段代码:

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

但我想在 C

中可变地指定偏移量

正在尝试:

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

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

错误是bad memory operand '%eax'

对于您所写的内容,编译器将第一个操作数转换为 %fs:%eax,因为它选择 %eax 作为保存 mee 值的寄存器。我认为您尝试使用的寻址模式是 base:offset 并且偏移量必须是 value 而不是寄存器。这就是错误 "bad memory operand" 的原因。它适用于 %fs:0x30 情况,因为 0x30 是立即数。

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

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

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