Problem bei Ausgabe über int21h
-
Ich wollte ein kleines Programm schreiben um mal mein ganzes Wissen in asm zu prüfen.
jedoch wird bereits der erste String der ausgegeben werden soll, falsch ausgegeben
und ich habe keine Ahnung wieso.btw. es ist gut möglich, dass da noch weitere Fehler drin sind, aber soweit bin ich bisher noch nicht gekommen.
Die Ausgabe sieht so aus
E:\TASM\BIN>verkauf
Þ k☼¶ ↑ [☼═!╦
Wollen sie ei
nen Apfel, Banane oder Kirsche?Das Programm so
;Gibt string aus print macro string lea dx, string mov ah, 9 int 21h endm DATA segment msg db "Wollen sie einen Apfel, Banane oder Kirsche? $" endl db 10,13,"$" err1 db "Sie haben eine falsche Wahl getroffen.$" apfel db "Hier haben sie einen Apfel.$" banane db "Hier haben sie eine Banane.$" kirsche db "Hier haben sie eine Kirsche.$" DATA ends CODE segment assume cs:CODE, ds:DATA ;Programmstart start: ;msg ausgeben print msg ;Eingabeschleife input: ;Eingabe einlesen mov ah, 1 int 21h ;Eingebenes Zeichen vergleichen cmp al, 'a' je apfeljmp cmp al, 'b' je bananejmp cmp al, 'k' je kirschejmp ;Falsche auswahl erneut abfragen print endl print err1 ;Zu input springen jmp input ;Apfel wurde ausgewählt apfeljmp: ;Apfel erwartet den Parameter in dx lea dx, apfel call apfelprc ;Zum Programmende springen jmp ende bananejmp: ;Banane erwartet den Parameter auf dem Stack push offset banane call bananeprc ;Zum Programmende springen jmp ende kirschejmp: ;Kirsche erwartet den Parameter auf dem Stack, übergabe gemäß pascal call kirschprc pascal, offset kirsche ;Zum Programmende springen jmp ende ende: ;Programmende signalisieren mov ax, 04C00h int 21h ;Prozedur apfelprc apfelprc PROC NEAR ;ax und dx sichern push ax push dx ;Neue Zeile ausgeben print endl ;Message ausgeben pop dx mov ah, 9 int 21h ;Prozedurende ret apfelprc ENDP ;Prozedur bananeprc bananeprc PROC NEAR ;bp sichern push bp ;bp auf sp zeigen lassen mov bp, sp ;Register sichern push ax push dx ;Neue Zeile ausgeben print endl ;msg ausgeben mov dx, [bp]+4 mov ah, 9 int 21h ;Register wiederherstellen pop dx pop ax pop bp ;2bytes vom Stack lesen ret 2 bananeprc ENDP ;Prozedur kirschprc kirschprc PROC PASCAL NEAR arg string uses ax, dx ;Neue Zeile ausgeben print endl ;Nachricht ausgeben mov dx, string mov ah, 9 int 21h ;Prozedurende ret kirschprc ENDP CODE ends END start
-
Moin, Moin...
Wenn Du das Daten-Segment verwenden möchtest, musst Du das Register DS auch mit der richtigen Segmentadresse initialisieren:
start: mov ax, SEG DATA mov ds, ax ;msg ausgeben print msg
In der Funktion apfelprc fehlt ein pop ax:
apfelprc PROC NEAR ;ax und dx sichern push ax push dx ;Neue Zeile ausgeben print endl ;Message ausgeben pop dx mov ah, 9 int 21h pop ax ;Prozedurende ret apfelprc ENDP
Dann sollte es funktionieren.
Ciao...
-
Ok danke, stimmt das Register muss man ja von Hand zuweisen, daran hab ich nicht mehr gedacht (im Buch wird es mit .startup, usw. gemacht)
Edit:
Jetzt funktioniert es, danke
-
SirLant schrieb:
[..] mehr gedacht (im Buch wird es mit .startup, usw. gemacht) [..]
In welchem Buch, sag mal Buchtitel und Autor an!? ^^
Danke.
~Pointer
-
Oliver Müller - Assembler (Die Profireferenz) vom Franzis' Verlag