16
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).

STOS I PROCEDURY - aragorn.pb.bialystok.plaragorn.pb.bialystok.pl/~teodora/AK/W4.pdfSTOS I PROCEDURY STRUKTURA I ORGANIZACJA STOSU (FILO- First In Last Out) Rejestry stosu: SS i SP

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

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

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