Kurs programowania w asemblerze


Dyrektywy

W asemblerze jest wiele dyrektyw. Część z nich została opisana już wcześniej, m.in. SEGMENT, ENDS, ASSUME, ORG, PROC. Teraz zajmiemy się innymi, wcześniej nie opisanymi, ale również bardzo przydatnymi:

GROUP

nazwa GROUP nazwa_segmentu

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.

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, DANE2

  DANE1 SEGMENT 
    PAR1 DB ?
  DANE1 ENDS

  DANE2 SEGMENT
   PAR2 DW ?
  DANE2 ENDS

KOD SEGMENT
  ASSUME CS:KOD, DS:GROUP1 ; SEGMENT DANE1 i DANE2
 ; SĄ ADRESOWANE WZGLĘDEM REJESTRU DS
  MOV AX,GRUP1             ; SEGMENT GRUPY GRUP1
  MOV DS,AX
  ...
  SUB CX,PAR2              ; PRZESUNIECIE PAR2 LICZONE JEST
 ; WZGLĘDEM POCZATKU GRUPY
KOD 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:BYTE

KOD1 SEGMENT
        ASSUME CS:COD1,DS:COD1
START:
        ...
        CALL PIERWSZA    ;WYWOŁANIE BĘDZIE TYPU FAR
        ...
        MOV AL,ZMIENNA   ;ODWOŁANIE DO ZMIENNEJ BĘDZIE Z
                         ;PODANIEM SEGMENTU
KOD1 ENDS
END START

Drugi natomiast wygląda tak:

PUBLIC    PIERWSZA,ZMIENNA<br><br>

KOD2 SEGMENT<br>
         ASSUME CS:KOD2,DS:KOD2

         ...
         PIERWSZA PROC FAR  ;PROCEDURA TYPU FAR
           ...
           RET
         PIERWSZA ENDS
         ...
         ZMIENNA DB 0
         ...
KOD2 ENDS

Zbiory instrukcji

Istnieje 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

nazwa LABEL typ

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
  • FAR

np.:

SLOWO LABEL WORD
ZMIENNA1 DB 5
ZMIENNA2 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 0508H
MOV CL,ZMIENNA1 ; LADUJE DO CL WARTOŚĆ 8

Podobnie można robić z etykietami:

ETYKIETA1 LABEL FAR
ETYKIETA2:MOV AX,BX

Etykieta ETYKIETA2 jest typu NEAR, a ETYKIETA1 typu FAR, a obie wskazują ten sam adres w pamięci.


Autor: Karol Wierzchołowski, opracowano: 12.01.2002 r. Wszelkie prawa zastrzeżone.
Kontakt

Jeśli chcesz się z nami skontaktować napisz na adres: info(at)binboy.org lub odwiedź nasz profil na Facebooku!

O Nas

Serwis binboy.org to kopalnia wiedzy dla wszystkich z branży IT, w szczególności dla programistów i webmasterów. To duży zbiór kursów programowania, tutoriali, darmowych ebooków, setki kodów źródłowych itp.

Bądź w kontakcie

Panel użytkownika

Zaloguj się do panelu użytkownika.
Nie masz konta? Zarejestruj się!
Zapomniałeś hasła?