lh
lyszt.net охоплює lh та інші інструкції RISC-V більш детально.
Формат кодування
Опис
lh завантажує півслово з пам'яті. Байт — це 8 бітів, і він має власну адресу, що робить його найменшою адресованою одиницею. Слово — це 4 байти, або 32 біти, а півслово — половина цього: 2 байти, або 16 бітів. lh читає 16 бітів там, де lw читає 32. Адресація збігається з lw: базовий регістр плюс сталий зсув (див. сторінку lw). Форма наведена нижче.
lh rd, offset(rs1)
Регістр містить 32 біти, тому 16-бітове завантаження має заповнити решту 16 бітів. lh використовує розширення знака. Вона читає старший біт 16-бітового значення, який позначає знак числа зі знаком, і копіює цей біт у всі 16 верхніх бітів регістра. Значення зберігає свій знак, тому 16-бітове -3 надходить як 32-бітове -3.
Використовуйте lh для знакових 16-бітових даних, як-от аудіосемпли або показання датчиків, які можуть бути від'ємними. Його партнер lhu, де u означає unsigned (беззнаковий), заповнює верх нулями, що підходить для даних, які ніколи не бувають від'ємними. Бітовий шаблон 0x8000, завантажений за допомогою lh, стає -32768, а завантажений за допомогою lhu — +32768. Біти в пам'яті залишаються тими самими, і саме завантаження визначає значення.
Посібник RISC-V визначає lh як завантаження 16-бітового значення з пам'яті та розширення його знаком до 32 бітів перед збереженням у rd. Ефективна адреса — це регістр rs1 плюс 12-бітовий зсув, розширений знаком. Доступ є природно вирівняним, коли його адреса ділиться на розмір доступу в байтах, тому доступ до півслова вирівняний за парними адресами.
Півслова займають 2 байти, тому масиви з них розташовуються за зсувами 0, 2, 4, а вказівник переміщується по них, додаючи 2.
Приклад
.data val: .half -5 .text la t0, val lh t1, 0(t0) # t1 = -5 (sign-extended)
