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,其中包含一些可能对内联汇编中的内存访问(以及更多)有用的示例。
不太确定如何命名这个标题,但是 我想模拟这段代码:
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,其中包含一些可能对内联汇编中的内存访问(以及更多)有用的示例。