Hallo,
ich habe ein Problem mit dem gezeigten Assembler-Programm (BCD-Multiplikationsprogramm).
Das Beispiel habe ich aus dem Buch "MC-Tools 2" von Otmar Feger.
In dem gezeigten Beispiel soll eine Multipliaktion von 200*200 ausgeführt werden. Das Ergebnis ist aber nicht "40000" sondern "400".
Das Ergebnis sollte in den Speicherstellen "37 36 35 34 (MSB .. .. LSB) stehen. Bei dem gezeigten Ergebnis ist aber: 37 36 35 34: 00 00 04 00.
Vieleicht kennt ja jemand das Program und kennt den Fehler oder ich habe nicht die richtigen Parameter zugeordnet.
BCD-Multiplikationsprogramm MUL_BCD:
1
; Test BCD-Arithmetik
2
; BCD-Multiplikationsprogramm MUL_BCD
3
; Beispiel aus dem Buch MC-Tools 2 von Otmar Feger 1992
Nur eine Vermutung, aber ich glaube das ist es nicht.
Bin zwar schon lange nicht mehr im Thema, aber ich finde so erstmal nicht die Stellen wo die 200d (oder 0xC8 / C8h) in irgendein Register geladen werden...
Hallo,
vielen Dank für den schnellen Hinweis.
Ich weiss leider nicht genau was das zu meiner Lösung beitragen soll, außer das die Funktion "MUL_BCD" Little Endian verwendet.
Juergen
Hallo,
gut das ich gefragt habe.
Der Hinweis auf die andere Reihenfolge beim Ergebnis ist richtig.
Getestet mit 300 * 300 = 90000.
Speicher 34 35 36 37 = 00 09 00 00.
Danke.
Leider funktioniert das angegebene Beispiel: 1358 * 7916 = 10749928 nicht.
Bei mir: 34 35 36 37 = 70 03 02 00.
Juergen
Hallo,
mit dem angegebenen Programm-Code funktioniert die Funktion "MUL_BCD" nicht.
Die Funktion funktiniert nur mit der LSB-Stelle = 00H und MSB-Stelle = 09H,
also bis: 900 * 900 = 00 81 00 00.
BCD-Multiplikationsprogramm MUL_BCD:; Test BCD-Arithmetik
; BCD-Multiplikationsprogramm MUL_BCD
; Beispiel aus dem Buch MC-Tools 2 von Otmar Feger 1992
; Compiler: Keil-C uVision V5.38.0.0
Wichtige Regeln - erst lesen, dann posten!
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Is' doch nicht sooh schwer zu verstehen. Sobald der automatische Zeilenzähler ein Formatproblem bekommt, kannst du dir ganz sicher sein, dass der Code in diesem Sinne als "länger" zu betrachten ist ;-)
as Ergebnis ist aber nicht "40000" sondern "400".
Das Ergebnis sollte in den Speicherstellen "37 36 35 34 (MSB .. .. LSB)
stehen. Bei dem gezeigten Ergebnis ist aber: 37 36 35 34: 00 00 04 00.
Dann überleg dir, was in jedem Programmschritt passieren muss, damit das richtige Ergebnis berechnet wird und verfolge mit dem Debugger notfalls Schritt für Schritt, ob der Ablauf passt bzw. wo es Abweichungen gibt.
Wenn du sowieso jedes Paar des Einmaleins einzeln testen möchtest, schlage ich vor, dass du ein zweidimensionales Array aller Pärchen mit Ergebnis anlegst. Dann indizierst du in das Array und kannst sicher sein, das richtige Ergebnis zu erhalten.
Du kannst sogar zwei unterschiedliche Arrays für LSB und MSB anlegen und wirst hardwareunabhängig!!
Junge, das hier ist Assembler Code. Lass die Trollerei...Bitte.
Bevor du hier so große Töne spuckst:
Es geht um die Struktur, nicht um die Syntax.
Auch in Assembler Code lassen sich Daten über Indizierung geeignet ansprechen - das konnte vor fast 50 Jahren schon ein 6502.
Aber vielleicht fehlt dir da die Erfahrung.
Ich vermute mal, in dem Buch gibt es eine ausführliche Erklärung zu dem Code.
Den Code allein kann ich nicht nachvollziehen. Was mir nur auffällt, daß eine ganze Menge Umstände nötig sind, da die CPU ja alle Rechenschritte nur im Binärformat durchführen kann und nicht in BCD.
Ich selber habe daher auch nur Routinen erstellt, die das Binärformat benutzen. Warum man das umständliche BCD-Format benutzen sollte, erschließt sich mir nicht.
Falls Interesse besteht, könnte ich meine A51 Math-Lib mal raussuchen und posten. Sie ist für ein variables Format ausgelegt, d.h. man könnte z.B. auch mit 20 Byte Zahlen (1.4615e+48) rechnen. Die Operanden werden quasi als eine Art Stack abgelegt. Die Operationen werden also über die obersten 2 Operanden ausgeführt.
ich habe ein Problem mit dem gezeigten Assembler-Programm
(BCD-Multiplikationsprogramm).
Ja, du weißt scheinbar nicht einmal was die Zielarchitektur ist. Und du weißt obendrein nicht, dass man diese für erfolgreiche Assemblerprogrammierung unweigerlich kennen muss.
Wäre es anders, hättest du sie angegegen.
1
> ; Compiler: Keil-C uVision V5.38.0.0
2
>
Womit das Assemblerprogramm dann übersetzt werden, ist natürlich auch nicht völlig irrelevant, aber im Vergleich zu der Angabe, um welche Ziel-Architektur es eigentlich geht, doch schon ziemlich irrelevant...
Ich vermute mal, in dem Buch gibt es eine ausführliche Erklärung zu dem
Code.
Den Code allein kann ich nicht nachvollziehen. Was mir nur auffällt, daß
eine ganze Menge Umstände nötig sind, da die CPU ja alle Rechenschritte
nur im Binärformat durchführen kann und nicht in BCD.
Ich selber habe daher auch nur Routinen erstellt, die das Binärformat
benutzen. Warum man das umständliche BCD-Format benutzen sollte,
erschließt sich mir nicht.
Falls Interesse besteht, könnte ich meine A51 Math-Lib mal raussuchen
und posten. Sie ist für ein variables Format ausgelegt, d.h. man könnte
z.B. auch mit 20 Byte Zahlen (1.4615e+48) rechnen. Die Operanden werden
quasi als eine Art Stack abgelegt. Die Operationen werden also über die
obersten 2 Operanden ausgeführt.
Hallo,
eine ausführliche Erklärung gibt es in dem Buch leider nicht.
Ich denke mal das der Autor davon ausgeht wie eine BCD-Multiplikation funktioniert.
Ein Interesse besteht natürlich an die A51 Math-Lib (Danke).
Juergen
ich habe ein Problem mit dem gezeigten Assembler-Programm
(BCD-Multiplikationsprogramm).
Ja, du weißt scheinbar nicht einmal was die Zielarchitektur ist. Und du
weißt obendrein nicht, dass man diese für erfolgreiche
Assemblerprogrammierung unweigerlich kennen muss.
Wäre es anders, hättest du sie angegegen.
1
>> ; Compiler: Keil-C uVision V5.38.0.0
2
>>
Womit das Assemblerprogramm dann übersetzt werden, ist natürlich auch
nicht völlig irrelevant, aber im Vergleich zu der Angabe, um welche
Ziel-Architektur es eigentlich geht, doch schon ziemlich irrelevant...
Hallo,
ich weiss schon das es wichtig ist welcher MC verwendet wird.
Der Compiler fragt ja beim Anlegen eines Projektes nach dem entsprechenden Device. Bei mir ist das: AT89C51RC2.
Mein eigentliches Anliegen war:
Ich wollte wissen ob jemand die Funktion kennt und wenn ja ob die Funktion
funktioniert oder ein Fehler vorliegt.
Wenn jemand die Funktion kennt, hätte ich mir das debuggen ersparen können.
Juergen
Hallo,
so die Funktion "MUL_BCD" funktioniert nun.
Das Problem lag an den verwendeten Bits für ABIT bzw. BBIT.
Mit: ABIT BIT 20H.0, BBIT BIT 20H.1 funktioniert "MUL_BCD" mit der Rechnung 1358 * 7916 = 10749928.
Vielen Dank für Eure Hinweise, besonderen Dank an Peter D. für seine Lib.
Werde ich noch testen.