and

and

RISC-V Ассемблер Ссылка

lyszt.net охватывает and и другие инструкции 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

Описание

and — это побитовая инструкция. Регистр хранит 32 бита, то есть 32 отдельных нуля и единицы подряд. Побитовая инструкция применяет свою операцию ко всем 32 позициям независимо, и между позициями не передаётся перенос.

На отдельном бите AND даёт 1 только тогда, когда оба входных бита равны 1, и 0 в противном случае. Приведённая ниже форма применяет это правило ко всем 32 позициям, сравнивая rs1 и rs2 и записывая результат в rd.

and rd, rs1, rs2

AND используется для маскирования, которое сохраняет одни биты и очищает другие. Там, где в маске стоит 1, исходный бит остаётся. Там, где в маске стоит 0, результат равен 0. Применение AND к значению с маской 00001111 сохраняет младшие четыре бита и очищает остальные. Маскирование извлекает одно поле из значения, в котором упаковано несколько полей.

В руководстве RISC-V and, or и xor перечислены среди операций регистр-регистр. Все они читают регистры-источники rs1 и rs2, записывают результат в регистр-приёмник rd и выполняют побитовые логические операции.

В примере 0b1100 (префикс 0b обозначает двоичные цифры) объединяется операцией AND с 0b1010. У обоих входов 1 стоит только в самой левой позиции, поэтому результат равен 0b1000, и он записывается в t2.

Пример

li t0, 0b1100
li t1, 0b1010
and t2, t0, t1   # t2 = 0b1000