c++ - ASM 代码中对 C++ 变量的 undefined reference

标签 c++ gcc assembly compiler-errors

<分区>

我正在尝试在 C++ 文件中编译以下 asm 代码,但好像 GCC 找不到 asm 部分中使用的变量。

DWORD d_eaxSave, d_ebxSave, d_ecxSave, d_edxSave, d_esiSave, d_ediSave, d_espSave, d_ebpSave;

#define ASM_UNPREFIXED_INTEL_START ".intel_syntax noprefix\n\t"
#define SAVE_REGISTERS() __asm__ (ASM_UNPREFIXED_INTEL_START    \
                              "mov d_eaxSave, eax\n\t"      \
                              "mov d_ebxSave, ebx\n\t"      \
                              "mov d_ecxSave, ecx\n\t"      \
                              "mov d_edxSave, edx\n\t"      \
                              "mov d_esiSave, esi\n\t"      \
                              "mov d_ediSave, edi\n\t"      \
                              "mov d_espSave, esp\n\t"      \
                              "mov d_ebpSave, ebp");

但是当我尝试编译时,GCC 给我以下错误:

undefined reference to `d_eaxSave'
undefined reference to `d_ebxSave'
undefined reference to `d_ecxSave'
undefined reference to `d_edxSave'
undefined reference to `d_esiSave'
undefined reference to `d_ediSave'
undefined reference to `d_espSave'
undefined reference to `d_ebpSave'

请问我该怎么做才能消除这些错误?

最佳答案

您通常希望使用 AT&T 语法,因为据我所知,GCC 无法发出正确的 intel syntax in inline assembler没有用于所有内容的 -masm=intel 命令行开关 - 我假设您不能包含将使用 AT&T 内联汇编的任何头文件。

因此:

DWORD d_eaxSave, d_ebxSave, d_ecxSave, d_edxSave, d_esiSave, d_ediSave, d_espSave, d_ebpSave;

#define SAVE_REGISTERS() __asm__ __volatile__(         \
     "movl %%eax, %0\n\t"      \
     "movl %%ebx, %1\n\t"      \
     "movl %%ecx, %2\n\t"      \
     "movl %%edx, %3\n\t"      \
     "movl %%esi, %4\n\t"      \
     "movl %%edi, %5\n\t"      \
     "movl %%esp, %6\n\t"      \
     "movl %%ebp, %7":         \
     "=m"(d_eaxSave), "=m"(d_ebxSave), "=m"(d_ecxSave), "=m"(d_edxSave),  \
     "=m"(d_esiSave), "=m"(d_ediSave), "=m"(d_espSave), "=m"(d_ebpSave)   \
)

汇编程序可能不存在这些符号,因此您需要通过输出参数使用它们! 另请注意,通常您会希望使用 __volatile__ 来确保汇编程序 block 未被优化掉。

关于c++ - ASM 代码中对 C++ 变量的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25041658/

相关文章:

c++ - 同时执行 if 和 else 条件的逻辑是什么

c - 链接器警告,将 .stack 节的开头更改 4 个字节

GCC 中的 C++ 模板

assembly - x86-64 GAS Intel 语法中的 RIP 相关变量引用(如 "[RIP + _a]")如何工作?

assembly - x86 函数必须保留哪些寄存器?

assembly - MASM 不会插入带有某些 CPU 和 FPU 指令组合的 x87 WAIT 前缀

c++ - Boost.Asio deadline_timer 没有按预期工作

c++ - 编程策略 : how to use pointers or reference to increase speed or decrease memory use?

java - 适用于 Android 的 C++ 或 Java?

linux - netinet/sctp.h : No such file or directory