Frage

Ich folge dieses Tutorial auf x86-Assembler. Jedes Beispiel bisher verwendet, was der Autor ein „c-Fahrer“ Programm aufruft, mit dem Montagemodul zusammengestellt, für mittels einiger „Initialisierung“. So etwas wie:

int main(void) {
  int ret = asm_main();
  return ret;
}

Und dann wird die asm_main Funktion normalerweise geschrieben, eine C-Aufrufkonvention. Ich frage mich, was genau ist die erforderliche Initialisierung, die von dem C-Compiler generiert werden ist, und wenn es in einem tragbaren Weise durchgeführt werden.

Infos:. Ich bin auf Windows XP, 32-Bit-Feld, mit dem NASM Assembler und mingw32-gcc für die Verknüpfung von

War es hilfreich?

Lösung

Die Initialisierung nicht durch den C-Compiler erzeugt wird, ist es ein Teil der C-Bibliothek ist (die für jedes OS / Prozessor es einfacher zu schneidern macht).

Der betreffende Code ist in der Regel sehr einfach auf Windows / Unixy Systeme - hat typischerweise ein bisschen Bibliothek Initialisierung (öffnet STDIN, STDOUT, STDERR, Sätze Zeitzone usw.), setzt auf die Umwelt, verarbeitet die Befehlszeile Haupt für das Bestehen ; fängt die Rückkehr von main () und Anrufe beenden etc.

Der Start-up-Code in den meisten C-Bibliotheken ist in einer Datei namens crt0.c, crt1.c oder etwas ähnliches (crt = c Laufzeit).

Auf primitiven oder nackte Systemen wird es auch den Stapel und andere Register einzurichten und den BSS-Datenbereich löschen -. In diesem Fall ist es oft in Assembler wäre (in der Regel crt0.S)

Hier ist ein Link auf die Startup-Code BSD c - Link text

Und der Start-up-Code für mingw für Fenster ist in crt1.c hier - http://mingw.cvs.sourceforge.net/viewvc/mingw/runtime/

Andere Tipps

Sie können Ihre Haupt in Schreibanordnung, wenn Sie wollen. Aber viele Menschen wollen in der Hauptdebugging-Anweisungen setzen und die sind leichter in C als in asm.

Wenn Sie in asm Haupt schrieben könnten Sie Haupt mit tatsächlich genannt _main werden oder unter Verwendung eine alternative Aufrufkonvention (insbesondere unter Windows) oder anderen merkwürdigen Dingen so, dass die C-Compiler Griffe für Sie zu tun haben automatisch, wenn der Code für ein Erzeugen Funktion mit dem Namen „main“. Auf diese Weise macht es so, dass entweder nicht tun.

Das Stapel, Register und Datei des Programmabschnitt (Daten, Rodata, bss, usw.) hat vor dem Haupt initialisiert werden () aufgerufen wird. C-Laufzeitbibliothek (CRT) stellt diese initialzsation.

CRT stellt auch Prolog und Epilog-Code, der vor und nach jeder Funktion ausgeführt wird aufgerufen wird. Der Prolog und Epilog-Code aktualisiert den Stapel und Rahmenzeiger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top