M E N U
Strona główna Assembler -kurs
Assembler -teksty
AntiCracking
API
Opisy narzędzi
Zabezpieczenia CD/DVD
Budowa plików
Sources
Linki
Kontakt

STATYSTYKI

stat4u
PRV.PL - Twoje miejsce w sieci.
Od 06.09.2000
Optymalizacja:
1024x768, IE5
  • Assembler - kurs

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

    <<

  • ©Copyright by zoomek 2001
    Wszelkie prawa zastrzeżone!