lw

lw

Assembly RISC-V Riferimento

lyszt.net tratta lw e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

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

Descrizione

lw copia un valore dalla memoria in un registro. I 32 registri formano la piccola e veloce area di lavoro del processore. La memoria si trova accanto ad essi come il grande deposito: una lunga fila di slot numerati che contiene array, testo e variabili. Il numero di uno slot è il suo indirizzo. Il calcolo avviene nei registri, e i dati attendono in memoria tra un uso e l'altro.

RISC-V esegue l'aritmetica solo sui registri, mai direttamente sulla memoria, quindi un valore deve essere caricato in un registro prima dell'uso e riscritto dopo. lw esegue il caricamento. Il nome significa load word, e una word è un valore a 32 bit, la larghezza di un registro.

La forma di lw appare di seguito. Prende il valore in rs1, un registro che contiene un indirizzo di memoria chiamato base, aggiunge offset, una piccola costante, e legge il valore all'indirizzo risultante nel registro di destinazione rd.

lw rd, offset(rs1)

La riga successiva carica il valore 8 byte oltre l'indirizzo in t0.

lw t1, 8(t0)

Il manuale RISC-V chiama RISC-V un'architettura load-store: le istruzioni di load e store sono le uniche che raggiungono la memoria, e le istruzioni aritmetiche lavorano solo sui registri. Lo spazio di indirizzamento è a 32 bit e indirizzato per byte, e l'indirizzo effettivo di un load è il registro rs1 più l'offset a 12 bit esteso con segno. L'ambiente di esecuzione, cioè il sistema in cui il programma viene eseguito, decide se la memoria contiene il byte meno significativo per primo, chiamato little-endian, o il byte più significativo per primo, chiamato big-endian. Un accesso è naturalmente allineato quando il suo indirizzo è divisibile per la dimensione dell'accesso, che è 4 byte per una word. Gli accessi naturalmente allineati non generano mai un errore di allineamento. Un accesso non allineato si comporta come definito dall'ambiente e può essere molto lento.

L'offset esiste perché gli elementi in memoria si trovano a distanze regolari. Una word è di 4 byte, quindi elementi consecutivi di un array distano 4 byte, agli offset 0, 4, 8 e così via. la mette l'indirizzo iniziale dell'array in un registro, e cambiare l'offset legge i diversi elementi. L'esempio carica due vicini di un array. L'offset 0 dà il primo valore, 10, e l'offset 4 dà il valore successivo, 20.

Esempio

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