2016-10-13 3 views

Antwort

3

Sie müssen mehr Informationen für eine gute Antwort liefern.

Erstens ist 000E0015 ein 32-Bit-Wert. Die "ersten vier" Bits könnten die höchstwertigen Bits bedeuten, die 0, die sie führen. Oder es könnte bedeuten, die niedrigsten vier Bits, die 5. Oder Sie könnten bedeuten, was Sie tippten - die 000E-, die die ersten sechzehn Bits ist (jede Vier-Bit-Gruppe wird ein 'Nibble' genannt).

Zweitens, was ist Ihr gewünschter Endzustand? Wenn Sie mit 000E0015 in einem Register beginnen und XXXXXXXX im Zielregister haben, möchten Sie, dass es 000EXXXX ist, die Werte beibehalten? Geht es dir gut, dass es 000E0000 ist? Oder möchten Sie, dass das Register etwa 0000000E ist?

Ich nehme an, bis Sie anders angeben, dass Sie möchten, dass das zweite Register die 000E erhält, wie Sie sagen. In diesem Fall vorausgesetzt, Sie in d0 beginnen und wollen d1 gehen:

move.l d1,d0 
swap d1 

Dies wird die gesamte 32-Bit-Register d1 zuerst kopieren, dann wird es die Worte tauschen. d1 enthält 0015000E. Wenn Sie sie löschen möchten, könnten Sie AND d1 mit 0000FFFF. Wenn Sie wollen, dass sie alles enthalten, was sie vorher gemacht haben, könnten Sie zuerst den 0000000E in einem Zwischenregister vorbereiten, dann die niedrigen Bits durch AND mit FFFF0000 löschen, dann den 0000000E aus dem Zwischenregister mit einem ODER holen - aber ich bin es nicht ganz sicher was du genau brauchst.

+3

Jetzt sind es 20 Jahre, aber sollte das nicht 'move.l d0, d1' sein? Ziemlich sicher 68K verwendet das Ziel auf der rechten Seite. – unwind

1

Sie wollen das signifikanteste Wort, nicht die ersten 4 Bits, also die höchstwertigen 16 Bits des 32-Bit-Wertes. Es gibt einige Möglichkeiten, wie Sie dies tun können. Wenn Sie nur mit diesem Wort als Wort umgehen und alles andere im Datenregister ignorieren, können Sie Swap sicher verwenden.

move.l #$000E0015,d0 ; so this example makes sense :) 
move.l d0,d1 ; Move the WHOLE value into your target register 
swap d1 ; This will swap the upper and lower words of the register 

Danach d1 # $ 0015000E so enthalten, wenn Sie es nur als Wort Adresse, die Sie rein die $ 000E Teil des Datenregisters zugreifen.

move.w d1,$1234 ; Will store the value $000E at address $1234 

Nun, wenn Sie den Rest des Datenregisters zu verwenden planen oder führen Operationen mit oder auf diese, die über das erste Wort zu verlängern, müssen Sie sicherstellen, dass das obere Wort ist klar. Sie können dies genug, um leicht zu tun, 1. anstatt Swap zu verwenden, verwenden lsr.l

move.l #$000E0015,d0 ; so this example makes sense :) 
move.l d0,d1 ; Move the WHOLE value into your target register 
moveq #16,d2 ; Number of bits to move right by 
lsr.l d2,d1 ; Move Value in d1 right by number of bits specified in d2 

Sie nicht lsr.l # 16, d1 als der unmittelbare Wert von lsX.l ist begrenzt auf 8 verwenden können, aber Sie können Geben Sie bis zu 32 in einem anderen Register an und führen Sie die Operation auf diese Weise aus.

Ein sauberer (IMHO) Weg (es sei denn, Sie wiederholen diese Operation mehrere Male) wäre, AND zu verwenden, um das Register nach dem Austausch zu bereinigen.

move.l #$000E0015,d0 ; so this example makes sense :) 
move.l d0,d1   ; Move the WHOLE value into your target register 
swap d1   ; This will swap the upper and lower words of the register 
and.l #$ffff,d1  ; Mask off just the data we want 

Dadurch werden alle Bits aus dem d1-Register entfernt, die nicht in die logische Maske passen. Das IE-Bit ist sowohl in d1 als auch in dem angegebenen Muster wahr ($ ffff)

Schließlich, was ich denke, könnte der effizienteste und sauberste Weg zur Durchführung dieser Aufgabe wäre, Clr und Swap zu verwenden.

move.l #$000E0015,d0 ; so this example makes sense :) 
move.l d0,d1   ; Move the WHOLE value into your target register 
clr.w d1   ; clear the lower word of the data register 1st 
swap d1   ; This will swap the upper and lower words of the register 

Hoffe, dass diese Hilfe sind?:)

Verwandte Themen