2015-04-22 57 views
1

所以我想链接一个简单的程序集与C++,到目前为止没有运气。链接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 

我该如何解决这个问题?先谢谢你。

回答

2

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

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

而且,把代码放到.data部分是不是最好的主意;)

此外,ebx不成立的字符串(一个指向char的指针),所以你不能像这样打印它。它拥有4个字符,所以这样的效果更好:(的提示虽然感谢)在C++

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

可悲的是,这并没有完全解决这个问题会不会是一个问题,这方面的看法?非常感谢你的帮助。 – Pnelego

+0

@Pnelego查看更新。 – Jester

+0

修复了一切,谢谢你的帮助。 (我不相信我没有看到)。 – Pnelego