Assembler Problem!!!!

Hallo!!!!!

Ich habe das Problem dass ich 63h in einem Speicher stehen habe.
ich vermute mal dass der Controller diese Zahl so darstellt
63h=01100011, wie mache ich aus dieser Zahl ne BCD Zahl .
Ich grüble schon seit längerer Zeit komme jedoch nicht auf ein vernünftiges Ergebnis.Wäre schön wenn mir jemanden nen Tipp hätte!!!!

Nanel111
 
AW: Assembler Problem!!!!

Hi Nanel111,

-was für eine BCD-Zahl soll denn rauskommen ??

1. Möglichkeit:
keine Umrechung

also
erste Ziffer "6"
zweite Ziffer "3"

2. Möglichkeit:
oder erst eine Umrechnung in Dezimal

63h = 99d also
erste Ziffer "9"
zweite Ziffer "9"

in beiden fällen solltes du ein Unterprogramm schreiben,
welches das Problem löst

Im ersten Fall muss die Zahl nur 2mal "Maskiert" werden :
einmal mit 0Fh -> das ist dann die Einer-Stelle
dann die ausgangs Zahl mit F0h maskieren
und 4mal rechts schieben -> das ist dann die Zehner-Stelle

der zweite Fall ist etwas aufwendiger,
den Schreibe ich dir, wenn sich das Problem nicht
mit dem ersten Fall gelöst hat 8)

Gruss Uwe
 
AW: Assembler Problem!!!!

Hallo!!!!!

Ich habe das Problem dass ich 63h in einem Speicher stehen habe.
ich vermute mal dass der Controller diese Zahl so darstellt
63h=01100011, wie mache ich aus dieser Zahl ne BCD Zahl .
Ich grüble schon seit längerer Zeit komme jedoch nicht auf ein vernünftiges Ergebnis.Wäre schön wenn mir jemanden nen Tipp hätte!!!!

Nanel111
Hallo,

ich nehme mal an ihr sollt bei dieser Aufgabe bestimmte Befehle üben.
Je nachdem wie weit ihr schon seid, sieht die gewünschte Lösung aus.

1.
Einfach in einer Schleife immer 10 subtrahieren bis die Zahl negativ wird.
Dabei mizählen wie oft es geklappt hat solange das Zwischenergebnis
noch >= 0 war. Das ergibt die obere Stelle der BCD-Zahl.
Das letzte Zwischenwergebnis das noch positiv war ist der Rest und damit die niederwertige BCD-Stelle.
Zum Schluß beide 4bit-BCD Zahlen wieder in ein Byte packen, falls das gewünscht war.

2.
Division durch 10 durchführen.
Ergebnis der Divison und Rest sind die Lösung.
Dazu muss man natürlich die Division kennen.

Helmut
 
AW: Assembler Problem!!!!

Hallo,
also wenn ich mir das so anschaue wirkt das Bitmuster wie eine BCD-Zahl,
in den ersten 4bit von rechts steht (63h=01100011) 0011=3 und in den nächsten 4bit steht 0110=6 .
gruß thomas
 
AW: Assembler Problem!!!!

Hi Nanel111,

-was für eine BCD-Zahl soll denn rauskommen ??

1. Möglichkeit:
keine Umrechung

also
erste Ziffer "6"
zweite Ziffer "3"

2. Möglichkeit:
oder erst eine Umrechnung in Dezimal

63h = 99d also
erste Ziffer "9"
zweite Ziffer "9"

in beiden fällen solltes du ein Unterprogramm schreiben,
welches das Problem löst

Im ersten Fall muss die Zahl nur 2mal "Maskiert" werden :
einmal mit 0Fh -> das ist dann die Einer-Stelle
dann die ausgangs Zahl mit F0h maskieren
und 4mal rechts schieben -> das ist dann die Zehner-Stelle

der zweite Fall ist etwas aufwendiger,
den Schreibe ich dir, wenn sich das Problem nicht
mit dem ersten Fall gelöst hat 8)

Gruss Uwe
Also die Maskierung muss ich mir moch genauer anschauen damit kann ich zur Zeit noch recht wenig anfangen.

Ich habe mich desshalb für Helmuts Lösung Nummer 2 entschieden.Da hatte ich einen Denkfehler ich hatte nicht durch 10dez sondern durch 10 Hex geteilt und bin dann eben auf Akku A=6 und Akku B = Rest drei gekommen, doch ich wollte ja eigentlich auf 99 dez kommen,ich glaube das funzt jetzt.

Dann habe ich noch ein Problem:

Ich habe einen Controller 8051 im Einsatz der hat 128B*8Bit Ram,4KB*8Bit Prom.
Liege ich richtig dass der Interne Ram Bereich von 0000h-127h geht
Interne Rom Bereich von 0000h- 4096h geht?
Auserdem habe ich noch externe Rams
Kann ich jetzt die externe Adresssierung bei 0000h beginnen oder fängt die erst bei Adresse 128h an???
Grundsätzliche Frage beim externen Adressieren spielen da die internen Bausteine eine Rolle?? Oder bekomme ich da Speicherüberschneidungen???

Nanel111
 
AW: Assembler Problem!!!!

Hi Nanel111,

wenn der 8051 128Byte internen RAM hat
sind das die Adressen 00h bis 7Fh (bzw. Dezimal 000d bis 127d)

das interne ROM wird nur von Firmen benutzt,
bei denen sich am Programm-Code nichts mehr ändert...
...die lassen sich dann hunderte von 8051 gleich mit
dem Fertigen Programm ins interne ROM programmieren

für unsere Zwecke ist das nicht zu gebrauchen und muss
per Hardware-Pin (EA auf Lo-Signal legen) abgeschaltet werden
[siehe Formelsammlung Seite 18]

jetzt gibt es also nur noch Externen Speicher der auch mit
besonderen Befehlen angesprochen wird (indirekte Adressierung)
z.B. MOV A,@DPTR (DPTR muss vorher mit der Adresse geladen werden)

die direkte Adressierung z.B. MOV A,30h zielt
auf das interne RAM

der externe Speicher muss jetzt noch per Hardware
(z.B. über Adressleitungen) für ROM und RAM aufgeteilt werden
[siehe Formelsammlung Seite 8]

die ROM Adresse muß bei 0000h beginnen,
weil sich von da die CPU den ersten Befehl holt

Gruss Uwe



z.B. MX
 
Zuletzt bearbeitet:
AW: Assembler Problem!!!!

Ich werde euch noch des öfteren Nerven!!!

Man sieht eben in diesen LM`den Wald vor lauter bäumen nicht mehr!!!!!

Nanel111
 
Top