Mein nächstes Problem ist wirklich, wie kompiliere ich diese Ausgabe und kann ich GCC dazu bringen, dies für mich zu tun?
Ja, Sie können gcc verwenden, um Ihren asm-Code zu kompilieren. Verwenden Sie -c für die Kompilierung wie folgt:
gcc -c file.S -o file.o
Dies ergibt eine Objektcodedatei mit dem Namen file.o. Um den Linker aufzurufen, führen Sie nach dem obigen Befehl Folgendes aus:
gcc file.o -o file
kannst du auch einfach verwenden gcc file.S -o file
– Breno Leitão
9. September 2015 um 15:46 Uhr
was ist mit “> as -o hello.o hello.s” ? Wie angegeben durch www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html. Scheint so, als ob die Reihenfolge des Prozesses die Vorverarbeitung ist (.i-Datei), kompilieren (.s-Datei), Assemblieren (.o-Datei) und Verlinkung (.exe-Datei).
– Benutzer1677716
15. Juni 2016 um 13:50 Uhr
@ user1677716: Ja, das ist was gcc -c läuft, wenn du ihm a gibst .s Datei. Sie können verwenden gcc -v um die Befehle zu sehen, die es ausführt, z gcc -v -c foo.s oder gcc -v foo.s montieren und verlinken. Der Verknüpfungsteil ist komplexer als nur ld foo.o; es muss mit CRT-Startcode und Bibliotheken einschließlich libc (-lc).
– Peter Cordes
29. Juli 2020 um 22:21 Uhr
gcc kann eine Assemblydatei als Eingabe verwenden und den Assembler nach Bedarf aufrufen. Es gibt jedoch eine Feinheit:
Wenn der Dateiname mit „.s” (kleines ‘s’), dann gcc ruft den Assembler.
Wenn der Dateiname mit „.S” (großes ‘S’), dann gcc wendet den C-Präprozessor auf die Quelldatei an (d. h. er erkennt Direktiven wie z #if und ersetzt Makros) und dann ruft den Assembler für das Ergebnis auf.
Im Allgemeinen möchten Sie also Folgendes tun:
gcc -S file.c -o file.s
gcc -c file.s
Das sieht so aus, als ob es funktioniert, aber ich erhalte eine Fehlermeldung: ‘Malformed Mach-o file’
– Martin Kristiansen
25. August 2011 um 12:44 Uhr
Ich denke, Sie müssen die verwenden .S Präfix (Großbuchstaben), sonst erkennt gcc einen anderen Dateityp (fehlgeschlagen mit .asm zum Beispiel)
– Jean-Francois Fabre ♦
6. März 2017 um 14:29 Uhr
Sie können den Assembler-Code in ein normales C-Programm einbetten. Hier ist eine gute Einleitung. Mit der entsprechenden Syntax können Sie GCC auch mitteilen, dass Sie mit in C deklarierten Variablen interagieren möchten. Das folgende Programm weist gcc an, dass:
eax soll foo sein
ebx soll bar sein
der Wert in eax soll in foo gespeichert werden, nachdem der Assembler-Code ausgeführt wurde
\n
int main(void)
{
int foo = 10, bar = 15;
__asm__ __volatile__("addl %%ebx,%%eax"
:"=a"(foo)
:"a"(foo), "b"(bar)
);
printf("foo+bar=%d\n", foo);
return 0;
}
Ja, gcc kann auch Assembly-Quellcode kompilieren. Alternativ können Sie aufrufen as, das ist der Assembler. (gcc ist nur ein “Treiber”-Programm, das Heuristik verwendet, um C-Compiler, C++-Compiler, Assembler, Linker usw. aufzurufen.)
Sie können GAS verwenden, den Backend-Assembler von gcc:
Dies ist eine ziemlich kurze Antwort. Könnten Sie bitte eine Erklärung hinzufügen? Vielleicht können Sie uns sagen, was die Parameter bewirken und was Sie im Vergleich zu den anderen Antworten anders machen.
– GameDroids
10. November 2014 um 13:42 Uhr
GCC generiert keine NASM-Syntax, es generiert GAS mit AT&T oder .intel_syntax noprefix. Es gibt keine Kombination aus GCC- und NASM-Optionen, mit der Sie C mit GCC zu asm kompilieren und es dann mit NASM assemblieren können.
– Peter Cordes
29. Juli 2020 um 22:18 Uhr
14187100cookie-checkWie kompiliere ich das von GCC generierte asm?yes