未定义参考C ++变量ASM code [英] Undefined reference to C++ variables in ASM code

查看:254
本文介绍了未定义参考C ++变量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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