Konsolenausgabe (8086)
-
Hallo!
Ich lerne gerade Assembler und komme damit nicht klar, wie man denn Zahlen oder Strings in der Konsole ausgeben kann.
Im Buch(Reine Backer) steht für die Ausgabe für Strings:
... ... mov dx, offset Meldung ;Meldung ist ein String mov ah,9 int 21h ... ...Dh. ich lade die effektive Speicheradresse meines Strings "Meldung" in das Daten-Register, schiebe den Wert 9 ins AH und mit int 21h soll das Betriebssystem nachsehen, was für ein "Befehl" im AH abgelegt ist und anhand dessen nimmt er dann die Adresse aus dem DX, geht dorthin und gibt alles bis zur Endbegrenzung in der Konsole aus. Richtig?
Wie aber gebe ich zB Ganzzahlen oder Gleitkommazahlen aus?
Wie lauten dafür die Befehle? In welche Register müssen sie rein. Und ins welche Register mit der Offset? Und welchen Interrupt nehm ich dafür?
-
eine Frage bitte schrieb:
Dh. ich lade die effektive Speicheradresse meines Strings "Meldung" in das Daten-Register, schiebe den Wert 9 ins AH und mit int 21h soll das Betriebssystem nachsehen, was für ein "Befehl" im AH abgelegt ist und anhand dessen nimmt er dann die Adresse aus dem DX, geht dorthin und gibt alles bis zur Endbegrenzung in der Konsole aus. Richtig?
Ja, so in etwa. Anders ausgedrueckt ruft der Befehl "int 21h" einfach eine Funktion des Betriebssystems (in diesem Fall DOS) auf, die in ah einen Index zur Auswahl einer Unterfunktion erwartet und je nach so gewaehlter Funktion eben evtl. weitere Parameter in anderen Registern.
eine Frage bitte schrieb:
Wie aber gebe ich zB Ganzzahlen oder Gleitkommazahlen aus?
Wie lauten dafür die Befehle? In welche Register müssen sie rein. Und ins welche Register mit der Offset? Und welchen Interrupt nehm ich dafür?DOS kann so etwas nicht, deshalb kannst du das nicht mit einem einfachen Interruptaufruf erledigen.
Alles was DOS ausgeben kann sind einzelne Zeichen oder eben so einen mit "$"-terminierten String - mehr nicht.
Dh. du musst erstmal selbst code haben (meint in Assembler idR. selbst schreiben), der deine Zahlen in Strings umwandelt.
Der Algorithmus dazu fuer Ganzzahlen ist dabei recht simpel und laeuft letztendlich eigentlich darauf hinaus, dass du deine Zahl so lange durch die Basis des Zahlensystems, in dem du deine Zahl darstellen willst, dividierst, bis der Quotient 0 ergibt. Den Rest jeder Division kannst du dann recht leicht mit einer kleinen Tabelle oder einfacher Addition in ein ASCII-Zeichen umwandeln.
-
Wenn ich das Ergebnis einer Multiplikation(positiv, ganzzhalig) auf dem Bildschirm ausgeben möchte, wie gehe ich denn dann vor?
Die Zahl 123 zB.: Ich zerlege 123 ind 1, 2, 3.
Und nun? Wie bringe ich dem Assembler bei, mir daraus einen String aus den ASCI-Zeichen 31,32,33 zu basteln?
-
Als naechstes brauchst du erstmal Speicherplatz, in den du deinen String packst.
Den kannst du auf verschiedenste Weise reservieren. zB. statisch in deinem Programm - da initialisiert (evtl. auch mitten in einem String) oder uninitialisiert. Die Syntax dazu ist Assemblerabhaengig.
Zwar fuer so einen kleinen Speicherbereich unsinnig, prinzipiell aber moeglich, ist es das OS nach etwas Speicher zu fragen...Je nachdem kannst du diese Ziffern(Bytes) dann also der Reihe nach in den Speicher (String) packen und hinten zur Ausgabe in DOS zB. noch ein "$" anhaengen.
Wenn du nun ueberhaupt keinen Plan hast, wie das im Detail zu realisieren ist, schlage ich vor, du arbeitest einfach erstmal das Buch weiter durch. Irgendwann solltest du dann in Etwa eine Idee bekommen.
-
Nobuo T schrieb:
Als naechstes brauchst du erstmal Speicherplatz, in den du deinen String packst.
Den kannst du auf verschiedenste Weise reservieren. zB. statisch in deinem Programm - da initialisiert (evtl. auch mitten in einem String) oder uninitialisiert. Die Syntax dazu ist Assemblerabhaengig.
Zwar fuer so einen kleinen Speicherbereich zwar unsinnig, prinzipiell aber moeglich, ist es das OS nach etwas Speicher zu fragen...Je nachdem kannst du diese Ziffern dann also der Reihe nach in den String packen und hinten zur Ausgabe in DOS zB. noch ein "$" anhaengen.
Wenn du nun ueberhaupt keinen Plan hast, wie das im Detail zu realisieren ist, schlage ich vor, du arbeitest einfach erstmal das Buch weiter durch. Irgendwann solltest du dann in Etwa eine Idee bekommen.
Eine intuitive Vorstellung davon, wie das zu realisieren wäre, habe ich schon. Nur wird es sich wohl nicht lohnen, jetzt quer durchs Buch zu Blättern und Befehle nachzuschlagen.
Aber reichlich demotivierend ist es doch, nach 150 Seiten noch nicht einmal dazu in der Lage zu sein, eine Ganzzahl auf den Bildschirm auszugeben, um zu überprüfen, ob sein Codestück überhaupt das getan hat, was es hätte tun sollen.
-
Tja, so ist das halt leider mit Assembler. Bevor du damit praktische, dh. meist abstraktere Aufgaben wie zB. die Ausgabe einer Ganzzahl angehen kannst, brauchst du schon einen soliden Grundstock an Erfahrung bzw. Wissen.
Hast du keinen Debugger, mit dem du dir "live" angucken kannst, was dein Code macht?
-
Nobuo T schrieb:
Tja, so ist das halt leider mit Assembler. Bevor du damit praktische, dh. meist abstraktere Aufgaben wie zB. die Ausgabe einer Ganzzahl angehen kannst, brauchst du schon einen soliden Grundstock an Erfahrung bzw. Wissen.
Hast du keinen Debugger, mit dem du dir "live" angucken kannst, was dein Code macht?Den Turbo-Debugger for DOS. Aber damit kann ich gerade garnichts anfangen. Wenn ich meine EXE aufmache, sagt er mir "Program has no symbol table".
-
Ja, der ist doch super fuer den Anfang.

