| STATYSTYKI |
Od 06.09.2000
|
Optymalizacja: 1024x768, IE5 |
|
| Procedury i makroinstrukcje |
Procedury
Deklaracja procedury wygląda następująco:
Nazwa PROC
;.........tresc
ret
ENDP
lub
Nazwa PROC
;.........tresc
ret
Nazwa ENDP
Instrukcja ret informuje procesor, że ma wrócić do miejca wywołania procedury. Jeśli zapomnimy o tej instrukcji, to procesor "rozbiegnie się" po pamięci.
W procedurze zmieniane są raczej wartości rejestrów. Jeśli zależy nam na tym. aby rejestry zostały niezmienione po zakończeniu procedury, to na jej początku musimy je zachować na stosie (instrukcje push) i zdjąć je ze stosu (instrukcje pop) tuż przed instrukcją ret.
Procedurę wywołujemy przy pomocy instrukcji call, której parametrem jest zazwyczaj nazwa procedury, tzn. call Nazwa .
Po wykonaniu procedury, tuż przed instrukcją ret należy zostawić stos takim jakim go zastaliśmy przy wejściu do procedury. W przeciwnym razie program może wrócić w zupełnie inne miejsce niż to z którego przyszedł (może wpaść w "czarną dziurę"), chyba że na tym nam zależy, bądź jest to przez nas celowo zamierzone.
Procesor musi wiedzieć, gdzie ma wrócić po wykonaniu procedury. W przypadku call jest to realizowane w następujący sposób: na stosie jest odkładna wartość rejestru segmentu kodu CS, a nstępnie wartość wskaźnika instrukcji IP; wykonany jest skok do procedury; po napotkaniu instrukcji ret ze stosu jest zdejmowany IP i CS i następuje powrót do CS:IP.
Makroinstrukcje
Makroinstrukcja jest to zbiór(sekwencja) instrukcji assemblera oznaczonych jedną nazwą. Jeżeli w kodzie programu użyjemy nazwy makra, to kompilator wstawi automatycznie taką sekwencję w miejscu wywołania.
Deklaracja makroinstrukcji wygląda następująco:
Nazwa MACRO lista parametrow
;........tresc, sekwencja instrukcji
ENDM
Parametrami mogą być: wartości natychmiastowe, stringi, rejestry lub komórki pamięci.
Jeżeli w makroinstrukcji używamy kilkakrotnie jakiejś etykiety, to musimy użyć tutaj dyrektywę LOCAL. Informuje ona assembler, że etykieta (wskazana jako parametr local) ma być widoczna tylko w makroinstrukcji. Dyrektywy LOCAL używamy bezpośrednio po nagłówku, np.:
Opoznienie MACRO czas
LOCAL etykieta
push cx
mov cx,czas
etykieta:
loop etykieta
pop cx
ENDM
Dyrektywy powtórzeń
Umożliwiają one łatwe deklarowanie szeregu takich samych(podobnych) instrukcji. Rodzaje dyrektyw:
REP - wstawia do programu instrukcje ilosc razy.
Format tej dyrektywy jest następujący:
REPT ilosc
;...instrukcje
ENDM
IRP - powtarza dla każdego elementu z listy argumentow określone w definicji operacje na zmiennej.
Format tej dyrektywy jest następujący:
IRP zmienna, lista argumentow
;...operacje dla kazdego argumentu wykonywane na zmiennej
ENDM
IRPC - wykorzystuje łańcuch znaków zamiast listy argumentów. Powtarza dla każdego znaku z lancucha zdefiniowane operacje.
Format tej dyrektywy jest następujący:
IRPC zmienna, lancuch
;...operacje na zmiennej
ENDM
Dyrektywy warunkowe
Stosujemy je wtedy, kiedy zachodzi potrzeba sprawdzenia, czy jakiś argument został podany do makroinstrukcji czy nie (w przypadku argumentu pustego assembler wstawia w jego miejsce 0).
Służą do tego dwie dyrektywy IFx. Każda z nich musi być zakończona za pomocą ENDIF.
IFB (if blank) - powoduje wstawienie do programu instrukcji między IFB a ENDIF tylko wtedy, gdy parametr podany do IFB jest pusty.
IFNB (if not black) - powoduje wstawienie do programu instrukcji między IFNB a ENDIF tylko wtedy, gdy parametr podany do IFNB nie jest pusty.
EXITM - powoduje zakończenie makroinstrukcji. Jeśli chcemy przerwać makroinstrukcję, gdy nie podano parametru, to piszemy:
IFB parametr ;jesli pusty
EXITM ;to przerwij makroinstrukcje
ENDM
Jeśli używamy identycznych makroinstrukcji w kilku różnych programach, to wygodnie jest je umieścić w osobnym pliku nazwa_pliku.inc .
Gdy wówczas będziemy w kodzie programu używać takiej makroinstrukcji to po .model flat,stdcall musiny zamieścić linię include nazwa_pliku.inc .
<<
|
|