lb
lyszt.net охоплює lb та інші інструкції RISC-V більш детально.
Формат кодування
Опис
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)
