16 bit zahl ausgeben?



  • Hallo ich habe mal ne frage zu folgendem code, es kommt immer eine Fehlermeldung und ich weis nicht warum?



  • .model small
    .stack 100h
    .data
    .code
    
    start:
    mov cx, 0       ;Wird 0 gesetzt da alles im Speicher stehen kann
    mov dx, 0       ;------------------"----------------------------
    
    mov ax, 0FFFFh
    mov bx, 10
    
    begin1:
    div bx          ;dividiert FFFF mit 10
    
    push dx         ;Rest auf Stack packen
    add cx,1        ;Z„hlt mit wieviel Zellen dareinkommen
    
    mov dx,0        ;Setzt rest wieder null
    
    cmp ax,0        ;Ueberpruefen ob ax=0
    jmp begin1      ;Wenn ax=0, dann gehe zu begin1
    
    begin2:
    pop al
    
    mov ah, 09h
    int 10h
    sub cx, 1
    cmp cx, 0
    je schluss     ;Wenn test =0 dann Springe zu schluss
    jmp begin2     ;Wenn test nicht 0 dann berspringt je und macht jmp
    
    schluss:
    mov ah, 4ch
    int 21h
    
    end start
    


  • also ohne mir das großartig anzugucken kann ich dir zumindest sagen, dass POP AL auf keinen fall funktionieren wird. man kann keine 8-bit operanden pushen/popen.



  • erstens das und zweitens kann man mit 09h/Int 21h nur Text und keine Zahlen ausgeben (bzw. muss man vorher die Zahl in String/Text umwandeln)... außerdem wird gar kein seg gesetzt... kann nicht gehen... sag mal genau, was du machen willst, dann können wir auch code posten bzw. auf alte threads verweisen (was aufgrund deines thread-titels sehr wahrscheinlich ist)



  • Hi.

    Da sind einige Fehler drin, ein paar davon wurden schon genannt...
    Ansonsten ist der Ansatz aber gut.
    Dann mal durchgehen:

    .model small
    .stack 100h
    .data
    .code
    
    start:
    mov cx, 0       ;Wird 0 gesetzt da alles im Speicher stehen kann
    mov dx, 0       ;------------------"----------------------------
    ; - was soll wo im Speicher stehen... oder meinst du die Register?
    
    mov ax, 0FFFFh
    mov bx, 10
    
    begin1:
    div bx          ;dividiert FFFF mit 10
    
    push dx         ;Rest auf Stack packen
    ;add cx,1        ;Z„hlt mit wieviel Zellen dareinkommen
    ;da du die Flags dieser Addition nicht verwendest, ist folgendes effizienter:
    inc cx
    
    mov dx,0        ;Setzt rest wieder null
    
    ;cmp ax,0        ;Ueberpruefen ob ax=0
    ;das ist eine eher ungeschickte Methode, zu ueberpruefen ob ein Register 0 ist
    ;besser ist zB. folgendes:
    test ax, ax
    ;jmp begin1      ;Wenn ax=0, dann gehe zu begin1
    ;damit haettest du hier eine Endlosschleife produziert.
    ;Der Befehl "jmp" fuehrt *immer* einen Sprung aus, egal ob ax=0 ist oder nicht
    ;Zudem sollte die Schleife verlassen werden, wenn die Ausgangszahl komplett
    ;zerhackt wurde, also ax=0 wird, und NICHT wiederholt werden.
    ;also besser:
    jnz begin1
    ;springe, wenn ZF=0, also ax!=0
    
    begin2:
    ;pop al
    ;wie malfunction schon sagte: geht nicht
    pop ax
    ;in ax hast du jetzt einen Wert zwischen 0 und 9 stehen...
    ;In diesem Bereich liegen nur einige komische Symbole im ASCII-Zeichensatz
    ; - ich nehme einfach mal an, dass du Ziffern auf dem Bildschirm haben
    ;willst.
    ;Die Ziffern von "0" bis "9" liegen in der ASCII-Tabelle bei 30h bis 39h
    ;folglich muesstest du noch 30h zu dem Wert in ax addieren...
    ;eine or-Verknuepfung wird es hier aber auch tun und ist zudem effektiver ;)
    or al, 30h
    
    ;mov ah, 09h
    ;siehe unten... Das wird nicht zu den gewuenschten Resultaten fuehren.
    mov ah, 0Eh
    int 10h
    ;sub cx, 1
    ;cmp cx, 0
    ;je schluss     ;Wenn test =0 dann Springe zu schluss
    ;jmp begin2     ;Wenn test nicht 0 dann berspringt je und macht jmp
    ;auch das wieder sehr ineffizient.
    ;sollte aber im Gegensatz zu deinem Konstrukt in der 1. Schleife
    ;funktionieren.
    ;trotzdem besser 1 Zeile als 4:
    loop begin2 ;zu begin2 springen, wenn --cx!=0
    
    schluss:
    mov ah, 4ch
    int 21h
    
    end start
    

    [edit]Fast vergessen: Funktion 09h vom int 10h erwartet in cx die Anzahl der zu schreibenden Zeichen.
    Da du cx aber schon zum Counter fuer die Anzahl deiner auf dem Stack abgelegten Ziffern gemacht hast, kommt da nur Muell bei raus.
    Wenn es also unbedingt eine BIOS-Funktion sein muss, dann benutze Funktion 0Eh.

    Code entsprechend veraendert...[/edit]



  • Hi, also wie schon in dem TITEL steht wollte ich eine 16 Bit zahl ausgeben lassen. Die idee ist halt das ich jeweils durch 10 teile und den rest in einen stack packe Und wenn ich alles durch 10 geteilt habe wollte ich alles aus dem steck holen und ausgeben lassen. Hier ist das Flussdiagramm nachdem ich dies machen wollte.

    http://www.inf.hs-zigr.de/~boehm/sba1.jpg


Anmelden zum Antworten