链接c ++和程序集时出现分段错误

时间:2015-04-22 22:00:34

标签: c++ assembly

所以我试图将一个简单的汇编脚本与c ++链接起来,到目前为止还没有运气。

装配脚本

section .data
global getebx


getebx:
mov eax, 0x0
cpuid
mov eax, ebx
ret

C ++

#include <iostream>


extern "C" unsigned getebx();

int main (){

std::cout << (const char *)getebx()<< std::endl;
return 0;
}

构建我只是运行以下命令。

nasm -f elf32 cpuidtest.asm
g++ -m32 -g main.cc cpuidtest.o

当我运行可执行文件时,我收到了分段错误(Core dumped)错误。所以我的下一个本能是把它带到gdb。这是它返回的内容:

   program received signal SIGSEGV, Segmentation fault.
   0xf7da0e86 in ?? () from /lib/i386-linux-gnu/libc.so.6

如何解决此问题?提前谢谢。

1 个答案:

答案 0 :(得分:2)

调用约定要求您必须保留一些寄存器。在您的情况下,这适用于ebx。您应修改代码以保存和恢复该代码,例如:

getebx:
push ebx
mov eax, 0x0
cpuid
mov eax, ebx
pop ebx
ret

此外,将代码放入.data部分并不是最好的主意;)

此外,ebx不包含字符串(指向char的指针),因此您无法像这样打印它。它包含4个字符,因此这样的效果更好:

int main (){
    unsigned ebx = getebx();
    std::cout << std::string((char*)&ebx, 4) << std::endl;
    return 0;
}