Assambler 8086 Code Frage

Gast #1756096
Lesenswert?

Hallo,
ich habe mal eine Frage bzgl. des 8086 und hoffe Ihr könnt helfen.
Nehmen wir mal an ich habe eine 16 Bit Variable mit dem Inhalt 65535.
Wenn ich diese Dezimalzahl jetzt auf dem Bildschirm ausgeben möchte muss 
ich sie ja zuerst  in ihre Komponenten 6,5,5,3,5 zerlegen und diese in 
ASCII Zeichen umwandeln, also 36h,35h,35h,33h,35h.
Wie sieht denn jetzt die Befehlsfolge aus? ich wollte schon mal
zahl dw ?
asciifeld db 6 dub(?)
verwenden.Hoffe Ihr habt kurz zeit.
Gruß tobias
#1756204
Lesenswert?

Ohforf Sake schrieb:
> Kann man da nicht irgendeine Library linken oder so, damit man den
> Standardkram nicht selber schreiben muss ?
> Mir scheint die Vorgehensweise furchtbar umständlich.

Du kannst davon ausgehen, dass jeder ernst zu nehmende Assembler 
Programmierer eine derartige Funktion in seinem Repertoir vorrätig hat, 
bzw. in seinen Unterlagen findet.

D.h. beim Fragesteller handelt es sich höchst wahrscheinlich um 
jemanden, der gerade seine Hausaufgaben macht und jetzt erst mal 
entdecken muss, wie man Zahlen zerlegt.
Gast #1756287
Lesenswert?

Hi,
was genau kann ich mit dem Befehl
asciifeld db 6 dup(?) machen?
db6 dup(2) heisst ja 2,2,2,2,2,2 wie hilft mir das bei der Aufgabe 
weiter?
db6 dup(?) ist ja undefiniert richtig?


bis jetzt hab ich zahl dw 65535 ; kann ich doch so machen oder?

mov ax, zahl   65535 in ax schieben
mov dx,10000
div dx dann steht doch in ax 6 und in dx der Rest oder?

danach wollte ich eigentlich ax im stack sichern dx nach ax verschieben 
1000 in dx laden wieder dividieren etc. anschließend noch durch 100 und 
10 teilen
kann ich das so machen? oder vorher noch 30 addieren und dann jeweils 
sichern?
wenn ich alle im stack gesichert habe wie kann ich sie dann ausgeben?
Gast #1756319
Lesenswert?

Hallo Tobias,
Ich habe dir die Lösung in X86-Assembler geschrieben und mit debug.exe 
auch getestet und es funktioniert auch.
Ich hoffe daß damit klar kommst.

Gruß
Armin

mov ax,3  // Lösche den Bildschirm
int 10
mov ax,b800  // Stelle es auf die Speichertadresse für Textvideoram
mov es,ax
mov ax, ffff  // 16-Bit Zahl
xor dx,dx
mov cx, 2710   // Dividiere durch 10000
div cx
add al, 30
mov ah,a
stosw    // Ziffer ausgabe
cmp dx,0
jz @ende
mov ax,dx
xor dx,dx
mov cx, 3e8  // Dividiere durch 1000
div cx
add al,30
mov ah,a
stosw    // Ziffer ausgabe
cmp dx,0
jz @ende
mov ax,dx
xor dx,dx
mov cx, 64  // Dividiere durch 100
div cx
all al,30
mov ah,a
stosw    // Ziffer ausgabe
cmp dx,0
jz @ende
mov ax,dx
xor dx,dx
mov cx, a  // Dividiere durch 10
div cx
add al,30
cmp dx,dx
jz @ende
mov al,dl
add al, '0'
mov ah,a
stosw    // Ziffer ausgabe
@ende:
mov ah,4c  // Beende das Program
int 21
Gast #1756330
Lesenswert?

Hallo Tobias,

Einen kleinen Tippfehler habe ich korrigiert.
Alle Zahlen sind in Hexadezimal-Format.
Natürlcih sieht der Code in debug.exe bißchen anderes aus wegen der 
Zeilen-Nummern weiles dort keinen Labelnamen existieren darf sondern nur 
Sprung auf die Zeilenadresse.

Gruß
Armin
______________________________________________________________________
mov ax,3     // Lösche den Bildschirm
int 10
mov ax,b800  // Stelle es auf die Speichertadresse für Textvideoram
mov es,ax
mov ax, ffff  // 16-Bit Zahl
xor dx,dx
mov cx, 2710   // Dividiere durch 10000
div cx
add al, 30
mov ah,a
stosw    // Ziffer ausgabe
cmp dx,0
jz @ende
mov ax,dx
xor dx,dx
mov cx, 3e8  // Dividiere durch 1000
div cx
add al,30
mov ah,a
stosw    // Ziffer ausgabe
cmp dx,0
jz @ende
mov ax,dx
xor dx,dx
mov cx, 64  // Dividiere durch 100
div cx
add al,30
mov ah,a
stosw    // Ziffer ausgabe
cmp dx,0
jz @ende
mov ax,dx
xor dx,dx
mov cx, a  // Dividiere durch 10
div cx
add al,30
cmp dx,dx
jz @ende
mov al,dl
add al, '0'
mov ah,a
stosw    // Ziffer ausgabe
@ende:
mov ah,4c  // Beende das Program
int 21

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren