1
Fork 0
mirror of https://github.com/Steffo99/unisteffo.git synced 2024-11-23 00:14:21 +00:00
triennale-appunti-steffo/public/materials/year1/architettura/8_appunti_e_deduzioni.md

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 con jal e jalr!
  • 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 il gp 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.

Link utili