因此,我试图将一个简单的汇编脚本与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
我该如何解决这个问题?先感谢您。
调用约定要求您必须保留一些寄存器。您的情况适用于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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句