Главная »
RISC-V » 04. Загрузка и сохранение
Оглавление
§ Загрузка: LB,LH,LW,LBU,LHU
03: Load (Byte|Half|Word|ByteU|HalfU) Rd, Rs1, imm
------+-31---------------------+-19---15-+-14---12-+-11--------7-+-6------0-+
LB | imm[11:0] | rs1 | 000 | rd | 000_0011 |
LH | imm[11:0] | rs1 | 001 | rd | 000_0011 |
LW | imm[11:0] | rs1 | 010 | rd | 000_0011 |
LBU | imm[11:0] | rs1 | 100 | rd | 000_0011 |
LHU | imm[11:0] | rs1 | 101 | rd | 000_0011 |
------+------------------------+---------+-funct3--+-------------+----------+
Код:
addr = this.regs[rs1] + SIGN(I >> 20)
switch (funct3)
000: regs[rd] = SIGN8 (read_mem_8(addr))
001: regs[rd] = SIGN16(read_mem_16(addr))
010: regs[rd] = read_mem_32(addr)
100: regs[rd] = read_mem_8(addr)
101: regs[rd] = read_mem_16(addr)
Описание: Загрузка из памяти значений различной длины (1,2,4 байта). Для инструкции LB и LW знак расширяется до 32 бит, то есть по сути, копируется старший бит (либо 7-й, либо 15-й) на всю оставшуюся старшую часть 32-х битного числа. Инструкции LBU и LHU не имеют знакорасширения, потому старшие биты регистра, куда записывается прочитанное из памяти значение всегда равны 0. Адрес же вычисляется относительно некоторого регистра +/- смещение в 12 бит (это -2к...2k диапазон).
Важно: При записи WORD (4 байта), крайне строго надо следить, чтобы происходила запись только по выровненному на 4-х байтное значение адресу, иначе процессор будет выбрасывать исключение (Exception) "Misaligned Address" и программа завершится со сбоем.
§ Сохранение: SB,SH,SW
23: Store (Byte|Half|Word) Rs1, Rs2, imm
------+-31--------25-+-24---20-+-19---15-+-14---12-+-11--------7-+-6------0-+
SB | imm[11:5] | rs2 | rs1 | 000 | imm[4:0] | 010_0011 |
SH | imm[11:5] | rs2 | rs1 | 001 | imm[4:0] | 010_0011 |
SW | imm[11:5] | rs2 | rs1 | 010 | imm[4:0] | 010_0011 |
------+--------------+---------+---------+-funct3--+-------------+----------+
Код:
imms = ((I>> 25) << 5) | ((I >> 7) & 0x1F)
addr = regs[rs1] + SIGN12(imms)
switch (funct3)
000: write_8 (addr, regs[rs2])
001: write_16(addr, regs[rs2])
010: write_32(addr, regs[rs2])
Описание: В отличии от инструкции загрузки из памяти, при записи в память нет разделения на знаковые или беззнаковые значения. Записывается строго либо 1, либо 2, либо 4 байт. Причем, при записи 4 байта необходимо выравнивать адрес, как и в случае с загрузкой.