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