Angenommen, ein beliebiges Datenregister enthält den Wert '000E0015'. Wie kann ich die ersten 4 Bits (000E) in ein anderes Datenregister kopieren?68K Assembly, Kopieren der ersten 4 Bits eines Datenregisters
Antwort
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.
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
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?:)
- 1. 68K Assembly: Suche Nummer in Zahlen Datei
- 2. Mips Assembly Sprache isolierende Bits
- 3. 68k Assembly: Speichert die CPU das Statusregister bei Interrupt?
- 4. wie die Anzahl der 1/0-Bits in char [Assembly]
- 5. Iterieren Bits eines char
- 6. Assembly (TASM): die Summe bestimmter Bits in Bytes ausgeben
- 7. Wie viele Wörter passen in 4 Bits
- 8. Wie Integer.toBinaryString mindestens 4 Bits zurückgeben
- 9. Wenn else-Anweisung in 68k
- 10. Kopieren der ersten Zeichen in eine neue Zeichenfolge
- 11. Maximale Größe eines Arrays in 32 Bits?
- 12. 68000 Assembly: Multiplikation ergibt ein seltsames Ergebnis
- 13. Löschen von Bits in einem Register in Assembly
- 14. Kopieren DLL aus Assembly für die Bereitstellung
- 15. Lesen Bits aus der Datei
- 16. Nach dem ersten Null-Bit suchen (Assembly)?
- 17. Assembly Language - Division Overflow (4 Ziffern)
- 18. Erstellen eines "Kopieren-Button"
- 19. Berechnung der Bits benötigt
- 20. Kopieren von Bits von ulong zu lang in C#
- 21. Bedeutung von ORIG auf der ersten Zeile (16 Bits) von LC3
- 22. Sind die ersten 32 Bits eines MD5-Hashs genauso "zufällig" wie jede andere Teilkette?
- 23. Verilog: Speichern Sie Bits in einem bestimmten Bereich von Bits eines initialisierten Moduls
- 24. Was sind die ersten 32 Bits des Bruchteils dieses Floats?
- 25. C-Bit-Operationen/Kopieren eines Bits von einem Byte in ein anderes Byte
- 26. Setzen eines Bits der Bytea-Spalte mit Postgresql
- 27. Was ist der SHA-256 Hash eines einzelnen "1" Bits?
- 28. Haben verschiedene 68k-Simulatoren unterschiedliche TRAP-Aufgaben?
- 29. Maven Assembly - Aufruf der Assembly der Module
- 30. Sortieren eines Arrays von Namen in Assembly
Die ersten 4 Bits wären 0, Sie wollen eindeutig die oberen 16 Bits –