Ausgabe mit Verzweigung
-
Hallo,
ich bin noch relativ neu bei der Assembler-Programmierung und wollte ein einfaches Programm schreiben,das Daten zu dem aktuellen System ausgibt.Das ganze basiert auf einem simplen Beispiel von netlow.
Das Problem:kommt die zweite Ausgabe nicht,nur wenn ich die erste Verzweigung streiche.Kann mir jemand da einen Tipp geben?call aktion mov si,msg_fertig call putstr call getkey ; Warte auf einen Tastendruck jmp reboot ; Reboot ; ------------------------------------------------- ; Funktionen und Variablen ; ------------------------------------------------- msg db "Kern-System 0.01",13,10,0 msg_fertig db "Fertig",13,10,0 str_ja db " - JA - ",13,10,0 str_nein db " - NEIN - ",13,10,0 str_diskettenlaufwerk db "Diskettenlaufwerk:",0 str_coprozessor db "Mathematischer Coprozessor:",0 str_seriell db "Serielle Schnittstelle:",0 str_paralell db "Paralelle Schnittstelle:",0 ; Stringausgabe putstr: lodsb ; Byte laden or al,al jz short putstrd ; 0-Byte? -> Ende! mov ah,0x0E ; Funktion 0x0E mov bx,0x0007 ; Atrribut-Byte int 0x10 ; schreiben jmp putstr putstrd: ret ;----------------------------------------------------- ;Eigne Funktionen ;----------------------------------------------------- aktion: mov si,str_diskettenlaufwerk ; Lade String call putstr ; Ausgabe int 0x11 ; Hole System-Daten mov bx,ax and bx,0x01 ; Selektiere 1.Bit cmp bx,0x01 ; Vgl. mit Vorgabewert für mind. 1. Diskettenlaufwerk je @ja ; 1.Bit war '1' jne @nein ; 1.Bit war nicht '1' mov si,str_coprozessor call putstr int 0x11 mov bx,ax and bx,0x02 cmp bx,0x02 jmp @ja jne @nein ret ;----------------------------------------------------- ret ; Warte auf einen Tastendruck getkey: mov ah, 0 ; Funktion 0 int 016h ; Ausführen ret ; Rebooten (HEX Dump). reboot: retn db 0EAh dw 0000h dw 0FFFFh ret @ja: mov si,str_ja call putstr ret @nein: mov si,str_nein call putstr ret
-
Hab die Antwort schon gefunden,es lag an den jz,jnz usw. Anweisungen,an deren Stelle man nicht mit 'ret' kommt.
Allerdings frage ich mich,ob dieser Weg wirklich des beste ist:cmp bx,0x02 jnz weiter1 call @ja jmp weiter2 weiter1: call @nein weiter2:
Das würde bedeuten,das bei jeder Verzweigung mindestens 2Marken auftreten,was den Aufwand beträchlich erhöht.Gibt es keinen effektiveren Weg?
MFG,
mem-fun.
-
falls die routinen ja und nein keine allgemeinen, sondern problemspezifische routinen sind, kannst du dir das call sparen und in die routinen mit jmp/jz/... springen und am ende dieser routinen steht ein jump an ein label, das sich nach cmp usw. befindet
ansonsten ist das in meinen augen die einzige möglichkeit...