lbu

lbu

Assembly RISC-V Riferimento

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

lbu legge un byte (8 bit) dalla memoria come valore senza segno. Fa coppia con lb, e i due differiscono solo nel modo in cui riempiono il resto del registro. Entrambi leggono un byte usando lo stesso indirizzamento. La pagina lb copre i byte e la forma di indirizzamento. La forma di lbu è mostrata di seguito.

lbu rd, offset(rs1)

Un registro contiene 32 bit, quindi un caricamento di 1 byte lascia 24 bit da riempire. lb copia il bit più alto del byte in quei bit, il che è estensione del segno e può produrre un numero negativo. lbu li riempie con 0, quindi il risultato cade sempre tra 0 e 255. La u sta per la lettura senza segno.

I caricamenti di testo normalmente usano lbu. I codici dei caratteri sono senza segno, e molti hanno il bit più alto impostato, incluse le lettere accentate e vari simboli. Il lb con estensione del segno li rende negativi e rompe i confronti. Il ciclo di testo standard usa lbu. Carica un byte, controlla se è zero, il che segna la fine del testo, lo elabora e aggiunge 1 all'indirizzo.

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 di 12 bit esteso in segno. La memoria è indirizzata a byte, quindi ogni indirizzo indica un byte.

lbu si adatta anche ad altri dati a byte, inclusi i canali di colore nelle immagini, i buffer di dati grezzi e i byte di istruzione in un interprete. I byte caricati in questo modo non hanno segno da gestire, quindi si combinano direttamente con scorrimenti e OR quando un valore più grande viene ricostruito da singoli byte. Usa lb solo quando i dati a 8 bit sono con segno.

Esempio

.data
val: .byte 0xff
.text
la t0, val
lbu t1, 0(t0)   # t1 = 255 (zero-extended)