【问题标题】:Segmentation Fault when linking c++ and assembly链接 C++ 和程序集时出现分段错误
【发布时间】:2015-04-22 22:00:34
【问题描述】:

所以我试图用 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

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

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

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

【问题讨论】:

    标签: c++ assembly


    【解决方案1】:

    调用约定要求您必须保留一些寄存器。在您的情况下,这适用于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;
    }
    

    【讨论】:

    • 遗憾的是,这并没有完全解决问题(尽管感谢您的提示),这可能是 c++ 方面的问题吗?非常感谢您的帮助。
    • 解决了所有问题,感谢您的帮助。 (我不敢相信我没有看到)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2015-03-20
    • 2013-09-13
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多