andi

andi

Асемблер RISC-V Посилання

lyszt.net охоплює andi та інші інструкції RISC-V більш детально.

Формат кодування

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

Опис

andi виконує побітову операцію AND з константою. and приймає два регістри, а andi приймає регістр і безпосереднє значення — фіксоване значення, закодоване в інструкції. Літера i означає immediate (безпосереднє). Правило AND не змінюється: біт результату дорівнює 1 лише тоді, коли обидва вхідні біти дорівнюють 1, тому константа діє як маска, яка зберігає одні біти й очищає інші. Маскування та побітові операції описано на сторінці and.

Форму andi показано нижче. Вона виконує операцію AND над значенням у rs1 з константою imm і записує результат у rd.

andi rd, rs1, imm

Використовуйте її, коли заздалегідь відомо, які біти потрібно зберегти. Наступний рядок зберігає молодші 8 бітів t0 і очищає старші 24, видобуваючи один байт із більшого значення. Префікс 0x позначає шістнадцяткову константу.

andi t1, t0, 0xff

Константа має вміщатися в 12 бітів, тому вона не може виразити широку маску. Для більшої маски завантажте її в регістр за допомогою li і використайте and.

У посібнику RISC-V сказано, що 12-бітне безпосереднє значення перед операцією розширюється зі знаком до 32 бітів, тому в від’ємної константи всі старші біти встановлені. andi, ori і xori виконують побітову операцію над регістром rs1 і цим розширеним значенням та поміщають результат у rd.

Далі наведено два поширені випадки використання. Перший рядок зберігає лише молодший біт, який дорівнює 1 для непарних чисел і 0 для парних. Другий рядок дає остачу від ділення на 8, тому що беззнакова остача від ділення на степінь двійки — це молодші біти.

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

Приклад

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