Ich versuche, eine 32-Bit-Zahl ohne Vorzeichen über die Register r18
, 19
, 20
und 21
, r18
die das höchstwertige Byte sind, mit 2 zu multiplizieren. Das ist mein Code:
ldi r18, 0x03
ldi r19, 0x00
ldi r20, 0x00
ldi r21, 0x00
lsl r18
ror r19
ror r20
ror r21
Ich habe gerade 3 für ein einfaches Beispiel verwendet, damit ich die Ausgabe kenne. Ich kann nicht herausfinden, ob es ror
oder rol
für den Rest der Register ist. Gilt dies für eine 16-Bit-Zahl, die Sie ror
zur Berücksichtigung eines Übertrags verwenden würden, auch für vorzeichenlose 32-Bit-Zahlen?
Soll ich ror
oder verwenden rol
?
Siehe AVR-Anweisungssatz- Dokument.
Für das niedrigstwertige Byte möchten Sie eine LSL – Logical Shift Left
. Verschieben Sie a 0
in das niedrigstwertige Bit und merken Sie sich das höchste Bit im Carry-Flag.
Dann möchten Sie für die nachfolgenden höheren Bytes eine ROL – Rotate Left trough Carry
. Sie verschieben das erinnerte Bit vom Übertrag in das rechte (niedrigstwertige) Bit und das Bit, das auf der hohen Seite verschoben wird, wird in den Übertrag geschoben.
Sie haben sich entschieden, R18 als LSB und R21 als MSB zu verwenden, daran ist nichts auszusetzen.
Lesen Sie das obige Bild von oben rechts (LSB wird zuerst verarbeitet) nach unten links.
Benutzer17592
0x06000000
, also wirdr19
throughr21
ungenutzt bleiben.0x03000000
ist daher zum Testen nicht wirklich sinnvoll. Verwenden0x42424242
Sie stattdessen etwas wie , von dem Sie auch die Ausgabe kennen würden. Bist du dir sicher, dassr18
es sich um MSB handelt? Ich bin mit AVR Assembly nicht vertraut, aber es sieht so aus, als wäre es das LSB.Sim
Benutzer17592
0x42424242
mit zwei ist auch ganz einfach, wäre nur0x84848484
;)Sim