【问题标题】:Inline asm in GCC, specifying offset by expressionGCC 中的内联 asm,通过表达式指定偏移量
【发布时间】:2016-01-21 18:06:47
【问题描述】:

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

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

但我想在 C 中可变地指定偏移量

尝试:

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

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

错误是bad memory operand '%eax'

【问题讨论】:

    标签: c gcc mingw inline-assembly


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-19
      • 2011-10-12
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多