Sto provando a creare un sottoprogramma in assembly che disegnerà un quadrato sullo schermo. Non penso di poter passare parametri al sottoprogramma come farei in C++, quindi ho pensato che avrei potuto usare lo stack per memorizzare e accedere ai parametri (non posso usare i registri dati comuni perché ci sono troppe variabili per passaggio).assemblaggio x86: passare il parametro a una funzione tramite lo stack
Il problema è (Ricordo di aver letto da qualche parte) che quando uso il comando di chiamata all'indirizzo del "programma" corrente viene salvato nello stack, in modo che quando viene usato il comando "ret" saprebbe dove ritornare. Ma se immagazzino qualcosa nello stack e poi chiamo la funzione, dovrò salvare da qualche parte l'indirizzo (che è in cima allo stack) e quindi inserire in modo sicuro i parametri. Quindi, dopo che il codice è terminato e prima di chiamare "ret", dovrei respingere l'indirizzo.
Ho ragione? E, in caso affermativo, dove posso memorizzare l'indirizzo (non credo che l'indirizzo sia lungo solo 1 byte in modo che possa essere inserito in AX o BX o in qualsiasi altro registro dati). Posso usare IP per fare questo (anche se so che questo è usato per qualcos'altro)?
Questo è quello che immagino:
[BITS 16]
....
main:
mov ax,100b
push ax
call rectangle ;??--pushes on the stack the current address?
jml $
rectangle:
pop ax ;??--this is the addres of main right(where the call was made)?
pop bx ;??--this is the real 100b, right?
....
push ax
ret ;-uses the address saved in stack
Non è già utilizzato BP nel sottoprogramma per I don; so quale indirizzo? "Il registro BP a 16 bit aiuta principalmente a fare riferimento alle variabili dei parametri passate a una subroutine. L'indirizzo nel registro SS viene combinato con l'offset in BP per ottenere la posizione del parametro. BP può anche essere combinato con DI e SI come registro di base per indirizzamento speciale. ' (da http://www.tutorialspoint.com/assembly_programming/assembly_registers.htm) –
Perché [BP + 6]? So che [] sono usati quando si fa riferimento ad un indirizzo..e se BP è l'indirizzo della subroutine (credo) allora [BP + 6] punterà ad un comando dalla subroutine giusto? (Sono un po 'nuovo quindi posso sbagliarmi ..). E perché 6? (So che +1 significa ad esempio il prossimo indirizzo che può puntare a una var o qualcos'altro.) –
Quindi ..2 significa in realtà 2 byte, giusto? ... saltare oltre 2 byte non un intero indirizzo (anche se +1 significa saltare sopra un intero indirizzo qualunque sia la lunghezza in byte è ..). –