未定义参考C ++变量ASM code [英] Undefined reference to C++ variables in ASM code
问题描述
我试图编译下面一个C ++文件中ASM code,但它像GCC找不到在ASM部分使用的变量。
I'm trying to compile following asm code inside a C++ file, but it like GCC can't find the variables used in the asm part.
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给了我以下错误:
But when I try to compile, GCC gives me the following errors :
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'
我能做些什么来摆脱那些误差修改的吗?
What can I do to get rid of those erros, please ?
推荐答案
您想一般采用AT&amp; T公司的语法,因为据我所知,GCC不能正确发出<一个href=\"http://stackoverflow.com/questions/9347909/can-i-use-intel-syntax-of-x86-assembly-with-gcc\">intel语法内联汇编没有 -masm =英特尔
命令行开关的一切 - 我presume那么你就不能包含的任何头文件将使用AT&amp; T公司内联汇编
You want to generally use the AT&T syntax, because as far as I know, GCC cannot emit proper intel syntax in inline assembler without -masm=intel
command line switch for everything - I'd presume then you cannot include any header files that would use AT&T inline assembly.
因此:
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) \
)
符号可能不存在的汇编,所以你需要通过输出参数使用它们!
还要注意,通常你想使用 __ __波动
,以确保汇编块没有被优化掉。
The symbols might not exist for the assembler, so you need to use them via output parameters!
Note also, that generally you would want to use __volatile__
to make sure that the assembler block is not optimized away.
这篇关于未定义参考C ++变量ASM code的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!