mirror of
https://github.com/Steffo99/unisteffo.git
synced 2024-11-23 00:14:21 +00:00
3.4 KiB
3.4 KiB
Appunti
Registri
I registri sono divisi in tre tipi: di proprietà del chiamante, di proprietà del chiamato (anche se in realtà è solo una convenzione) e... gli altri.
Tutti i registri sono grandi 64 bit: possono quindi contenere una doubleword.
Proprietà del chiamante
Questi registri non devono essere sovrascritti quando viene chiamata una funzione, o se vengono sovrascritti, devono essere ripristinati prima che la funzione restituisca.
Essi sono:
s1..s11
: Saved registers, registri generici che possono essere usati per qualsiasi cosa.sp
: Stack Pointer, il primo indirizzo dello stack disponibile per la scrittura. Va decrementato quando si aggiunge qualcosa allo stack.fp
: Frame Pointer, punta all'inizio dello stack.
Proprietà del chiamato
Questi registri possono essere sovrascritti quando viene chiamata una funzione: bisogna salvarli in memoria prima di chiamarla!
Essi sono:
t0..t6
: Temporary registers, registri generici che possono essere usati per qualsiasi cosa.ra
: Return Address, l'indirizzo a cui continuare l'esecuzione del programma dopo aver terminato una funzione. Solitamente si usa solo conjal
ejalr
!a0..a7
: Function Arguments. Se all'interno di una funzione, contengono gli argomenti che sono stati passati. Se all'esterno di una funzione, contengono i valori restituiti dall'ultima funzione chiamata.
Altri
zero
: Zero, registro che vale sempre 0, anche dopo essere stato sovrascritto da altro. Come/dev/null
su Linux.gp
: Global Pointer, punta a un indirizzo (?)tp
: Thread Pointer, punta al thread-local storage (?)pc
: Program Counter, punta all'istruzione che sta venendo eseguita.
Comandi preprocessore
Scrivendo file assembly per RISC-V, è possibile aggiungere direttive per il preprocessore.
Per ora ho scoperto queste:
.global INDIRIZZO
: definisce l'indirizzo a cui inizia il programma. (Forse setta ilgp
a quell'indirizzo?).equ NOME, VALORE
: definisce una costante con uno specifico nome. Il nome delle costanti dovrebbe iniziare sempre con un underscore per convenzione..section [.data|.rodata|.bss|.text]
: marca l'inizio di una specifica sezione del programma. Le sezioni sono:.data
: Variabili del programma.rodata
: Variabili sola lettura del programma[.bss](https://en.wikipedia.org/wiki/.bss)
: Variabili statiche non costanti non inizializzate a nessun valore. A volte, vengono inizializzate a 0. Solo a volte. Dipende dall'OS..text
: Il testo del programma, con le istruzioni in assembly.
.TIPOVARIABILE
: crea una variabile di quel tipo e la inizializza a qualcosa.