【发布时间】:2013-09-17 19:18:06
【问题描述】:
无论如何我可以将 c 指针加载到像 eax 这样的特定寄存器中吗?我想获取一个数组,比如 int array[10],并将数组(或 &array[0],但无论哪种方式它们都是同一件事)加载到寄存器 eax 中。
【问题讨论】:
-
你使用哪个编译器?
标签: c pointers assembly cpu-registers
无论如何我可以将 c 指针加载到像 eax 这样的特定寄存器中吗?我想获取一个数组,比如 int array[10],并将数组(或 &array[0],但无论哪种方式它们都是同一件事)加载到寄存器 eax 中。
【问题讨论】:
标签: c pointers assembly cpu-registers
这取决于编译器。 Gcc 对 register 关键字进行了扩展
register unsigned* p __asm__("eax") = a;
【讨论】:
p,如本例所示,无需初始化,并将其值分配给您想要的任何值。 p 和 eax 寄存器是一样的。
是的,如果寄存器位置可以访问,您可以将 C 指针存储到寄存器中。并且寄存器大小足以存储指针值。指针大小因不同处理器而异。检查大小,然后尝试。
如果寄存器是字节可访问的,则直接将指针的值放在字节位置。如果位可访问,那么您需要移位,然后需要存储溢出。
【讨论】:
您可以使用内联汇编,可以通过__asm/__asm__ 关键字定义(MSVC/GCC),但它不是可移植的方式。
例如:
int arr[10];
__asm { mov eax, DWORD PTR arr }
注意:现代 x64 编译器禁止使用内联汇编
你也可以使用register关键字,但不保证编译器会准确地将指针放在eax寄存器中
【讨论】: