lb

lb

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

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

Описание

lb читает один байт из памяти, который является наименьшей единицей, которую может извлечь загрузка. Память состоит из байтов, каждый байт — это 8 бит, и один адрес идентифицирует один байт. lw читает 4 байта, lh читает 2, а lb читает 1. Он использует ту же адресацию, что и другие загрузки: базовый регистр плюс смещение (см. страницу lw). Форма показана ниже.

lb rd, offset(rs1)

Регистр хранит 32 бита, а байт хранит 8, поэтому верхним 24 битам нужно значение. lb расширяет знак: он копирует верхний бит байта во все верхние биты, сохраняя значение как число со знаком. Байт, содержащий -5, приходит как 32-битное -5.

Выбор между знаковым и беззнаковым имеет наибольшее значение для текста, наиболее распространённых байтовых данных, потому что коды символов беззнаковые. У многих кодов символов установлен верхний бит. Загрузка такого кода с помощью расширяющего знак lb даёт отрицательное число, и сравнения с обычными положительными кодами символов тогда не срабатывают. Используйте lbu, загрузку байта без знака, для текста; она заполняет верхние биты нулями. Используйте lb для знаковых данных, таких как небольшие смещения, которые могут быть положительными или отрицательными.

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

Байты находятся на расстоянии одного адреса друг от друга, поэтому цикл проходит через массив байтов, добавляя 1 к адресу. Типичный цикл читает байт, проверяет, равен ли он нулю (маркер конца текста), выполняет над ним действие и увеличивает адрес на 1.

Пример

.data
val: .byte -5
.text
la t0, val
lb t1, 0(t0)   # t1 = -5 (sign-extended)