Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[assembler8086] cerco aiuto per passaggio di parametri

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

[assembler8086] cerco aiuto per passaggio di parametri

Postdi umberto1211 » 25/05/09 18:56

Raga cerco esperto di assembler...ho bisogno di una mano per questo problema....

creare una sub che fa la potenza...che riceve come parametri la base e l'esponente ( dallo stack )e dà la risposta al programma principale mediante i registri

in pratica devo passare base ed esponente tramite lo Stack...ed è questo il punto che non so fare...x poi dare il risultato tramite registri...
umberto1211
Newbie
 
Post: 1
Iscritto il: 25/05/09 18:53

Sponsor
 

Re: [assembler8086] cerco aiuto per passaggio di parametri

Postdi zello » 26/05/09 14:04

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...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44


Torna a Programmazione


Topic correlati a "[assembler8086] cerco aiuto per passaggio di parametri":

Aiuto urgente!!!
Autore: templare77
Forum: Software Windows
Risposte: 0

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti