lbu

lbu

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

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

Описание

lbu читает один байт (8 бит) из памяти как беззнаковое значение. Он работает в паре с lb, и они различаются только тем, как заполняют остальную часть регистра. Оба читают один байт, используя одну и ту же адресацию. Страница lb описывает байты и форму адресации. Форма lbu приведена ниже.

lbu rd, offset(rs1)

Регистр содержит 32 бита, поэтому загрузка 1 байта оставляет 24 бита для заполнения. lb копирует старший бит байта в эти биты, что является расширением знака и может дать отрицательное число. lbu заполняет их нулями, поэтому результат всегда находится между 0 и 255. Буква u означает беззнаковое чтение.

Загрузка текста обычно использует lbu. Коды символов беззнаковые, и у многих установлен старший бит, включая буквы с диакритическими знаками и различные символы. Расширяющий знак lb делает их отрицательными и нарушает сравнения. Стандартный текстовый цикл использует lbu. Он загружает байт, проверяет, равен ли он нулю, что обозначает конец текста, обрабатывает его и добавляет 1 к адресу.

Руководство RISC-V определяет lb и lbu как 8-битные версии загрузки полуслова с тем же эффективным адресом регистра rs1 плюс 12-битное смещение со знаком. Память адресуется побайтово, поэтому каждый адрес обозначает один байт.

lbu также подходит для других байтовых данных, включая цветовые каналы в изображениях, необработанные буферы данных и байты инструкций в интерпретаторе. Загруженные таким образом байты не имеют знака, поэтому они напрямую комбинируются со сдвигами и OR, когда большее значение восстанавливается из отдельных байтов. Используйте lb только тогда, когда 8-битные данные знаковые.

Пример

.data
val: .byte 0xff
.text
la t0, val
lbu t1, 0(t0)   # t1 = 255 (zero-extended)