Reverse ein byte mit Assembler
Ich bin in einer Mikroprozessoren Klasse und wir sind mit Assembler in CodeWarrior-Programm ein 68HCS12 micro-controller. Unsere Aufgabe diese Woche ist, revers ein byte, also, wenn das byte war 00000001, der Ausgang wäre 10000000, oder 00101011 zu 11010100. Wir haben die assembly-Sprache verwenden, und uns wurde gesagt wir könnten rotiert und verschiebt (aber nicht ausschließlich!) um diese Aufgabe zu erfüllen. Ich bin wirklich ratlos, wo ich anfangen soll.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie entbehren können die 256 Byte zusätzlichen code-Größe, die eine lookup-Tabelle ist wahrscheinlich der effizienteste Weg, um reverse-byte auf eine 68HCS12. Aber ich bin mir ziemlich sicher, das ist nicht das, was Ihre Lehrer von Ihnen erwarten.
Für die "normale" Lösung, sollten die Datenbits einzeln. Dreht und verschiebt, können Sie zum verschieben der bits um. Für eine erste Lösung, die Isolation der acht bits (mit dem bitweisen "und" operations), verschieben Sie Sie in Ihre Ziel-Positionen (Verschiebungen, dreht sich...), dann kombinieren Sie Sie wieder zusammen (mit dem bitweisen "oder" - Operationen). Ist dies nicht der effizienteste oder einfachste Implementierung, aber Sie sollten zuerst konzentrieren sich auf immer ein korrektes Ergebnis -- Optimierung kann warten.
Hinweise: Wenn Sie eine Verschiebung, um ein bit verschoben wird, und eine null (wahrscheinlich) verschoben wird, in. Wo steht, dass verschoben aus bit gehen? Sie müssen, dass die Schicht in an das andere Ende der Ziel-register oder eine Speicheradresse.
Ich bin mir sicher, dass vor 25 Jahren konnte ich dies in Z80-Maschinensprache ohne assembler 🙂
Betrachten zwei Register, die als Stapel von bits. Was passiert, wenn Sie verschieben Sie ein bit zu einer Zeit von einem zum anderen?
Zunächst aus der Arbeit des Algorithmus für Sie tun, was Sie tun müssen. Express es als pseudo-code oder C oder einfachem Englisch oder Diagramme oder was auch immer Sie sind komfortabel mit. Sobald Sie geleert haben, diese konzeptionelle Hürde, die tatsächliche Umsetzung sollte Recht einfach sein.
Deine CPU hat vermutlich Anweisungen, mit denen Sie verschieben und/oder drehen ein register, darunter vielleicht das carry-flag als zusätzliches bit. Diese Anleitung wird sehr nützlich sein.
Wenn Sie mit der rechten shift, was war das niederwertigste bit geht in das carry-flag.
Wenn Sie drehen, wird das carry-flag wird verwendet, um füllen Sie das freie bit des Ergebnisses (LSB für eine ROL, MSB für eine ROR).
Zum Beispiel, wenn man im al die byte-Nummer der einfachste Weg ist
wir setzen 8 in ecx for-Schleife
In bl wir haben das Ergebnis, wir machen ebx, nur um zu sehen, was passiert, besser
In carry-flag jetzt haben Sie das Letzte bit von Links
nun fügen Sie in der bl, was Sie in sich tragen
und das ist alles
Dies war ein Kommentar, aber ich dachte WTH!
Platz zu sparen, über die 256-byte-Tabelle, die Sie haben können, einen 16-byte-Tabelle, die Werte für vier bits (nibbles) zu einem Zeitpunkt. Der Algorithmus wäre dann
Wenn ich ein prof würde ich sicherlich wie die beiden Teile, wo eine Verschiebung in der Indizierung und der andere außerhalb.
Hatte ich auch das Programm dieses bit-reverse für die Universität (für 8 bits). Hier ist, wie ich Tat:
Ich nicht, kommentierte es so hier ist, wie es funktioniert:
DH ist ein
1
die Reisen in die byte-wie das erste mal:00000001
; zweiten mal00000010
und so weiter. Wenn Sie eineAND
mit der AL erhalten Sie0
oder so etwas wie100
oder10000
Sie haben, dies zu verändern, um das Recht zu bekommen, als0
oder1
.Dann legen Sie es in BH und Umschalttaste an die gewünschte position, die
7
für byte0
,6
für byte1
und so weiter. DannOR
unsere endgültige Ergebnis und dieINC
undDEC
was notwendig ist. Vergessen Sie nicht, die bedingten Sprünge und popAX
für die next-Schleife 🙂Ergebnis wird in CH.