STOS I PROCEDURY
Transkrypt
STOS I PROCEDURY
STOS I PROCEDURY STRUKTURA I ORGANIZACJA STOSU (FILO- First In Last Out) Rejestry stosu: SS i SP (Stack Segment i Stack Pointer) a) Stan początkowy b) Po załadowania pierwszego elementu (tu - zawartość AX) c) Po załadowania drugiego elementu (zawartość DS) d) Po odczytania drugiego elementu (zawartość DS) e) Po odczytania pierwszego elementu (zawartość AX). INSTRUKCJE STOSU 1 push operand16/32 (reg/mem) push ax push bh Push cf ;Nie! ; Nie! TABLICA dw 2000 dup (1234h) LICZBA dw ? push TABLICA[bx][si] ;wstaw na stos zawartość odpowiednie komórki pam push LICZBA ;wstaw na stos wartość zmiennej LICZBA push 0 ;zapisz zero na stosie push 20abh ;zapisz 20abh na stosie INSTRUKCJE STOSU 2 pop operand16/32 (reg/mem) TABLICA dw 1000 dup(?) LICZBA dw ? pop TABLICA[bx] ;zdejmij ze stosu wartość i wstaw do tablicy w miejsce ;skazane przez rejestr bx pop LICZBA ;zdejmij ze stosu wartość i wstaw do zmiennej LICZBA popa, popad pushf, pushfd/popf. popfd Procedury Deklaracja procedury: Nazwa PROC [typ]; tresc Ret Nazwa ENDP typ: NEAR (skok wewnętrzny/domyślny), FAR (skok między segmentami) Przykład: MOJA_PROCEDUURA PROC NEAR MOV AX,........ MOV .............. .................................... RET MOJA_PROCEDUURA ENDP !!! Wywołanie procedury: call Nazwa Przekazywanie parametrów Przez rejestry ➢Przykład..... Przez stos ➢przykład..... .model small .stack .data text db 'Ten tekst jest wyświetlany dzięki procedurze, która dostaje sw˘j parametr poprzez rejestr (DX)$' .code MOV ax, @data MOV ds, ax ;to chyba jasne MOV dx, offset text CALL drukuj MOV ah, 4ch ; no to chyba teľ jasne - koäcz© program INT 21h drukuj PROC MOV ah,9 INT 21h ; urochamiam funkcję... RET drukuj ENDP END .model small .stack .data text db 'Ten tekst jest wyświetlany dzięki procedurze, która dostaje swoj parametr poprzez STOS$' .code MOV ax, @data MOV ds, ax ;to chyba jasne push offset text; CALL drukuj MOV ah, 4ch ; no to chyba też jasne - kończę program INT 21h drukuj PROC mov bp, sp mov dx, [bp+2]; MOV ah,9 INT 21h drukuj ENDP END Zerowanie rejestrów /CIEKAWIE W CZYM RÓŹNICA?.../ mov ax,0 ;wpisanie wartości bezpośredniej, instrukcja zajmuje 5 bajtów xor ax,ax ;wykonanie instrukcji xor na dwu identycznych liczbach bitowych, w wyniku otrzymamy zero, instrukcja zajmuje 2 bajty sub ax,ax ;odjęcie ax od ax, w wyniku otrzymamy zero, instrukcja zajmuje 2 bajty and ax,0 ;iloczyn logiczny ax i 0, w wyniku otrzymamy zero, instrukcja zajmuje 3 bajty Procedury (dodatkowe) Pełna deklaracja procedury: Nazwa PROC [atrybuty] [Uses lista rejestrów] [,] [parametry [: definicja typu]...]; Atrybuty: Typ (dystans) (NEARDOMYŚLNE, FAR) Typ języka (STDSYSDOMYŚLNE, STDCALL, Pascal,C) Widoczność (PRIVATEDOMYŚLNE, PUBLIC) Lista rejestrów (Uses R1 R2 R3) Parametry (ARG A1 A2 A3) Przekazywanie parametrów 2 Przez globalne zmienny Dyrektywa ARG Przez globalne zmienny 1 .model small .data text db ‘Tekst po raz kolejny...$' .code MOV ax, @data MOV ds, ax MOV dx, offset text CALL drukuj MOV ah, 4ch INT 21h drukuj PROC MOV DX, OFFSET text MOV ah,9 INT 21h RET drukuj ENDP END Przez globalne zmienny 2 JAK PISAĆ WIELOMODUŁOWE PROGRAMY Main.asm >> main.obj Lib.asm >> lib.obj tlink main lib [, nazwa aplikacji] >> XXX.exe ;********* BIBLIOTEKA NASZA****** .model small kod segment public assume cs:kod, ds:dane ;************************************* ; MODUL GŁÓWNY PROGRAMU ;*********************************** .model small kod segment public assume cs:kod extrn druk: proc, bierz: proc, koniec:proc, znak:byte start: call bierz mov dl, znak call druk call koniec kod ends public druk,bierz,koniec, znak druk proc mov ah,2 int 21h ret druk endp bierz proc mov ah,1 int 21h mov znak,al ret bierz endp koniec proc mov ah, 4ch int 21h koniec endp end dane segment znak db ? dane ends kod ends end ;*********************************** ;********* BIBLIOTEKA NASZA****** ;*********************************** .model small .data znak db ? ;************************************* ; MODUL GŁÓWNY PROGRAMU ;*********************************** .model small .code extrn druk: proc, bierz: proc, koniec:proc, znak:byte start: call bierz mov dl, 13 call druk mov dl,10 call druk mov dl, znak call druk call koniec end .code public druk,bierz,koniec, znak druk proc mov ah,2 int 21h ret druk endp bierz proc mov ax, @data mov ds, ax mov ah,1 int 21h mov znak,al ret bierz endp koniec proc mov ah, 4ch int 21h ret koniec endp end Przekazywanie parametrów przez ARG Nazwa PROC [atrybuty] [Uses lista rejestrów] [,] [parametry [: definicja typu]...]; .MODEL SMALL TST PROC pascal ARG X:word, Z:DWORD Y:WORD, .STACK .CODE MOV AX,X MOV CX,1 mov bx,y MOV DX,2 mov cx, word ptr z PUSH CX DX 1234H 5678H mov dx, word ptr z+2 CALL TST RET ADD SP,2 TST ENDP CALL TST END MOV AH, 4CH INT 21H