lb
lyszt.net tratta lb e altre istruzioni RISC-V in modo più dettagliato.
Formato di codifica
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)
