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