8086 Assembly: Multiplikation zweier 16 bit-zahlen ergeben ein 32-bit-Ergebnis ohne Verwendung der mul-Anweisung

In das Verständnis der Vorteile der Verwendung von x86-Assembler geschrieben, ich bin versucht zu schreiben, als eine übung, eine 16x16 bit Multiplikation routine, die zwei unsigned 16-bit-Werte und multipliziert Sie mit Verlagerung und *addin*g, und speichert die letzten 32 bit-Ergebnis in DX:AX.

Ist es kein problem den code ausgeführt wird (in anderen Worten, es kompiliert einwandfrei und läuft mit meinem gelinkten Programm), aber der code ist nicht mit dem voraussichtlichen Ergebnis der Multiplikation.

Dies ist, was ich kommen mit so weit:


In der Theorie sollte dies gab mir die vorzeichenlose 32 bit-Ergebnis in DX:AX.

Wenn ich diesen code in meinem Programm, die unteren 16 bits der 32 bit Ergebnis (oder in anderen Worten, die AX Teil) richtig sind und zeigen sich nur in Ordnung. Die höheren 16 bits der 32-bit-Resultat (bei der DX-Anteil) nicht korrekt.

Könnte jemand mir helfen herauszufinden, was ich falsch mache?

Vielen Dank im Voraus

  • Ich bezweifle allerdings, das ist wirklich schneller als eine einfache mov ax, cx; mul bx. Oder versuchen Sie dies als übung?
  • Vor allem eine übung, um zu verstehen, wie es getan werden könnte, aber es wäre sehr interessant zu sehen, etwas, das schneller ist als die Verwendung der mul-Anweisung (da offenbar nur knapp hinter div als die langsamste Instruktion auf die 8086).
  • Ja, in der ersten asm-Buch, das ich lese, die vor rund 20 Jahren, schrieb Sie ein Rechner-Programm, aber seit damals mul und div in der Tat waren furchtbar langsam, Sie verwendet bitweise Verschiebungen, wie Sie hier tun. Aber ich wäre wirklich überrascht, wenn das noch der Fall war mit der heutigen microcode-Architekturen.
InformationsquelleAutor rsxjan | 2013-11-02
Schreibe einen Kommentar