lw

lw

Asembler RISC-V Referencja

lyszt.net obejmuje lw i inne instrukcje RISC-V w większych szczegółach.

Format kodowania

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

Opis

lw kopiuje wartość z pamięci do rejestru. 32 rejestry tworzą mały, szybki obszar roboczy procesora. Pamięć znajduje się obok nich jako duży magazyn: długi rząd ponumerowanych slotów, który przechowuje tablice, tekst i zmienne. Numer slotu to jego adres. Obliczenia odbywają się w rejestrach, a dane czekają w pamięci między użyciami.

RISC-V wykonuje arytmetykę tylko na rejestrach, nigdy bezpośrednio na pamięci, więc wartość musi zostać załadowana do rejestru przed użyciem i zapisana z powrotem afterward. lw wykonuje ładowanie. Nazwa oznacza load word (załaduj słowo), a słowo to wartość 32-bitowa, szerokość jednego rejestru.

Postać lw pojawia się poniżej. Pobiera wartość z rs1, rejestru przechowującego adres pamięci zwany bazą, dodaje offset, małą stałą, i odczytuje wartość pod wynikowym adresem do rejestru docelowego rd.

lw rd, offset(rs1)

Następna linia ładuje wartość 8 bajtów za adresem w t0.

lw t1, 8(t0)

Podręcznik RISC-V nazywa RISC-V architekturą load-store: instrukcje ładowania i zapisu są jedynymi, które sięgają do pamięci, a instrukcje arytmetyczne działają wyłącznie na rejestrach. Przestrzeń adresowa ma 32 bity i jest adresowana bajtowo, a adres efektywny ładowania to rejestr rs1 plus 12-bitowy offset z rozszerzeniem znaku. Środowisko wykonawcze, czyli system, w którym działa program, decyduje, czy pamięć przechowuje najmniej znaczący bajt jako pierwszy, co nazywa się little-endian, czy najbardziej znaczący bajt jako pierwszy, co nazywa się big-endian. Dostęp jest naturalnie wyrównany, gdy jego adres dzieli się równo przez rozmiar dostępu, który dla słowa wynosi 4 bajty. Naturalnie wyrównane dostępy nigdy nie zgłaszają błędu wyrównania. Nie wyrównany dostęp zachowuje się tak, jak definiuje środowisko, i może działać bardzo wolno.

Offset jest tam, ponieważ elementy w pamięci znajdują się w regularnych odległościach. Słowo ma 4 bajty, więc kolejne elementy tablicy leżą 4 bajty od siebie, pod offsetami 0, 4, 8 i tak dalej. la umieszcza adres początkowy tablicy w rejestrze, a zmiana offsetu odczytuje różne elementy. Przykład ładuje dwóch sąsiadów tablicy. Offset 0 daje pierwszą wartość, 10, a offset 4 daje następną wartość, 20.

Przykład

.data
arr: .word 10, 20
.text
la t0, arr
lw t1, 0(t0)   # t1 = 10
lw t2, 4(t0)   # t2 = 20