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)