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
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
Thorsten S. schrieb:> aber ich finde so erstmal> nicht die Stellen
MOV (30H),#00H ; LSB Multiplikant
MOV (31H),#02H ; MSB Multiplikant
MOV (32H),#00H ; LSB Multiplikator
MOV (33H),#02H ; MSB Multiplikator
rrr, ist ja BCD...
Juergen B. schrieb:> Ich weiss leider nicht genau was das zu meiner Lösung beitragen soll
Ganz einfach, der Gedanke war, dass sie BYtes im Ergebnis verdreht sein
könnten...
0x 00 00 04 00
Wären Byteweise von rechts nach links gelesen 40000...
LSB...MSB
Juergen B. schrieb:> Das hatte ich schon probiert.
Wo steht das? Was wurde denn noch so probiert.
Juergen B. schrieb:> 400 = 20*20.
Ist in der Regel wohl so???
Versuche mal krumme Werte:
MOV (30H),#23H ; LSB Multiplikant
MOV (31H),#01H ; MSB Multiplikant
MOV (32H),#23H ; LSB Multiplikator
MOV (33H),#01H ; MSB Multiplikator
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.
Juergen
Juergen B. schrieb:> 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 ;-)
Juergen B. schrieb:> 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.
Juergen B. schrieb:> 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 B. schrieb:> mit: 123 * 123 erhalte ich: 34 35 36 27 = 92 84 00 00.> Richtig wäre: 00 01 51 29
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!!
Thorsten S. schrieb:> 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.
Juergen B. schrieb:> 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...
Peter D. schrieb:> 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
Ob S. schrieb:> Juergen B. schrieb:>>> 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
Juergen B. schrieb:> Ein Interesse besteht natürlich an die A51 Math-Lib (Danke).
Anbei mal die Lib.
Im Testprogramm ist precision mit 4 Bytes (32 Bit) definiert und Platz
für 4 Operanden reserviert.
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.
Juergen