3.9 KiB
Assembly
Useremo il RISC-V.
Esso è little-endian, ed è indirizzato a gruppi di 8 bit.
Registri
RISC-V ha a disposizione 32 registri da 64 bit, che vanno da x0
a x31
.
Un dato a 32 bit viene chiamato word, uno a 64 bit viene chiamato doubleword.
x0
: costantex1
: indirizzo risultatox2
: indirizzo della cima dello stackx3
: indirizzo dell'area di memoria con variabili globalix4
: indirizzo dell'area di memoria specifica del thread attivox5
: registro temporaneox6
: registro temporaneox7
: registro temporaneox8
: frame pointerx9
: registro salvato, può essere copiato in memoriax10
: argomento o risultato delle funzionix11
: argomento o risultato delle funzionix12
: argomento delle funzionix13
: argomento delle funzionix14
: argomento delle funzionix15
: argomento delle funzionix16
: argomento delle funzionix17
: argomento delle funzionix18
: registro salvato, può essere copiato in memoriax19
: registro salvato, può essere copiato in memoriax20
: registro salvato, può essere copiato in memoriax21
: registro salvato, può essere copiato in memoriax22
: registro salvato, può essere copiato in memoriax23
: registro salvato, può essere copiato in memoriax24
: registro salvato, può essere copiato in memoriax25
: registro salvato, può essere copiato in memoriax26
: registro salvato, può essere copiato in memoriax27
: registro salvato, può essere copiato in memoriax28
: registro temporaneox29
: registro temporaneox30
: registro temporaneox31
: registro temporaneo
Operazioni
Operazioni aritmetiche
Sono sempre formate da tre operandi: registro a cui il risultato verrà assegnato e gli argomenti dell'operazione.
add
: addizionesub
: sottrazioneaddi
: addizione di costanti
Esempio
add a, b, c
Equivalente Python
a = b + c
Operazioni di trasferimento dati
Permettono di caricre / scaricare dati dalla memoria.
Operazioni logiche
Consentono di effettuare operazioni di logica.
and
or
- ...
Operazioni di shift
Consentono di spostare i bit di un registro di alcune posizioni, moltiplicando o dividendo effettivamente per potenze di 2.
Operazioni condizionali
Consentono di saltare ad un'altra serie di istruzioni se certe condizioni si verificano.
blt
: minore di, signedbge
: maggiore di, signedbltu
: minore di, unsignedbgeu
: maggiore di, unsigned
Operazioni non-condizionali
Consentono di saltare ad un'altra serie di istruzioni in qualunque caso.
Chiamare una procedura
jal x1, ProcedureLabel
Salva l'indirizzo dell'istruzione successiva in x1, poi salta a ProcedureLabel.
Ritornare da una procedura
jalr x0, 0(x1)
Ritorna all'indirizzo puntato da x1
.
Memoria
Per accedere a una posizione in memoria, si usa offset(indirizzo)
.
Esempio
64(x22)
accede al 64° byte dopo la posizione di memoria archiviata in x22
.
Segni
E' possibile usare rappresentazione standard o a complemento-a-2.
Possiamo usare la sign extension quando abbiamo un dato che vogliamo portare a un numero di bit maggiore di quello che è.
Esempio
[0]101 0101 --> 0000 0000 [0]101 0101
[1]100 0000 --> 1111 1111 [1]100 0000
Operazioni di sincronizzazione
lr
: load reservedsc
: store conditional
Load reserved
lr rd, (rs1)
Non ho la minima idea di come funzioni.
Controlla se rs1
è bloccato; se sì, mette un valore != 0 in rd
...?
Forse... crea un lock in
rd
?
Store conditional
sc rd, rs2, (rs1)
Non ho la minima idea di come funzioni.
Copia il dato da rs2
a rs1
, se non è bloccato, e metti x0
in rd
...?
Carica un dato... se ho ancora il lock, altrimenti, metti
x0
inrd
.
Unlock
sd x0, 0(x20)