2016-11-08 11 views
0

Ich habe eine Frage bezüglich der MULU-Anweisung. Eine Sache, die ich bemerkt habe, ist, dass ich den Wert 000FFFFF in einem Datenregister habe. Und dann nehme ich an, ich möchte ein anderes F einfügen, so dass es 00FFFFFF enthält. Was ich in der Regel tun, ist das Datenregister multiplizieren mit 16 wie folgt:68000 Assembly: Multiplikation ergibt ein seltsames Ergebnis

MULU #16, D4 

Und dann füge ich eine weitere F durch den Befehl tun ADD (so erhalte ich 00FFFFFF). Aber wenn ich wieder bei 000FFFFF multipliziere, enden alle Bits innerhalb des Datenregisters auf Null (00000000). Danach multipliziere ich 000FFFF0 und dann folgt der Rest. Ich verstehe immer noch nicht den Grund dafür. Ich schaute this example auf und ich finde, dass es funktionieren sollte. Ich habe auch bemerkt, dass die Extend, Carry und Zero Bits alle auf true gehen, wenn ich einfach 1 zu 000FFFFF

+2

Was bedeutet _ „Aber wenn ich multipliziert wieder auf 000FFFFF“ _ bedeuten? Zeigen Sie uns die genaue Reihenfolge der Anweisungen. Warum verschiebst du nicht einfach um 4 nach links, anstatt um 16 zu multiplizieren? – Michael

+0

Sie haben Recht. Ich hätte die Multiplikation nicht verwenden sollen. Stattdessen ist das Verschieben um 4 nach links eine nette Lösung. Problem gelöst. –

Antwort

1

addiere Multiplikation nicht verwenden. Verwenden Sie stattdessen LSL.L # 4, (register) und das Ergebnis wird auf eine viel bessere Weise benötigt.

0

Ich glaube, der Grund für dieses Ergebnis liegt an der Begrenzung des Multiplikators in der 68000. IIRC kann nur 16-Bit-Werte behandeln, und wenn Sie beginnen, mit Werten darüber hinaus zu behandeln, erhalten Sie diese Art von Ergebnis.

Was andere angegeben haben, ist bei weitem die effizienteste Methode zur Multiplikation mit einem Wert mit einer Potenz von 2 (Linksverschiebung). Das Gleiche gilt für die Division, da eine Verschiebung nach rechts den Wert effektiv teilt.

Auch, wenn Sie mit signierten Werten arbeiten, stellen Sie sicher, dass Arithmetik verwenden Verschiebt anstatt logische Einsen das Zeichen (vor allem für die Division :)) zu erhalten

+0

Das stimmt. Diese Art der Multiplikation ergibt ein 32-Bit-Ergebnis. –

Verwandte Themen