slli

slli

RISC-V Assembler Referenz

lyszt.net behandelt slli 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

slli verschiebt Bits um einen festen Betrag nach links. Die Operation entspricht sll: Bits gleiten nach links, Nullen füllen die rechte Seite, Bits, die über den linken Rand hinausgehen, gehen verloren, und jede verschobene Stelle verdoppelt den Wert (die sll-Seite behandelt die Mechanik). Die Anweisung enthält die Verschiebedistanz als Konstante, sodass kein Register sie liefert. Das i bedeutet immediate (unmittelbar), was der Begriff für eine in die Anweisung geschriebene Konstante ist.

Die Form von slli erscheint unten, wobei amount eine feste Zahl von 0 bis 31 ist.

slli rd, rs1, amount

Die nächste Zeile verschiebt t0 um 3 Stellen nach links, was es mit 8 multipliziert.

slli t1, t0, 3

Arrays machen diese Anweisung häufig. Ein 32-Bit-Wert in einem Array belegt 4 Bytes, also liegt Element Nummer i i mal 4 Bytes vom Anfang entfernt, und eine Verschiebung nach links um 2 multipliziert mit 4. Das übliche Muster verschiebt den Index, um einen Byte-Offset zu erzeugen, addiert die Startadresse des Arrays und lädt dann den Wert. Diese Folge aus Verschieben, Addieren und Laden zu erkennen, hilft beim Lesen von Assembly, das von anderen geschrieben wurde.

Das RISC-V-Handbuch kodiert Verschiebungen um eine Konstante als Spezialisierung des I-Typ-Formats, eines der Standard-Anweisungslayouts. rs1 enthält den zu verschiebenden Operanden, und die unteren 5 Bits des Immediate-Felds enthalten den Verschiebebetrag. slli führt eine logische Verschiebung nach links aus, und Nullen treten in die unteren Bits ein.

Verwenden Sie slli, wenn die Verschiebedistanz beim Schreiben des Codes bekannt ist. Verwenden Sie sll, wenn der Betrag während der Programmausführung berechnet wird. Das Beispiel verschiebt 5 um 3 nach links, was 5 mal 8, also 40, ergibt.

Beispiel

li t0, 5
slli t1, t0, 3   # t1 = 5 << 3 = 40  (5 * 8)