dyrektywy




Kurs Assemblera by Skowik
















var napis=new Array("D","Y","R","E","K","T","Y","W","Y ","A","S","S","E","M","B","L","E","R","A");
var kolory=new Array("00FFFF","00EEFF","00DDFF","00CCFF","00BBFF","00AAFF","0099FF","0088FF","0077FF","0066FF","0055FF","0044FF",
"0033FF","0022FF","0011FF","0000FF","1100EE","2200DD","3300CC","4400BB","5500AA","660099","770088","880077");
for(i=0; i< 19; i++)
document.write(napis[i].fontcolor(kolory[i]));


W asemblerze programy
pisze się zazwyczaj według jednego, stałego szablonu, deklaruje się segmenty
kodu, stosu i danych. Do deklaracji tych elementów używa się specjalnych
dyrektyw:


ASSUME rejestr segmentowy: nazwa segmentu [...] - informuje
kompilator, z którego rejestru segmentowego ma korzystać przy odwołaniach do
etykiety podanego segmentu, np:
ASSUME cs: CODE
ASSUME cs:NOTHING Linijka pierwsza
informuje kompilator, że CS zawiera numer segmentu kodu.Teraz jeśli
będziemy odwoływać się do etykiety, będziemy odwoływać się do rejestru kodu
CS.W drugiej linijce anulujemy powiązanie z pierwszej linijki.

SEGMENT, ENDS - dyrektyw tych używa się do deklaracji segmentów.
Sposób użycia:
nazwa_segmentu SEGMENT [typ_segmentu] [połączenie] ['klasa']
gdzie:

nazwa_segmentu - jest to dowolna nazwa przyjmowana przez kompilator.
Może być później w programie wykorzystywana jako identyfikator segmentu.
typ_segmentu - określa sposób przydzielania pamięci:

Byte - adres dowolny - segment ładowany jest w dowolnym miejscu
Word - adres parzysty - segment ładowany jest na granicy pełnego słowa

para - adres podzielny przez 16 - segment ładowany jest na granicy
pełnego paragrafu
Page - adres podzielny przez 256 - segment ładowany jest na granicy
strony (1 strona=1024 bajty)
połączenie - określa jak kompilator ma łączyć segmenty o tej samej
nazwie

Public - segmenty o tej samej nazwie łączone są w jeden ciągły
segment. Wszystkie adresy w segmencie są łączone względem jego początku,
np.:



DANE1 SEGMENT PUBLICZMIENNA1 DB 0ZMIENNA2 DB 0DANE1
ENDSDANE1 SEGMENT PUBLICZMIENNA3 DB 0ZMIENNA4 DB 0DANE1
ENDS ;zadeklarowanie tych dwóch segmentów jest równoważneDANE1 SEGMENT
PUBLICZMIENNA1 DB 0ZMIENNA2 DB 0ZMIENNA3 DB 0ZMIENNA4 DB
0DANE1 ENDS


stock - wszystkie segmenty o tej samej nazwie łączone są w jeden
ciągły segment, który przy ładowaniu programu do pamięci inicjowany jest
jako stos (SP pokazuje na ostatni bajt segmentu). Jeśli chce się
definiować w programie segment stosu, trzeba zadeklarować dla niego parametr
'połączenie' - STACK. Jeśli zdefiniuje się stos bez parametru STACK,
trzeba będzie samemu inicjować rejestry stosu.
ommon - nakłada wszystkie segmenty o tej samej nazwie, umieszczając
początek każdego w tym samym miejscu. Powstaje w efekcie obszar o
wielkości największego z segmentów.
memory - umieszcza wszystkie segmenty o tej samej nazwie w najwyższym
fizycznym segmencie pamięci. Jeśli jest więcej niż jeden segment MEMORY
nakładane są one jak w przypadku COMMON.
AT adres - adresy wszystkich zmiennych i etykiet w segmencie są
obliczane względem wartości segmentu podanej przy AT
klasa - określa kolejność segmentów
 
Przykładowy szablon programu w Asemblerze: DSTACK SEGMENT STACK 'STACK' ; deklaracją segmentu stosu
DB 64 DUP ('STACK') ; wypełnienie stosu
DSTACK ENDS ; koniec segmentu

ASSUME CS:CODE, SS:DSTACK ; przypisanie rejestrów do segmentów

CODE SEGMENT

Start:

<program>

CODE ENDS

DATA SEGMENT

<dane programu>

DATA ENDS

