sh

sh

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

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

Опис

sh записує півслово, 16 бітів або 2 байти, у пам'ять. Він відповідає завантаженням lh і lhu та зберігає вужчий розмір там, де sw зберігає повне слово. Форма показана нижче. Він бере значення з регістра-джерела rs2 і записує його молодші 16 бітів за адресою в базовому регістрі rs1 плюс зсув. Розкладка відповідає sw, з регістром-джерелом, указаним першим.

sh rs2, offset(rs1)

Регістр містить 32 біти, а зберігаються лише 16, тому sh зберігає молодші 16 і відкидає старші 16. У записів немає вибору між знаковим і беззнаковим. Цей вибір належить завантаженням, де вузьке значення потрібно розширити, щоб заповнити регістр, і для відсутніх бітів потрібне правило. Запис звужує значення, і збереження молодших бітів — єдина поведінка, яка має сенс. Якщо регістр містить значення, занадто велике для 16 бітів, зайві біти втрачаються без попередження, тому перевіряйте діапазон перед записом.

Посібник RISC-V каже, що sh зберігає молодші 16 бітів регістра rs2 у пам'ять за адресою rs1 плюс 12-бітний зсув зі знаком. Записи півслова за парними адресами природно вирівняні й ніколи не викликають помилку вирівнювання. Запис за адресою, яка не вирівняна природно, поводиться так, як визначає середовище виконання, і посібник каже, що він може виконуватися надзвичайно повільно.

sh записує будь-який 16-бітний формат, який lh і lhu читають назад, наприклад аудіозразки, 16-бітні дані пікселів і масиви півслів. Поширений шаблон — читання, зміна та запис. Завантажте півслово за допомогою lhu, скоригуйте його в регістрі та збережіть назад за допомогою sh. Змінюються лише цільові 2 байти, а байти навколо них залишаються як були. Півслова розташовані на відстані 2 байти одне від одного, тому цикли зсувають адресу на 2.

Приклад

la t0, slot
li t1, -5
sh t1, 0(t0)   # memory at slot now holds the low 16 bits of -5