sw

sw

Asembler RISC-V Referencja

lyszt.net obejmuje sw 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

sw pobiera wartość z rejestru i zapisuje ją do pamięci, przeciwieństwo lw. Nazwa oznacza store word (zapisz słowo), a słowo ma 32 bity. Ładowania przenoszą dane z pamięci do rejestrów, aby można było na nich pracować, a zapisy odsyłają wyniki z powrotem. Te dwie instrukcje składają się na cykl ładowania, obliczania i zapisu w RISC-V, ponieważ arytmetyka odbywa się wyłącznie w rejestrach.

Składnia sw znajduje się poniżej. Kolejność operandów różni się od większości instrukcji.

sw rs2, offset(rs1)

rs2 przechowuje wartość do zapisania. Drugi operand, offset(rs1), podaje adres docelowy w pamięci: adres w rejestrze bazowym rs1 plus niewielki stały offset, ten sam sposób adresowania, którego używa lw. Poniższa linia zapisuje wartość z t1 pod adres przechowywany w t0.

sw t1, 0(t0)

sw pozostawia każdy rejestr bez zmian. Jego efekt dotyczy wyłącznie pamięci, podczas gdy niemal każda inna instrukcja zapisuje do rejestru.

Podręcznik RISC-V podaje, że sw, sh i sb zapisują do pamięci wartości 32-, 16- i 8-bitowe z dolnych bitów rejestru rs2. Adres efektywny to rejestr rs1 plus 12-bitowy offset z rozszerzeniem znaku. Ładowania i zapisy pod adresami naturalnie wyrównanymi nigdy nie zgłaszają błędu wyrównania, a podręcznik gwarantuje, że wykonują się atomowo, jako jeden niepodzielny krok.

Zapisy zachowują wyniki w tablicach i zmiennych, a funkcja używa ich do umieszczania wartości w swojej przestrzeni roboczej na stosie. Zapis nadpisuje wszystkie 4 bajty pod adresem docelowym. Przykład zapisuje 99 w oznaczonym miejscu w pamięci, zastępując to, co się tam znajdowało. Pamięć przechowuje tę wartość, dopóki inny zapis jej nie nadpisze, w przeciwieństwie do rejestru.

Przykład

la t0, slot
li t1, 99
sw t1, 0(t0)   # memory at slot now holds 99