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...


Anmelden zum Antworten