extrn Cancella:near extrn KeyWait:near ;definiamo il segmento text segment public ;inizio del programma start: call Cancella call prc call KeyWait mov ah,4ch int 21H prc proc near push bp mov bp,sp ;crea la variabile locale sub sp,2 mov [bp-2],41h mov ah,0eh mov al,[bp-2] int 10h ;cancella la variabile locale mov sp,bp pop bp ret prc endp text ends stack segment para stack db 1024 dup(00H) stack ends end startEcco. Molto semplice.
Una volta create le variabili locali è fondamentale resettare lo SP quando si chiude la procedura riportandolo al valore contenuto in BP.
Quindi la locazione puntata da BP è quella che separa, nello stack, i parametri dalle variabili locali.
Cerchiamo di costruire un programma che usi sia parametri sia variabili locali, in modo da studiarne lo stack.
extrn Cancella:near extrn KeyWait:near ;definiamo il segmento text segment public ;inizio del programma start: call Cancella mov al,'A' push ax call prc call KeyWait mov ah,4ch int 21H prc proc near push bp mov bp,sp ;crea la variabile locale. sub sp,2 mov [bp-2],2 mov ax,[bp+4] add ax,[bp-2] mov ah,0eh int 10h ;cancella la variabile locale mov sp,bp pop bp ret 2 prc endp text ends stack segment para stack db 1024 dup(00H) stack ends end startEcco: il parametro passato è la lettera A. La variabile locale è 2.
La procedura aggiunge la variabile locale al parametro ottenendo 42H, ossia la lettera C, che stampa a video.
Funziona:
C c:\Assembly>
Vediamo un po' come è congegnato lo stack con parametri, variabili locali, indirizzo di ritorno e BP originario salvato:
AX=0041 BX=0000 CX=0440 DX=0000 SP=03FC BP=0000 SI=0000 DI=0000 DS=1771 ES=1771 SS=1785 CS=1781 IP=0010 NV UP EI PL NZ NA PO NC 1781:0010 55 PUSH BP -p AX=0041 BX=0000 CX=0440 DX=0000 SP=03FA BP=0000 SI=0000 DI=0000 DS=1771 ES=1771 SS=1785 CS=1781 IP=0011 NV UP EI PL NZ NA PO NC 1781:0011 8BEC MOV BP,SP -p AX=0041 BX=0000 CX=0440 DX=0000 SP=03FA BP=03FA SI=0000 DI=0000 DS=1771 ES=1771 SS=1785 CS=1781 IP=0013 NV UP EI PL NZ NA PO NC 1781:0013 83EC02 SUB SP,+02 -p AX=0041 BX=0000 CX=0440 DX=0000 SP=03F8 BP=03FA SI=0000 DI=0000 DS=1771 ES=1771 SS=1785 CS=1781 IP=0016 NV UP EI PL NZ NA PO NC 1781:0016 C746FE0200 MOV WORD PTR [BP-02],0002 SS:03F8=3302 -p AX=0041 BX=0000 CX=0440 DX=0000 SP=03F8 BP=03FA SI=0000 DI=0000 DS=1771 ES=1771 SS=1785 CS=1781 IP=001B NV UP EI PL NZ NA PO NC 1781:001B 8B4604 MOV AX,[BP+04] SS:03FE=0041 - -d ss:03f0 1785:03F0 FA 03 1E 00 81 17 C4 11-02 00 00 00 09 00 41 00 ..............A. 1785:0400 C2 02 00 00 55 8B EC 57-56 8B 7E 04 39 3E 7C 01 ....U..WV.~.9>|. 1785:0410 75 06 C7 06 7E 01 FF FF-39 3E 80 01 75 05 6A 00 u...~...9>..u.j. 1785:0420 E8 0F 12 6B DF 0E 8B B7-2E 4B C1 E6 02 03 36 B4 ...k.....K....6. 1785:0430 52 EB 18 8B C6 2B 06 B4-52 C1 F8 02 50 E8 66 A1 R....+..R...P.f. 1785:0440 8B 04 C1 E0 02 03 06 B4-52 8B F0 83 3C FF 75 E3 ........R...<.u. 1785:0450 6B DF 0E C7 87 2E 4B FF-FF 33 C0 5E 5F C9 C2 02 k.....K..3.^_... 1785:0460 00 00 55 8B EC 56 8B 5E-04 6B DB 0E 8D 87 2E 4B ..U..V.^.k.....K -Ecco: SP punta la variabile locale, BP punta il suo valore originario salvato nello stack.
Nessun commento:
Posta un commento