Problem mit Ausgabe



  • Hallo, kann sich mal einer mein Prog. angucken, bin noch recht neu im Gebiet Assembler...
    Ich bekomm einfach die Ausgabe nicht gebacken.
    Danke.

    ;Programm soll beim Start fragen, "Wieviel Euros hast du noch?", bediener antwortet erhlich mit Zahl
    ;Wenn er antwortet 0, geben Sie aus "Armes Schwein" .. größer 0, "du Glücklicher"
    
    .model flat
    .stack 100h
    .data
    aus1 db 'Wieviel Euros hast du noch?: $'
    aus2 db 'Du armes Schwein $'
    aus3 db 'Du Gluecklicher $'
    nl db 10,13, '$'
    
    .code
    .include ein32dez.inc
    .include aus32dez.inc
    
    start: 
           mov ah,9      ; Ausgabe Text 'aus1'
           lea dx,aus1   ; lea, speichert Adresse nicht den Inhalt
           int 21h
    
           call ein32dez ; Eingabe einer Zahl in AX
           mov ax,0      ; In ax eine 0 packen
           cmp ax,0      ; Vergleichen ...
           je rofl       ; ... wenn gleich, ab nach rofl
           ja lol
           mov ebx,eax   ; Sicherung in BX
    
    rofl: 
           lea dx,aus2 
    
           mov ah,9      ; Ausgabe 'neue Zeile'
           int 21h
           mov eax,ebx   ; Rücksicherung in EAX          
    
    lol: 
           lea dx,aus3
           mov ah,9      ; Ausgabe 'neue Zeile'
           int 21h
    
           mov ah,1      ; Wartet auf Tasteneingabe
           int 21h       ; vor dem Programmende
           mov ax,4c00h
           int 21h       ; Programm beenden
    end start
    

  • Mod

    mov ax,0
    cmp ax,0

    das macht wohl nicht viel sinn...



  • Wieso, ich brauch doch ein Wert wonach er sich richtet.. den vergleicht er, und anhand dessen soll er die Ausgabe wählen..


  • Mod

    ich weiss ja nicht was ein32dez genau macht, aber

    mov ax,0 lädt ax mit dem wert 0

    cmp ax,0 vergleicht den wert in ax mit dem wert 0, da aber grade 0 in das register geladen wurde, ist natürlich klar, dass das ergebnis immer 'gleich' sein wird.
    folglich wird der sprung je rofl immer ausgeführt
    übrigens kann der vergleich cmp ax,0 eleganter durch or ax,ax oder and ax,ax durchgeführt werden



  • Moin, Moin...

    Also, was mich schon am Anfang stutzig macht, ist .model flat. Dein Programm scheint für DOS zu sein, da Du den DOS-Interrupt 021h verwendest. DOS arbeitet aber nicht mit dem Speichermodell FLAT zusammen.

    Des Weiteren verwendest Du die 32-Bit-Register ebx und eax. Die Standard-Einstellung bei TASM und MASM ist aber, dass Code für den 8086 erzeugt wird. Diese CPU hatte bekanntlich noch keine 32-Bit-Register.

    Ich bezweifel doch sehr, dass das Programm tatsächlich ohne Fehlermeldung übersetzt wird.

    Versuche es mal so:

    ;Programm soll beim Start fragen, "Wieviel Euros hast du noch?", bediener antwortet erhlich mit Zahl
    ;Wenn er antwortet 0, geben Sie aus "Armes Schwein" .. größer 0, "du Glücklicher"
    
    .model small
    
    .stack 100h
    
    .data
    
    aus1 db 'Wieviel Euros hast du noch?: $'
    aus2 db 'Du armes Schwein $'
    aus3 db 'Du Gluecklicher $'
    nl db 10,13, '$'
    
    .code
    .386
    include ein32dez.inc
    include aus32dez.inc
    
    start:
    
    .startup
    
           mov ah,9      ; Ausgabe Text 'aus1'
           lea dx,aus1   ; lea, speichert Adresse nicht den Inhalt
           int 21h
    
           call ein32dez ; Eingabe einer Zahl in AX
    
           ; Die Funktion ein32dez liefert doch wohl eine Zahl zurück. Wahrscheinlich in Register ax.
           ; Daher ist mov ax, 0 Blödsinn!
    
           ;mov ax, 0    ; In ax eine 0 packen
           cmp ax,0      ; Vergleichen ...
           je rofl       ; ... wenn gleich, ab nach rofl
           ja lol
           mov ebx,eax   ; Sicherung in BX
    
    rofl:
           lea dx,aus2
    
           mov ah,9      ; Ausgabe 'neue Zeile'
           int 21h
           mov eax,ebx   ; Rücksicherung in EAX          
    
    lol:
           lea dx,aus3
           mov ah,9      ; Ausgabe 'neue Zeile'
           int 21h
    
           mov ah,1      ; Wartet auf Tasteneingabe
           int 21h       ; vor dem Programmende
    
    .exit 0
    
    end start
    

    Ciao...



  • Und nochmal Moin, Moin...

    Es sind noch einige Ungenauigkeiten im Programm. Du benutzt

    cmp ax,0      ; Vergleichen ...
           je rofl       ; ... wenn gleich, ab nach rofl
           ja lol
    

    Wenn Du eine negative Zahl eingibst, dann wird auch "Du Glücklicher" ausgegeben. Du verwendest die Sprunganweisung ja (jump if above). Die arbeitet aber nur mit vorzeichenlosen Zahlen. Verwende stattdessen jg (jump if greater).

    Nachdem der Text aus2 ausgegeben wird, sollte ein Sprung zum Ende erfolgen, damit der nächste Text nicht auch noch ausgegeben wird.

    Ciao...



  • Danke, hab es hinbekommen!


Anmelden zum Antworten