END Start
ORG - dyrektywa nadaje licznikowi
adresów wartość wyrażenia. Wszystkie następujące po ORG adresy zaczynają się
od zadeklarowanej wartości. Dyrektywa ta jest zazwyczaj używana do nadawania
danym lub instrukcjom określonego przesunięcia w segmencie. Jeśli nasz program
ma być zapisany w pliku COM, to musimy napisać: ORG
100HCo spowoduje przesunięcie początku o 100H bajtów. Jeśli nie wiesz
czemu, zajrzyj do budowy plików COM.
GROUP-Dyrektywa ta pozwala wiązać kilka
segmentów zdefiniowanych dyrektywami SEGMENT tak, że adresy w każdym z nich są
liczone nie względem jego początku, ale względem początku grupy. Segmenty w
grupie mogą być ciągłe (max. 64KB), ale nie muszą - między segmentami grupy
mogą znajdować się segmenty nie należące do danej grupy.
nazwa GROUP nazwa_segmentu
Aby ustalić adresację w obrębie całej grupy, należy użyć dyrektywy ASSUME,
podając w niej nazwę grupy, np.:
GROUP1 GROUP DANE1, DANE2DANE1 SEGMENT PAR1 DB ?DANE1
ENDS
DANE2 SEGMENTPAR2 DW ?DANE2 ENDSKOD SEGMENTASSUME
CS:KOD, DS:GROUP1 ; SEGMENT DANE1 i DANE2; SĄ ADRESOWANE WZGLĘDEM REJESTRU
DSMOV AX,GRUP1 ; SEGMENT GRUPY GRUP1MOV DS,AX...SUB
CX,PAR2 ; PRZESUNIECIE PAR2 LICZONE JEST; WZGLĘDEM POCZATKU
GRUPYKOD ENDS
EVEN - Dyrektywa ta umieszcza instrukcję
lub definicję danych następującą po niej na granicy pełnego słowa, wstawiając
ewentualnie instrukcję pustą (NOP). Dyrektywy EVEN nie można używać w
segmentach z parametrem 'ułożenie' równym BYTE.

PUBLIC i EXTERN
PUBLIC nazwa,...EXTRN nazwa:typ,...
Dyrektywa PUBLIC czyni podaną przy niej nazwę (etykietę, nazwę zmiennej lub
procedury) dostępną dla innych modułów. Dyrektywa EXTRN natomiast deklaruje
nazwę użytą w module jako zewnętrzną, tj. taką do której odwołanie zostanie
rozwiązane dopiero na etapie łączenia modułów. Typ w tej deklaracji określa
rodzaj nazwy zewnętrznej i może być następujący:
BYTE WORD DWORD NEAR FAR
np. pierwszy moduł wygląda tak:
EXTRN PIERWSZA:FAR, ZMIENNA:BYTEKOD1 SEGMENTASSUME
CS:COD1,DS:COD1START:...CALL PIERWSZA ;WYWOŁANIE BĘDZIE TYPU
FAR...MOV AL,ZMIENNA ;ODWOŁANIE DO ZMIENNEJ BĘDZIE Z;PODANIEM
SEGMENTUKOD1 ENDSEND START
Drugi natomiast wygląda tak:
PUBLIC PIERWSZA,ZMIENNAKOD2 SEGMENTASSUME
CS:KOD2,DS:KOD2...PIERWSZA PROC FAR ;PROCEDURA TYPU
FAR...RETPIERWSZA ENDS...ZMIENNA DB 0...KOD2 ENDS

Zbiory instrukcjiIstnieje kilka
dyrektyw, które pozwalają deklarować procesory, których instrukcje będą
używane w programie. Dyrektywa deklarowania rodzaju procesora powinna być
podana na początku zbioru, żeby objąć całą jego zawartość. Domyślnym rodzajem
procesora jest 8086. My mamy do dyspozycji:


.8086
.8087
.186
.286c
.286p
.287
.386
LABEL-Dyrektywa ta służy do
tworzenia etykiet, przyporządkowując im aktualną wartość adresu. Jest ona
użyteczna przy nadawaniu zmiennym pamięciowym, już nazwanym, innej nazwy z
innym kodem. Mamy do dyspozycji typy:

BYTE
WORD
DWORD
QWORD
TBYTE
NEAR
FARFormat :
nazwa LABEL typ

np.:
SLOWO LABEL WORDZMIENNA1 DB 5ZMIENNA2 DB 8
Liczby 5 i 8 znajdują się w dwóch kolejnych bajtach pamięci. Można teraz
odwoływać się do nich używając ich nazw (ZMIENNA1, ZMIENNA2), wtedy nadajemy
wartości bajtowe, lub odwołać się do SLOWO, gdzie nadamy im wartość słowa (dwa
bajty jednocześnie), np:
MOV AX,SLOWO ; LADUJE DO AX WARTOSC 0508HMOV CL,ZMIENNA1 ; LADUJE DO
CL WARTOŚĆ 8
Podobnie można robić z etykietami:
ETYKIETA1 LABEL FARETYKIETA2:MOV AX,BX Etykieta ETYKIETA2 jest
typu NEAR, a ETYKIETA1 typu FAR, a obie wskazują ten sam adres w pamięci.











Strona utworzona przez(c)2001


Wyszukiwarka

Podobne podstrony:
dyrektywa
Formy wsparcia dyrektora 3
dyrektorzy mod 1 [tryb zgodności]
38 Dyrektywy preprocesora
Dyrektywa 2007 38 WE (lusterka samoch)
Geneza Unii Dyrektywi itp
Dyrektywa azotanowa
Apache dyrektywy
DYREKTYWA RADY z dnia 21 grudnia 1988 r
Normy zharmonizowane z nową dyrektywą maszynową
b Wstęp Dyrektora IBE
dyrektywa parlamentu w sprawie kształtowania tuneli

więcej podobnych podstron