Upload
dinhngoc
View
214
Download
0
Embed Size (px)
Citation preview
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 ;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
pusha (wszystkie rejestry bez segmentowych), pushad (dla 32b rejestry)
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
.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)
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
Main.asm >> main.obj
Lib.asm >> lib.obj
tlink main lib [, nazwa aplikacji] >> XXX.exe
JAK PISAĆ WIELOMODUŁOWE PROGRAMY
;************************************* ; 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
;********* BIBLIOTEKA NASZA******
.model small kod segment public assume cs:kod, ds:dane 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
;************************************* ; 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
;*********************************** ;********* BIBLIOTEKA NASZA****** ;*********************************** .model small .data znak db ? .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
.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
Nazwa PROC [atrybuty]
[Uses lista rejestrów] [,]
[parametry [: definicja typu]...];
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