Ignoriere die Meldung einfach, er laedt dein Programm trotzdem.
-
Nobuo T schrieb:
Ja, der ist doch super fuer den Anfang.

Ignoriere die Meldung einfach, er laedt dein Programm trotzdem.OK. Jetzt kam gerade ein Bildschirm voller Smilies gefolgt vom lauten Piepsen.
Aber gut zu wissen, dass mein Assembler sogar einen Dibugger hat. Danke.
-
Bzw. sehe ich das richtig? Ich kann nur einsehen, was sich im Code-Segment tut?
-
Hat sich erledigt. $ vergessen...
Weißt du, ob man auch sehen kann, was sich im AH bzw AL befindet? Er zeigt mir lediglich den Inhalt von AX an.
-
movxz dx, al
oder
mov dx, word al
-
Wenn du ax betrachtest, siehst du damit ah und al sogar gleichzeitig auf einen Blick.

Lies mal "EAX ... AX" aus den FAQ. eax und die ganzen 32-Bit-Register kannst du dir im TD uebrigens auch anzeigen lassen.Und grundsaetzlich kannst du dir im RealMode wirklich alles im Speicher ansehen. Im TD oben eben in Code-Form unten in Datenform und rechts daneben unter den Registerinhalten noch den Stack.
In allen diesen Bereichen kannst du an jede beliebige Speicheradresse springen, bist also nicht auf irgendein "Segment" beschraenkt.sicher schrieb:
movxz dx, al
oder
mov dx, word alZumindest das 2. waere im Grunde falsch - der Assembler, der das annimmt, waere IMHO zu grosszuegig.