ASM代码中对c++变量的未定义引用

Undefined reference to C++ variables in ASM code

本文关键字:未定义 引用 变量 c++ 代码 ASM      更新时间:2023-10-16

我试图在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 noprefixnt"
#define SAVE_REGISTERS() __asm__ (ASM_UNPREFIXED_INTEL_START    
                              "mov d_eaxSave, eaxnt"      
                              "mov d_ebxSave, ebxnt"      
                              "mov d_ecxSave, ecxnt"      
                              "mov d_edxSave, edxnt"      
                              "mov d_esiSave, esint"      
                              "mov d_ediSave, edint"      
                              "mov d_espSave, espnt"      
                              "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不能在没有-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, %0nt"      
     "movl %%ebx, %1nt"      
     "movl %%ecx, %2nt"      
     "movl %%edx, %3nt"      
     "movl %%esi, %4nt"      
     "movl %%edi, %5nt"      
     "movl %%esp, %6nt"      
     "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__来确保汇编程序块没有被优化掉。