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 operand 16/32 (reg/mem) push ax push bh ;Nie! Push cf ; 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 operand 16/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 MOV dx, offset text CALL drukuj MOV ah, 4ch INT 21h ;to chyba jasne ; no to chyba teľ jasne - koäcz program 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 END mov bp, sp mov dx, [bp+2]; MOV ah,9 INT 21h drukuj ENDP
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 end 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 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.STACK.CODE MOV CX,1 MOV DX,2 PUSH CX DX 1234H 5678H CALL TST ADD SP,2 CALL TST MOV AH, 4CH INT 21H TST PROC pascal ARG X:word, Y:WORD, Z:DWORD MOV AX,X mov bx,y mov cx, word ptr z mov dx, word ptr z+2 RET TST ENDP END