lh

lh

Асемблер RISC-V Посилання

lyszt.net охоплює lh та інші інструкції 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

Опис

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)