Pamięć: wczytaj i przechowaj

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.

Wczytaj / zapisz kształt
lw t0, 0(a1) # t0 = pamięć pod adresem a1
sw 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.

Zapisywanie do pamięci
CPU
li t0, 0x11111111
li t1, 0x22222222
li a0, 0x1000
sw t0, 0(a0)
sw t1, 8(a0)
Registers
t00x00000000
t10x00000000
a00x00000000
Random Access Memory (RAM)
AddressValue
0x100C0x00000000
0x10080x00000000
0x10040x00000000
0x1000
0x00000000
0x0FFC0x00000000

Rejestry i pamięć zaczynają się od zera.

W animacji rejestr bazowy 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.

Zsumuj tablicę w pamięci
.data
nums: .word 10, 20, 30, 40 # cztery słowa
.text
la t1, nums # t1 = adres tablicy
li t2, 4 # licznik
li t0, 0 # suma bieżąca
loop:
beq t2, zero, done
lw t3, 0(t1) # wczytuje bieżący element
add t0, t0, t3 # dodaje do sumy
addi t1, t1, 4 # przechodzi do następnego słowa (4 bajty)
addi t2, t2, -1 # o jeden mniej
j loop
done:
mv a0, t0 # wypisuje sumę (100)
li a7, 1
ecall
li a7, 10
ecall

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.

💡
Użyj przełącznika HEX/DEC na pasku narzędzi symulatora, aby zmienić sposób wyświetlania adresów i wartości. Wybierz podstawę, która ułatwia śledzenie bieżącego kroku.