不完全确定如何标题,但是 我想模仿这段代码:
asm("movl %%fs:0x30, %0" : "=r" (peb) : : );
但我想在C
中可变地指定偏移量尝试:
int mee = 48;
asm("movl %%fs:%1, %0"
: "=r" (peb)
: "r" (mee)
:
);
错误为bad memory operand '%eax'
答案 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,其中包含内联汇编中内存访问的一些可能有用的示例(及更多)。