2015-04-22 2 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 

Когда я запустил исполняемый файл, у меня возникла ошибка сегментации (сброс ядра). Итак, моим следующим инстинктом было передать его в 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 не держит строку (указатель на символ), поэтому вы не можете печатать его так. Он содержит 4 символа, поэтому что-то вроде этого работает лучше:

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

К сожалению, это не совсем устранило проблему (спасибо за советы), может ли это быть проблемой на стороне C++? Большое спасибо за Вашу помощь. – Pnelego

+0

@Pnelego см. Обновление. – Jester

+0

Это исправило все, спасибо за вашу помощь. (Я не могу поверить, что я этого не видел). – Pnelego