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