Chiamata di funzioni e registri
Quando una funzione viene chiamata, parametri passati nel seguente ordine: RDI, RSI, RDX, RCX, R8, R9. I successivi nello stack.
Valori di ritorno memorizzati nei registri RAX, RDX.
Esempio
MOV 42, %RAX
RET
Quando una funzione viene chiamata, parametri passati nel seguente ordine: RDI, RSI, RDX, RCX, R8, R9. I successivi nello stack.
Valori di ritorno memorizzati nei registri RAX, RDX.
Esempio
MOV 42, %RAX
RET
Registri caller-save
Registri caller-save: RAX, RCX, RDX, RSI, RDI, R8 - R11.
Deve essere salvato dal chiamante se vuole preservarne il valore.
Se una funzione usa questi registri può sovrascriverli senza preoccupazioni.
PUSH %RCX
CALL SOMMA
POP %RCX
Registri callee-save
Registri callee-save: RBP, RBX, R12 - R15.
Preservato dalla funzione chiamata se viene modificato.
Se una funzione vuole usarli, deve salvare contenuto stack e ripristinarlo prima di restituire controllo.
SOMMA:
PUSH %RBX
POP %RBX
Maschere di bit
- Forzare bit a 1: ORL $0x80000000, %EAX
- Forzare bit a 0: ANDL $0x7FFFFFFF, %EAX
- Invertire ultimo bit: XORL $0x80000000, %EAX
- Azzera un registro: MOVQ $0, %RAX
- XORQ %RAX, %RAX
- Estrazione 3 bit meno significativi: 000...00111
- ANDL $7, %EAX
- Verificare che sono a zero: TESTL $7, %EAX
Manipolazione di array in Assembly
movq $0, %RCX
movq $ARRAY, %RAX
.loop
movq (%RAX, %RCX, 8), %RDX
addq $1, %RCX
cmpq $SIZE, %RCX
JNZ .loop
Oppure
movq $0, %RCX
Loop:
movq (, %RCX, 8), %RDX
addq $1, %RCX
cmpq $SIZE, %RCX
JNZ .Loop
Istruzioni per operare su stringhe
Istruzioni per operare su stringhe (buffer di dati).
Utilizzo registri:
- RCX: contatore numero di operazioni elementari da eseguire
- RSI: indirizzo sorgente
- RDI: indirizzo destinazione
- RAX: valore cui impostare la memoria
DF=0: operazione di copia in avanti.
DF=1: operazione di copia in indietro.
MOVS
movq $source, %rsi
movq $dest, %rdi
movq $size/8, %rcx
cld
movsq
Sposta dati da stringa a stringa.
STOS
movq $0x0, %rax
movq $dest, %rdi
movq $size/8, %rcx
cld
stosq
Store string.
Interazione busy waiting
outb %al, $device.bw
inb $device, %al
btb $0, %al
jnc .bw
Driver di periferica
Cancellazione della richiesta obbligatoria.
outb %al, $device_irq
DMAC può essere programmato con istruzioni dedicate.
INSX
Leggi 10 byte da device.
MOVQ $10, %RCX
MOVQ $DEST, %RDI
MOVQ $DEV_MEM, %DX
CLD
INSB
OUTSX
Scrivi 10 byte su device.
MOVQ $10, %RCX
MOVQ $DEST, %RSI
MOVQ $DEV_MEM, %DX
CLD
OUTSB
Disegni
- Busy Waiting (un solo flip flop status)
- Interruttore (una entrata opposta dell'altra)
- Daisy Chain (un solo IRQ)
Non si può effettuare altre interruzioni finché non finisce processo.
Ci possono essere altre situazioni (status & altri flip flop).