链接c+时出现分段错误+;和组装 我试图把一个简单的汇编脚本与C++连接,到目前为止没有运气。p>

链接c+时出现分段错误+;和组装 我试图把一个简单的汇编脚本与C++连接,到目前为止没有运气。p>,c++,assembly,C++,Assembly,汇编脚本 section .data global getebx getebx: mov eax, 0x0 cpuid mov eax, ebx ret c++ 当我运行可执行文件时,我得到了一个分段错误(内核转储)错误。所以我的下一个本能是把它带到gdb。以下是它返回的内容: program received signal SIGSEGV, Segmentation fault. 0xf7da0e86 in ?? () from /lib/i386-linux-gnu/lib

汇编脚本

section .data
global getebx


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

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

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

我如何解决这个问题?提前感谢。

呼叫约定要求您必须保留一些寄存器。在您的情况下,这适用于
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;
}
int main(){
无符号ebx=getebx();

STD::很遗憾,这并不能解决问题(谢谢你的提示),这是否是C++方面的问题?非常感谢你的帮助。这一切都是固定的,谢谢你的帮助。(我不敢相信我没看到)。
getebx:
push ebx
mov eax, 0x0
cpuid
mov eax, ebx
pop ebx
ret
int main (){
    unsigned ebx = getebx();
    std::cout << std::string((char*)&ebx, 4) << std::endl;
    return 0;
}