Allora, il tuo problema è *ricevere* i parametri via stack, non passarli. E qui il problema è capire che convenzione di chiamata usi.
Le convenzioni più usate sono:
- la convenzione PASCAL: i parametri sono passati sullo stack, da sinistra verso destra; è la procedura chiamata che ripulisce lo stack. Esempio (a 16 bit): pow(base, esponente)
La procedura pow riceve uno stack siffatto (nell'8086 lo stack cresce verso il basso, e la cima è puntata dal registro SP):
- Codice: Seleziona tutto
<base>
<esponente>
<indirizzo di ritorno> <<-- qui punta SP
Per pulire lo stack, all'uscita della procedura, dobbiamo scartare 4 bytes (due word, una per ciascuno di base ed esponente). Quindi, al posto di RET usciremo con una RET 4
- convenzione C: i parametri sono passati sullo stack, da destra a sinistra; è il chiamante che pulisce lo stack. La situazione in entrata è:
- Codice: Seleziona tutto
<esponente>
<base>
<indirizzo di ritorno> <<-- qui punta SP
Si esce con una semplice RET: è il chiamante che toglierà le due word dallo stack (con un ADD ESP, 4, presumibilmente).
- convenzione "mista" PASCAL/C (molto, molto usata dalle API windows): si passano i parametri da destra a sinistra come nel C, si pulisce lo stack come nel PASCAL.
Per accedere ai parametri, di solito si crea uno stack frame. Ammesso sempre che siamo a 16 bit, e che non ci sia da dichiarare variabili locali, si fa così:
- Codice: Seleziona tutto
push BP ; salvo sullo stack il vecchio BP
mov BP, SP ; ora BP punta alla cima dello stack
la situazione dello stack a questo punto è:
- Codice: Seleziona tutto
- arg #1
- arg #2
- return address
- vecchio BP <- qui punta BP
Così posso accedere ai vari argomenti utilizzando BP:
- Codice: Seleziona tutto
mov AX, word ptr[BP+4] ; AX contiene ora arg#2
All'uscita della procedura, ripristinerò con un POP BP il vecchio BP prima del ritorno.
La creazione dello stack frame non è strettamente indispensabile (a 32 bit potrei accedere direttamente usando ESP), ma è una prassi piuttosto comoda (così posso fare push e pop in procedura senza preoccuparmi di come si "sposta" ESP).
Ciao.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...