mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assambler 8086 Code Frage


Autor: tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kann mir keiner weiterhelfen?

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Such mal nach folgenden Befehlen:

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

Zusammenbauen musstes aber selber ;)

Autor: Ohforf Sake (ohforf)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Ohforf Sake:

Hausaufgabe zum Assembler-Lernen denke ich mal ;)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: G. O. (aminox86)
Datum:

Bewertung
0 lesenswert
nicht 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.e...
mfg

Autor: tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Armin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Armin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.