Assembler: Register sichern vor Makro Aufruf
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
assembler
auflage
aufruf
beendigung
befehl
buchen
code
doppel
eingegebene zeichen
erinnern
folgendem code
halben registern
inhalt
kleine programme
parameter
pop
programmierung
register
unerfahrenen leser
wort
-
Hi
Ich übe gerade ein wenig Assembler Programmieren und stoße hier auf eine Aufgabe in einem Buch.
Es wird ein Makro definiert mit folgendem Code:
TASTE_ECHO_AL MACRO PUSH BX MOV BH, AH MOV AH, 01h INT 21h MOV AH, BH POP BX ENDM
Das Ziel soll sein, dass bevor man den Interupt 21h aufruft, das Register AH sichert. Es könnte ja sein das der Inhalt nach Aufruf des Makros wieder benötigt wird. Mittels der Zeile MOV AH, 01h wird der Inhalt aber überschrieben.
Dazu wird nun also BX auf dem Stack gesichert, der BH Teil davon mit AH überschrieben um anschließend wieder BH in AH zu schrieben und BX wieder vom Stack zu holen.
In meinen Augen ist das aber irgendwie doppel gemoppelt, wiesp kann man nicht einfach mittels PUSH AX sichern und dann mit POP AX wieder herholen, also:
TASTE_ECHO_AL MACRO PUSH AX MOV AH, 01h INT 21h POP AX ENDM
In meinen Programmbeispielen funktioniert dies tadellos, es könnte jedoch sein das bei komplizierteren Angelegenheiten, das ganze nichtmehr so funzt wie ich möchte, daher hoff ich jemand kann mir das etwas erläutern :)
Vielen Dank!
Gruß Tobi
Beitrag geändert: 22.8.2008 21:12:16 von ttobsen -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Meiner Einschätzung nach ist deine Lösung richtig und besser.
Was mich allerdings wundert, ist, dass hier mit halben Registern (also AH statt AX) gearbeitet wird. Soweit ich mich erinnern kann, wird für den Syscall immer das gesammte AX Register ausgelesen.
Was steht denn im Buch, was das Makro machen soll? Vielleicht wird bei dem Syscall 0100h auch das BX Register als Parameter ausgelesen? -
bladehunter schrieb:
Meiner Einschätzung nach ist deine Lösung richtig und besser.
Das höre ich gerne! :)
Ich kann mit dem Wort Syscall nicht viel anfangen (das taucht nicht einmal im Buch auf). Daher ist das folgende mal auf gut Glück und beantwortet die Frage.
21h ist ein DOS Interrupt, siehe:
http://www.datasource.de/programmierung/tab16_dosint20u21h.html
Laut dem Buch muß nun in AH 01h stehen, damit der Befehl:
"Warten auf Tastatureingabe und Anzeige auf Bildschirm"
ausgeführt wird. Würde ich in AX 01h schreiben, dann wäre ja praktisch AH = 0 und AL = 01h (oder sind die beiden gerade vertauscht?).
Das eingegebene Zeichen wird auch nicht in BX sondern in AL gespeichert. Ok jetzt könnte man sagen: AL soll nach Beendigung des Makros auch wirklich den Inhalt der Eingabe haben. Aber bei anderen Beispielen würde das Register AL dann wirklich nicht gebraucht und trotzdem die Sicherung so durchgeführt.
Vielleicht ein Tipp für alle, weil das Buch kann ich im Allgemeinen auch nicht empfehlen. Auf der einen Seite wird der Pentium und die 80x86 Prozessoren sehr Oberflächlich behandelt, auf der anderen Seite werden dann wieder Fachbegriffe verwendet die zuvor nicht erklärt wurden. Es soll ein Einsteigerbuch sein, gibt aber dem unerfahrenen Leser fast 0 Chance (zum Glück hatte ich schonmal ein paar kleine Programme für den Atmega geschrieben).
Das Buch: Wolfgang Link, "Assembler Programmierung", Franzis, 12. Auflage
Für 20€ ist das doch etwas zu wenig.
Gruß Tobi und vielen Dank! :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage