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
Such mal nach folgenden Befehlen: div (Division + Rest) add (Umwandlung Ziffer in ASCII) dec (Schleife) jnz (Schleife) Zusammenbauen musstes aber selber ;)
Kann man da nicht irgendeine Library linken oder so, damit man den Standardkram nicht selber schreiben muss ? Mir scheint die Vorgehensweise furchtbar umständlich.
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.
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
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.