Vertauschen Sie ein Byte mit der Assemblersprache

7

Ich bin in einer Mikroprozessorklasse und wir verwenden eine Assemblersprache in Freescale CodeWarrior, um einen 68HCS12 Mikrocontroller zu programmieren. Unsere Aufgabe in dieser Woche besteht darin, ein Byte umzukehren. Wenn das Byte also 00000001 wäre, wäre die Ausgabe 10000000 oder 00101011 bis 11010100. Wir müssen die Assemblersprache verwenden und uns wurde gesagt, wir könnten rotieren und schalten (aber nicht beschränkt auf!). ) um diese Aufgabe zu erfüllen. Ich bin wirklich ratlos, wo ich anfangen soll.

    
dohlfhauldhagen 07.02.2011, 17:00
quelle

8 Antworten

6

Wenn Sie die zusätzliche 256-Byte-Codegröße ersparen können, ist eine Nachschlagetabelle wahrscheinlich die effizienteste Möglichkeit, ein Byte auf einem 68HCS12 umzukehren. Aber ich bin mir ziemlich sicher, dass dies nicht erwartet wird.

Für die "normale" Lösung betrachten Sie die Datenbits einzeln. Durch Drehen und Verschieben können Sie Bits verschieben. Für eine erste Lösung, isoliere die acht Bits (mit bitweisen "und" Operationen), verschiebe sie zu ihren Zielpositionen (Verschiebungen, rotiert ...), kombiniere sie dann wieder (mit bitweisen "oder" Operationen). Dies ist nicht die effizienteste oder einfachste Implementierung, aber Sie sollten sich zunächst darauf konzentrieren, ein korrektes Ergebnis zu erhalten - die Optimierung kann warten.

    
Thomas Pornin 07.02.2011, 17:19
quelle
8

Hinweise: Wenn Sie eine Verschiebung machen, wird ein Bit verschoben und eine Null (wahrscheinlich) wird hineingeschoben. Wohin geht das verschobene Bit? Sie müssen dies an das andere Ende des Zielregisters oder der Speicheradresse verschieben.

Ich bin mir sicher, dass ich das vor 25 Jahren im Z80-Maschinencode ohne Assembler machen konnte:)

    
Spacedman 07.02.2011 17:11
quelle
7

Betrachte zwei Register als Stapel von Bits. Was passiert, wenn Sie jeweils ein Bit von einem zum anderen bewegen?

    
bdonlan 07.02.2011 17:08
quelle
3

Erfinde zuerst den Algorithmus , um das zu tun, was du tun musst. Express es als Pseudo-Code oder C oder einfach Englisch oder Diagramme oder was auch immer Sie sich wohl fühlen. Sobald Sie diese konzeptionelle Hürde genommen haben, sollte die tatsächliche Implementierung ziemlich einfach sein.

Ihre CPU hat wahrscheinlich Befehle, mit denen Sie ein Register verschieben und / oder drehen können, möglicherweise mit dem Übertrags-Flag als zusätzliches Bit. Diese Anweisungen werden sehr nützlich sein.

    
Paul R 07.02.2011 17:08
quelle
3

Wenn Sie eine Rechtsverschiebung vornehmen, wird das niedrigstwertige Bit in das Übertrags-Flag übernommen.

Wenn Sie eine Rotation durchführen, wird das Übertrags-Flag verwendet, um das freie Bit des Ergebnisses (LSB für eine ROL, MSB für eine ROR) zu füllen.

    
Jerry Coffin 07.02.2011 17:10
quelle
2

Wenn Sie zB die Bytenummer haben, ist der einfachste Weg

%Vor%

Wir setzen 8 in ecx für Schleife

%Vor%

In bl werden wir das Ergebnis haben, wir werden ebx machen, nur um zu sehen, was besser passiert

%Vor%

In carry flag haben Sie jetzt das letzte Bit von links

%Vor%

jetzt fügen Sie in bl was Sie in tragen haben

hinzu %Vor%

und das ist alles

    
Adi Bârsan 21.11.2017 07:03
quelle
1

Das war ein Kommentar, aber ich dachte WTH!

Um Speicherplatz in der 256-Byte-Tabelle zu sparen, können Sie eine 16-Byte-Tabelle mit den Werten für vier Bits (Nibbles) gleichzeitig erstellen. Der Algorithmus wäre dann

%Vor%

Wenn ich ein Prof wäre, würde ich sicherlich die zwei Teile mögen, wo eine Verschiebung in der Indizierung und die andere draußen ist.

    
Olof Forshell 09.02.2011 07:45
quelle
0

Ich musste dieses Bit auch umgekehrt für die Universität programmieren (für 8 Bits). So habe ich es gemacht:

%Vor%

Ich habe es nicht kommentiert, also hier ist, wie es funktioniert: DH ist ein 1 , das wie beim ersten Mal im Byte wandert: 00000001 ; zweites Mal 00000010 und so weiter. Wenn du AND mit dem AL erstellst, bekommst du 0 oder etwas wie 100 oder 10000 musst du nach rechts verschieben, um es als 0 oder 1 zu bekommen. Dann setze es in BH und verschiebe es an die gewünschte Position, die 7 für Byte 0 , 6 für Byte 1 und so weiter ist. Dann OR zu unserem Endergebnis und INC und DEC , was notwendig ist. Vergessen Sie nicht die bedingten Sprünge und setzen Sie AX für die nächste Schleife:)

Ergebnis wird in CH sein.

    
Laurent Meyer 03.04.2015 14:17
quelle