Forum: Mikrocontroller und Digitale Elektronik Assambler 8086 Code Frage


von tobias (Gast)


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

von tobias (Gast)


Lesenswert?

Hallo,
kann mir keiner weiterhelfen?

von Ronny (Gast)


Lesenswert?

Such mal nach folgenden Befehlen:

div   (Division + Rest)
add   (Umwandlung Ziffer in ASCII)
dec   (Schleife)
jnz   (Schleife)

Zusammenbauen musstes aber selber ;)

von Ohforf S. (ohforf)


Lesenswert?

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

von Ronny (Gast)


Lesenswert?

@Ohforf Sake:

Hausaufgabe zum Assembler-Lernen denke ich mal ;)

von Karl H. (kbuchegg)


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.

von G. O. (aminox86)


Lesenswert?

tobias schrieb:
> zahl dw ?
>
> asciifeld db 6 dub(?)

dup nicht dub, sonst gibt's einen Compilerfehler. dup leitet sich von
dup(licate) ab.

Im übrigen, für fast alle x86-Assemblerfragen ist dies der geeignete 
Ausgangspunkt:
[The art of Assembly 
Language]http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/
mfg

von tobias (Gast)


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?

von Armin (Gast)


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

von Armin (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.