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


Anmelden zum Antworten