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