Im Rahmen meiner Wiederbeschäftigung mit Assembler
Ich habe festgestellt, dass in dem Assembler-Lehrbuch Programme mit Fehlern enthalten sind, siehe Bild.
Hat sich jemand in letzter Zeit mit Assembler unter (debian-)linux befasst?
Ich würde aus dem Gedächtnis schöpfen, dazu bräuchte ich aber einen "Rahmen" für ein funktionierendes Programm.
Damit Ihr keinen Augenkrebs kriegt, Auschnitt aus der Fehlermeldung: "Undefined reference to ´main
Rahmen für Assembler-Programm
-
- Beiträge: 1981
- Registriert: 16.08.2005 18:15:29
- Lizenz eigener Beiträge: GNU General Public License
- Wohnort: münchen
Rahmen für Assembler-Programm
Es gibt viele Foren und eine Welt ausserhalb
- Livingston
- Beiträge: 1816
- Registriert: 04.02.2007 22:52:25
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: 127.0.0.1
Re: Rahmen für Assembler-Programm
Sieht ganz danach aus, als fehlten dem Linker ein paar Informationen, was er mit dem assemblierten Object-Code machen soll.
Generell erzeugt der Assembler nicht aus dem Stand heraus lauffähigen Code, sondern Object-Code, der ein wenig Unterstützung vom Linker ld erhält. Das ist notwendig, weil das Betriebssystem Dein Programm irgendwohin lädt und der Linker nun sämtliche Adressen innerhalb Deines Programms auf die realen Speicherorte anpassen muss.
Das fängt schon mal damit an, dass er wissen muss, wo der Startpunkt Deines Programms liegt. Nur weil Du etwas "_start" genannt und es global zugänglich gemacht hast, heißt das nicht, dass der Linker die richtigen Schlüsse zieht. Ihm muss das Symbol "_start" als tatsächlicher Startpunkt bekannt gemacht werden.
Ich würde an Deiner Stelle erst mal auf sasm verzichten, damit Du die Basics auf der Kommandozeile lernen kannst. Ich halte das für wichtig, damit Du weißt, was sasm im Hintergrund für Dich tut, und damit Du sasm die notwendigen Einstellungen verpassen kannst. Also erst mal Deinen Code mit nasm assemblieren, und wenn das fehlerfrei klappt, das File, das dabei herauskommt, mit ld bearbeiten.
Leider gibt's keinen einfacheren Weg. Ein wenig Hintergrundinfos musst Du Dir anlesen. Keine Ahnung, warum Dein Buch auf diese Fallstricke nicht eingeht. Tipps gab's ja schon in dem anderen Thread, den Du zum Assembler aufgemacht hast.
Generell erzeugt der Assembler nicht aus dem Stand heraus lauffähigen Code, sondern Object-Code, der ein wenig Unterstützung vom Linker ld erhält. Das ist notwendig, weil das Betriebssystem Dein Programm irgendwohin lädt und der Linker nun sämtliche Adressen innerhalb Deines Programms auf die realen Speicherorte anpassen muss.
Das fängt schon mal damit an, dass er wissen muss, wo der Startpunkt Deines Programms liegt. Nur weil Du etwas "_start" genannt und es global zugänglich gemacht hast, heißt das nicht, dass der Linker die richtigen Schlüsse zieht. Ihm muss das Symbol "_start" als tatsächlicher Startpunkt bekannt gemacht werden.
Ich würde an Deiner Stelle erst mal auf sasm verzichten, damit Du die Basics auf der Kommandozeile lernen kannst. Ich halte das für wichtig, damit Du weißt, was sasm im Hintergrund für Dich tut, und damit Du sasm die notwendigen Einstellungen verpassen kannst. Also erst mal Deinen Code mit nasm assemblieren, und wenn das fehlerfrei klappt, das File, das dabei herauskommt, mit ld bearbeiten.
Leider gibt's keinen einfacheren Weg. Ein wenig Hintergrundinfos musst Du Dir anlesen. Keine Ahnung, warum Dein Buch auf diese Fallstricke nicht eingeht. Tipps gab's ja schon in dem anderen Thread, den Du zum Assembler aufgemacht hast.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams
Douglas Adams
-
- Beiträge: 1981
- Registriert: 16.08.2005 18:15:29
- Lizenz eigener Beiträge: GNU General Public License
- Wohnort: münchen
Re: Rahmen für Assembler-Programm
Dass Programme gelinkt werden hatte "fast" schon vergessen.
Mit ganz komplizierten Make-Files bzw. Aufrufefn mag ich ehrlich gesagt nicht mehr arbeiten,
liegt wohl daran, dass ich mit Turbo-Pascal sozialisiert worden bin und dass gcc, g++ ja ganz "einfach" kompilieren.
Ich hab mittlerweile eine "default.asm" gefunden, wenn ich die Beispiel-Programme da einbaue werden die Beispiel-Programme ausgeführt,
Nur der Debugger funktioniert leider nicht.
Mit einem printf kann leider unterwegs keine Werte zum Verständnis anzeigen.
Mit ganz komplizierten Make-Files bzw. Aufrufefn mag ich ehrlich gesagt nicht mehr arbeiten,
liegt wohl daran, dass ich mit Turbo-Pascal sozialisiert worden bin und dass gcc, g++ ja ganz "einfach" kompilieren.
Ich hab mittlerweile eine "default.asm" gefunden, wenn ich die Beispiel-Programme da einbaue werden die Beispiel-Programme ausgeführt,
Nur der Debugger funktioniert leider nicht.
Mit einem printf kann leider unterwegs keine Werte zum Verständnis anzeigen.
Es gibt viele Foren und eine Welt ausserhalb