Variablen ausgeben



  • Diser Code ist schnell geschreiben und darum nett fehlerfrei, bin erst seit kurzem dabei:

    DATEN SEGMENT
    Zahl db 66
    DATEN ENDS
    
    STAPEL SEGMENT
    
    STAPEL ENDS
    
    CODE SEGEMNT
    Start:
    ASSUME CS:CODE,DS:DATEN,ES:NOTHING,SS:STAPEL
    mov ax,DATEN
    mov ds,ax
    
    mov ah,4Dh
    int 21h
    CODE ENDS
    END Start
    

    Wie kann ich "Zahl" ausgeben. 😃
    mfg 🙂
    cya



  • Kommt drauf an, ob du das ganze z.B. mit einem C Programm zusammenlinkst. Dann könntest du einfach printf aufrufen. Wenn du es händisch machen willst, musst du halt herumrechnen (ins Dezimalsystem verwandeln). Wie das geht, musst du wissen, sonst würdest du nicht auf die dumme Idee kommen, es in Assembler zu schreiben.



  • du kannst zahlen von 0 bis 9 ausgeben indem du 48 dazuaddierst. die dabei entstandene zahl entspricht dem ascii code der jeweiligen ziffer. also 48+3=51 wäre die "3" als ascii code. schau in eine ascii tabelle.
    da die zahlen im decimalsystem aus ziffern von 0 bis 9 entstehen, kannst du auch grössere zahlen auf dem bildschirm darstellen in dem du mit 10 teilst, zB die zahl 7518:

    7518/10 = 751 rest 8
     751/10 = 75  rest 1
      75/10 = 7   rest 5
       7/10 = 0   rest 7
    

    wie du vielleicht schon bemerkt hast, kannst du die zahl jetzt ablesen in dem du die reste von unten nach oben aufschreibst.
    wichtig fürs programm ist, dass wenn das ganzzahlige ergebnis gleich 0 ist, dann heisst es, dass keine weiteren ziffern mehr da sind.
    du kannst also die zahl 7518 in das register ax packen und dieses nach und nach mit 10 dividieren:
    mov ax,7518
    mov bx,10
    div bx
    das ganzzahlige ergebnis befindet sich nun in AX und der rest in DX:
    push DX
    damit holst du DX auf den stack, um die ziffer zu sichern. das machst du solange bis AX = 0 ist:
    cmp ax,0
    jnz nochmal
    wenn du damit nun fertig bist, kannst du die ziffern wieder nacheinander vom stack holen und auf dem bildschirm ausgeben:
    pop dx
    add dx,48 ; in ascii umwandeln
    mov ah,02h ; auf bildschirm ausgeben.
    int 21h
    ....
    das machst du nun so lange bis du alle zahlen ausgegben hast.

    das sollte kein funktionierender code sein, weil du das programm selber schreiben sollst und somit übern kannst, ausserdem hab ich eh grad keine zeit 🙂 äh und ich würde das mit der funktion 02h nochmal überprüfen, die ziffer steht nämlich in DL, somit muss die funktion die zahl in DL ausgeben.



  • mmm... geht das nicht wie in c++ mit einer Zeile 😉 .
    Egal. Das werde ich schon hinkriegen, falls nicht werde ich mich noch mal melden.
    mfg
    cya



  • mmmm... ihrgendwas funktioniert da nicht.
    CODE:

    DATEN SEGMENT
    DATEN ENDS
    STAPEL SEGMENT
    STAPEL ENDS
    CODE SEGMENT
    ASSUME CS:CODE,DS:DATEN,ES:NOTHING,SS:STAPEL
    Start:
    mov ax,22
    
    Wiederhole:
    mov bx,10
    div bx
    cmp ax,0
    jnz Wiederhole
    
    mov ah,4Ch
    int 21h
    CODE ENDS
    END Start
    

    schon hier ist was falsch *g*
    nur was???



  • Hm... Vielleicht bin ich ja blind, aber wo findet in deinem Code zB. die Ausgabe auf den Bildschirm statt? 😉



  • Nein, nein. So weit hab ich das noch nicht. Wenn du den Code ausführst wird er dir sagen das die division überschritten wurde.



  • Weil er nicht ax durch bx dividiert, sondern dx:ax durch bx. Und das Ergebnis ist dann zu groß, um in ax Platz zu haben. Darum schmeißt er eine Exception.



  • Wenn du ein dokumentiertes Beispiel brauchst, schau mal hier.

    Gruß
    E-the-Real



  • So,

    kommt zwar etwas spät 🙄 , aber ich hab hier mal ein kleines Macro geschrieben:

    ;--------------------------------------------------------------------
    ; Zahl ausgeben
    ;--------------------------------------------------------------------
    
    zahl_aus    MACRO  var1
    	mov cx,0
    	mov ax,var1
    zahl_umwandeln:
    	mov dx,0
    	mov bx,10
    	div bx
    	push dx
    	inc cx
    	cmp ax,0	
    	jne zahl_umwandeln
    zahl_ausgeben:
    	pop dx
    	add dx,48
    	push ax
    	mov  ah,2
    	INT  21H     
    	pop  ax
    	dec cx
    	cmp cx,0
    	jne zahl_ausgeben
    	ENDM
    

    Vielleicht kanns einer brauchen! 😉

    Gruß
    Frostie


Anmelden zum Antworten