【问题标题】:Store pointer in c in a specific register将 c 中的指针存储在特定寄存器中
【发布时间】:2013-09-17 19:18:06
【问题描述】:

无论如何我可以将 c 指针加载到像 eax 这样的特定寄存器中吗?我想获取一个数组,比如 int array[10],并将数组(或 &array[0],但无论哪种方式它们都是同一件事)加载到寄存器 eax 中。

【问题讨论】:

  • 你使用哪个编译器?

标签: c pointers assembly cpu-registers


【解决方案1】:

这取决于编译器。 Gcc 对 register 关键字进行了扩展

register unsigned* p __asm__("eax") = a;

【讨论】:

  • 这正是我想要的!我正在使用 GCC,所以这很完美。另外,有没有办法将寄存器值存储在 c 变量中?就像抓取 eax 的值并将其放入某个非寄存器 c 变量中?
  • 只使用变量p,如本例所示,无需初始化,并将其值分配给您想要的任何值。 peax 寄存器是一样的。
【解决方案2】:

是的,如果寄存器位置可以访问,您可以将 C 指针存储到寄存器中。并且寄存器大小足以存储指针值。指针大小因不同处理器而异。检查大小,然后尝试。

如果寄存器是字节可访问的,则直接将指针的值放在字节位置。如果位可访问,那么您需要移位,然后需要存储溢出。

【讨论】:

    【解决方案3】:
    1. 您可以使用内联汇编,可以通过__asm/__asm__ 关键字定义(MSVC/GCC),但它不是可移植的方式。 例如:

      int arr[10]; __asm { mov eax, DWORD PTR arr }

      注意:现代 x64 编译器禁止使用内联汇编

    2. 你也可以使用register关键字,但不保证编译器会准确地将指针放在eax寄存器中

    【讨论】:

      猜你喜欢
      • 2020-05-25
      • 2016-07-14
      • 2013-04-01
      • 2016-04-03
      • 2021-02-14
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      相关资源
      最近更新 更多