Tra chi devi passare i parametri ?
tra assembler e assembler o tra assembler e c++.
se il passaggio dei parametri riguarda 2 programmi assembler
puoi fare in diversi modi:
metodo 1:
Codice: Seleziona tutto
mov dx,offset array
xor ax,ax
mov ax,numero elementi
push ax
push dx
ricorda questo metodo va usato se hai un solo segmento dati !
metodo 2
Codice: Seleziona tutto
mov ds,seg array
mov dx,offset array
xor ax,ax
mov ax,numero elementi
push ax
push dx
push ds
questo sistema va usato se usi più segmenti dati
ricordati che quando estrai dallo stack i parametri devono essere letti a partire dall'ultimo dato inserito.
quando estrai i parametri il registro bp serve per "scavalcare" i vari dati che stanno nello stack
esempio
bp+0 sta ad indicare la posizione iniziale dello stack che nel assembler 8086 16 bit viene indirizzato dalla coppia di registri sp:bp dove sp e il segmento e bp l'offset.
bp+2 "scarta" il primo byte contenuto nello stack e quando eseguirai la pop andra' a prendersi i successivi byte
esempio di ripristino parametri per il metodo 1:
mov ax,@stack
mov sp,ax ; io la includo anche se normalmente queste 2 istruzioni vanno ad inizio del sorgente.
pop dx ;prelevo l'offset dell'array o della stringa che avevo salvato
pop ax ;prelevo dallo stack il numero di elementi dell'array o il carattere di controllo che avevo salvato
metodo 1 con scarto di un parametro
mov ax,@stack
mov sp,ax ; io la includo anche se normalmente queste 2 istruzioni vanno ad inizio del sorgente.
mov bp,sp
add bp,4 ;questo fa si che il primo parametro presente nello stack sia scartato ho usato bp+4 perche un offset e una word se inveve fosse stato un byte avrei dovuto usare bp+2
pop ax ;prelevo dallo stack il numero di elementi dell'array o il carattere di controllo che avevo
per il repristino dal metodo 2 valgono grosso modo le stesse regole del repristino del metodo 1 so che se vorrai scartare la stringa dovrai fare un bp+8 perche sia segmento che offset sono di tipo word.
-----------------------------------------------------------------------------------------------------------------
se invece vuoi scambiare i parametri tra un programma assembler e un programma c++ la procedura più semplice e la seguente:
nel sorgente c++
definisci la funzione nel seguente modo:
extern "C" _int stdcall mia_funzione(int*a,int *b); questa va nel prototipo di funzione
int c;
c=mia_funzione(4,5);
nel sorgente assembler
quando definisci la funzione fai:
mia_funzione proc Arg1:dword,Arg2:dword
mov esi,Arg2 ; serve per prendere i parametri
mov edi,Arg1
................
................
push edi
push esi
; adesso se i parametri sono stati modificati dovrai fare usare una ret 8 altrimenti se non sono stati modificati usa una ret
spero di esserti stato d'aiuto
ricordati che in eax sara' contenuto il valore di ritorno della funzione quindi prima della ret impostalo ad un valore a te gradito di solito 0 se la funzione va a bun fine 1 se c'è stato un errore.