andi

andi

RISC-V Assembler Referenz

lyszt.net behandelt andi und andere RISC-V-Befehle ausführlicher.

Kodierungsformat

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Beschreibung

andi führt ein bitweises AND mit einer Konstante aus. and nimmt zwei Register, aber andi nimmt ein Register und einen Immediate, einen festen Wert, der in der Anweisung kodiert ist. Das i steht für immediate. Die AND-Regel bleibt unverändert: Ein Ergebnisbit ist nur dann 1, wenn beide Eingangsbits 1 sind, sodass die Konstante als Maske wirkt, die einige Bits beibehält und die anderen löscht. Maskierung und bitweise Operationen werden auf der and-Seite behandelt.

Die Form von andi ist unten dargestellt. Sie verknüpft den Wert in rs1 mit der Konstante imm per AND und schreibt das Ergebnis nach rd.

andi rd, rs1, imm

Verwende sie, wenn du im Voraus weißt, welche Bits beibehalten werden sollen. Die nächste Zeile behält die untersten 8 Bits von t0 und löscht die oberen 24, wodurch ein Byte aus einem größeren Wert extrahiert wird. Das Präfix 0x kennzeichnet eine hexadezimale Konstante.

andi t1, t0, 0xff

Die Konstante muss in 12 Bits passen, kann also keine breite Maske ausdrücken. Für eine größere Maske lade sie mit li in ein Register und verwende and.

Das RISC-V-Handbuch sagt, dass der 12-Bit-Immediate vor der Operation auf 32 Bits vorzeichenerweitert wird, sodass eine negative Konstante alle ihre oberen Bits gesetzt hat. andi, ori und xori führen die bitweise Operation auf dem Register rs1 und diesem erweiterten Wert aus und legen das Ergebnis in rd ab.

Zwei häufige Verwendungen folgen. Die erste Zeile unten behält nur das niedrigste Bit, das bei ungeraden Zahlen 1 und bei geraden Zahlen 0 ist. Die zweite Zeile gibt den Rest nach Division durch 8, weil ein vorzeichenloser Rest durch eine Zweierpotenz die niedrigsten Bits sind.

andi t1, t0, 1
andi t1, t0, 7

Beispiel

andi t1, t0, 0xff   # keep only the low byte