andi

andi

Asembler RISC-V Referencja

lyszt.net obejmuje andi i inne instrukcje RISC-V w większych szczegółach.

Format kodowania

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

Opis

andi wykonuje bitową operację AND ze stałą. and przyjmuje dwa rejestry, ale andi przyjmuje rejestr i wartość natychmiastową, stałą wartość zakodowaną w instrukcji. Litera i oznacza immediate (natychmiastową). Reguła AND pozostaje niezmieniona: bit wyniku jest równy 1 tylko wtedy, gdy oba bity wejściowe są równe 1, więc stała działa jak maska, która zachowuje niektóre bity, a inne zeruje. Maskowanie i operacje bitowe są omówione na stronie and.

Postać instrukcji andi pokazano poniżej. Wykonuje ona operację AND na wartości w rs1 ze stałą imm i zapisuje wynik do rd.

andi rd, rs1, imm

Użyj jej, gdy z góry wiesz, które bity chcesz zachować. Następna linia zachowuje najniższe 8 bitów t0 i zeruje górne 24, wyodrębniając jeden bajt z większej wartości. Prefiks 0x oznacza stałą szesnastkową.

andi t1, t0, 0xff

Stała musi mieścić się w 12 bitach, więc nie może wyrazić szerokiej maski. Dla większej maski załaduj ją do rejestru za pomocą li i użyj and.

Podręcznik RISC-V mówi, że 12-bitowa wartość natychmiastowa jest rozszerzana znakowo do 32 bitów przed operacją, więc ujemna stała ma ustawione wszystkie górne bity. andi, ori i xori wykonują operację bitową na rejestrze rs1 i tej rozszerzonej wartości, a wynik umieszczają w rd.

Poniżej przedstawiono dwa typowe zastosowania. Pierwsza linia zachowuje tylko najniższy bit, który wynosi 1 dla liczb nieparzystych i 0 dla parzystych. Druga linia daje resztę z dzielenia przez 8, ponieważ reszta bez znaku z dzielenia przez potęgę dwójki to najniższe bity.

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

Przykład

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