Pamięć: wczytaj i przechowaj
Pamięć to duży rząd ponumerowanych komórek pamięci, a każda komórka przechowuje jeden bajt (8 bitów). Numer komórki to jej adres. Rejestry to niewielki zestaw szybkich komórek procesora. Pamięć jest znacznie większa, ale wolniejsza, i przechowuje wszystko, co nie mieści się w rejestrach, takie jak tablice i łańcuchy znaków. Aby pracować z wartością w pamięci, wczytujesz ją do rejestru, zmieniasz i zapisujesz z powrotem.
Rejestrów jest niewiele, a pamięć jest duża. (load word) kopiuje słowo z pamięci do rejestru, a (store word) kopiuje je z powrotem. Adres jest zapisywany jako offset(register).
Pamięć RISC-V jest adresowana bajtowo, więc każdy bajt ma swój własny adres w sekwencji. Słowo ma 32 bity, czyli 4 bajty, więc przesuwasz wskaźnik pamięci o 4, aby dotrzeć do następnego słowa. Dlatego przesunięcia tablic wynoszą 0, 4, 8 i tak dalej. W prawdziwym sprzęcie wczytanie słowa z adresu, który nie jest wielokrotnością 4, może być wolne lub może spowodować pułapkę. Ten symulator na to pozwala, ale powinieneś wyrobić nawyk wyrównywania słów do 4 bajtów.
lw t0, 0(a1) # t0 = pamięć pod adresem a1sw t0, 4(a1) # pamięć pod adresem a1+4 = t0
W offset(register) do adresu przechowywanego w rejestrze dodawana jest mała liczba przesunięcia. 0(a1) to adres w samym a1, a 4(a1) to 4 bajty dalej. Pozwala to sięgać do pobliskich wartości bez zmiany rejestru bazowego.
| Address | Value |
|---|---|
| 0x100C | 0x00000000 |
| 0x1008 | 0x00000000 |
| 0x1004 | 0x00000000 |
| 0x1000 | 0x00000000 |
| 0x0FFC | 0x00000000 |
Rejestry i pamięć zaczynają się od zera.
a0 pozostaje taki sam. Zwiększa się tylko dosłowne przesunięcie zapisane w instrukcji, przechodząc do następnego docelowego adresu pamięci.
Aby utworzyć pamięć pasującą do tego wzorca, zarezerwuj nazwaną pamięć w sekcji danych za pomocą .word (jedna lub więcej wartości 32-bitowych) lub .space N (N pustych bajtów). Każde słowo ma 4 bajty, więc kolejne elementy znajdują się pod przesunięciami 0, 4, 8, które są tymi samymi liczbami używanymi w instrukcjach zapisu.Użyj .word (jedna lub więcej wartości 32-bitowych) lub .space N (N pustych bajtów), aby zarezerwować nazwaną pamięć w sekcji danych. Każde słowo zajmuje 4 bajty, więc kolejne elementy znajdują się pod przesunięciami 0, 4, 8 i tak dalej.
.datanums: .word 10, 20, 30, 40 # cztery słowa.textla t1, nums # t1 = adres tablicyli t2, 4 # licznikli t0, 0 # suma bieżącaloop:beq t2, zero, donelw t3, 0(t1) # wczytuje bieżący elementadd t0, t0, t3 # dodaje do sumyaddi t1, t1, 4 # przechodzi do następnego słowa (4 bajty)addi t2, t2, -1 # o jeden mniejj loopdone:mv a0, t0 # wypisuje sumę (100)li a7, 1ecallli a7, 10ecall
umieszcza adres tablicy w t1, t2 zlicza 4 pozostałe elementy, a t0 przechowuje bieżącą sumę. W każdym przebiegu zatrzymuje pętlę, gdy nie pozostają żadne elementy. wczytuje element, na który wskazuje t1, dodaje go do sumy, przesuwa wskaźnik o jedno słowo, a zmniejsza licznik. Po wszystkich czterech elementach (10 + 20 + 30 + 40) done wypisuje 100.
