Ich versuche, x86-Assembler zu lernen, und ich möchte eine NASM Funktion in C aufrufen. Wenn ich mein Programm laufen bekomme ich diesen Fehler:Aufruf der NASM-Funktion in C
Segmentation fault (Core dumped)
Ich habe versucht, Dutzende von Variationen meiner einfachen Testfunktion, aber es stoppt Position jedes Mal an der gleichen.
Hier sind meine asm
und c
Dateien:
div.asm:
global _test
_test:
push ebp
mov ebp, esp
push ebx
mov eax, [ebp+8]
mov ebx, [ebp+12]
div ebx
pop ebp
ret
main.c:
#include <stdio.h>
extern unsigned int test (unsigned int, unsigned int);
int main(void)
{
printf("%d\n", div(85,5));
return 0;
}
ich kompilieren & Link, um die Dateien mit:
nasm -f elf -o div.o div.asm
gcc -m32 -c -o main.o main.c
gcc -m32 -o run div.o main.o
Ich verwende eine 64 Bit Linux
in einer Virtual Machine
.
Was ist mein Fehler hier, und wie kann ich es beheben?
Versuchte Debuggen? – arrowd
Verwenden Sie einen Debugger, um herauszufinden, welche Fehler es gibt. Siehe [der FAQ-Bereich des x86-Tag-Wikis] (http://stackoverflow.com/tags/x86/info), du hast ein paar von ihnen: nicht übereinstimmendes Push/Pop und ein "div" -Problem. –
Oh guter Punkt, yeah, Linux nicht Namen mit einem führenden '_'. Die "Test" -Funktion, die Sie aufrufen, ist nicht einmal die '_test'-Funktion, die Sie zusammengefügt haben! Da es verlinkt, muss das Symbol in einer Bibliothek existieren, denke ich? Wieder Debugger FTW. Kompiliere mit '-g'. Wie 'gcc -m32 -Wall -Wextra -Og -g main.c div.o -o run' –