lb

lb

Assembly RISC-V Riferimento

lyszt.net tratta lb 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

lb legge un byte dalla memoria, che è la più piccola unità che un caricamento può recuperare. La memoria è costruita da byte, ogni byte è di 8 bit, e un indirizzo identifica un byte. lw legge 4 byte, lh ne legge 2, e lb ne legge 1. Usa lo stesso indirizzamento degli altri caricamenti: un registro base più un offset (vedi la pagina lw). La forma è mostrata di seguito.

lb rd, offset(rs1)

Un registro contiene 32 bit e un byte ne contiene 8, quindi i 24 bit superiori necessitano di un valore. lb esegue l'estensione del segno: copia il bit più alto del byte in tutti i bit superiori, mantenendo il valore come numero con segno. Un byte contenente -5 arriva come un -5 a 32 bit.

La scelta con segno/senza segno conta soprattutto per il testo, il dato a byte più comune, perché i codici dei caratteri sono senza segno. Molti codici dei caratteri hanno il bit più alto impostato. Caricarne uno con lb, che estende il segno, produce un numero negativo, e i confronti con codici di caratteri positivi ordinari falliscono. Usa lbu, load byte unsigned, per il testo; riempie i bit superiori con 0. Usa lb per dati con segno, come piccoli offset che possono essere positivi o negativi.

Il manuale RISC-V definisce lb e lbu come le versioni a 8 bit dei caricamenti di mezza parola, con lo stesso indirizzo effettivo del registro rs1 più l'offset a 12 bit esteso in segno. La memoria è indirizzata a byte, quindi un indirizzo identifica un byte.

I byte distano un indirizzo l'uno dall'altro, quindi un ciclo attraversa un array di byte aggiungendo 1 all'indirizzo. Un ciclo tipico legge un byte, controlla se è zero (il marcatore per la fine del testo), agisce su di esso e avanza l'indirizzo di 1.

Esempio

.data
val: .byte -5
.text
la t0, val
lb t1, 0(t0)   # t1 = -5 (sign-extended)