ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF...

24
ASSEMBLER strona 1 ASSEMBLER Definicje Mnemonik Dyrektywa Operandy (argumenty) - liczby i inne nazwy z prawej strony mnemoników, oddzielamy je przecinkiem ‘,Instrukcja ! " # Instrukcja maszynowa - binarny odpowiednik instrukcji Komentarz #$ % ;% Liczba - szesnastkowa: % H&$ # % 01202H, 0A010H # zwyczajnie - ósemkowa: % Q’ lub ‘O’. - binarna: % BEOL = Carrier Return (13) + Line F()" * $# : NAZWA w Asemblerze WORD 2 + DWORD 4 + QWORD 8 10 bajtów TBYTE 10 paragraf PARA 16 strona PAGE 256 segment SEGMENT 65536 ( ! " # " ) Architektura mikroprocesora * # # ,- cykl rozkazowy,. pojedynczej instrukcji. Na jeden cykl rozkazowy przypada kilka cykli maszynowych + # kilku cykli zegarowych. Jeden cykl zegarowy wykonywany jest w jednym takcie zegara. Poszczególne cykle maszynowe + ,/ BU "0 # # + $ # IU "0 + potok). EU "0 123 , , # " AU "0 # ! ! , 1+ $ # + , + 4/ #5/##, Adresy 6 7),8 # 7+,- segmentu (okienko 65536- + # +#" # offset" $ +## ,8 + # # ,.# offsetu ( # # (20 - bitowego) o jeden bajt, natomiast ( ! "#%(&## segmentu o 16 bajtów (adres segmentowy - adres paragrafu). ( ! ) - adres nie jest jednoznaczny , 9$ # # (:+ !! (:+ 7 #+ +#, Zapis adresu - w postaci: <segment> : <offset> 0100H:0001H.

Transcript of ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF...

Page 1: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 1

ASSEMBLER

Definicje

Mnemonik������������������ ��������������� ������������Dyrektywa������������������ �������� �����������������������Operandy (argumenty) - liczby i inne nazwy z prawej strony mnemoników, oddzielamy je przecinkiem ‘,’Instrukcja���������������������������������������������������� � ���!������� ���������������������������������

����������� ����������"���������������������#��������������

Instrukcja maszynowa - binarny odpowiednik instrukcjiKomentarz����� ������#�$��������%;%����� ������������� ��������Liczba - szesnastkowa: ������������ �� �����������%H&�����$���� ������#�����������������������%0’

1202H, 0A010H������#���' zwyczajnie- ósemkowa: ��� ���������������%Q’ lub ‘O’.- binarna: ��� ���������������%B’

EOL = Carrier Return (13) + Line F�����()"����������� ��������

* ����$ ���# :NAZWA w Asemblerze ����������

����� WORD 2���+��������� DWORD 4� ��+��������� QWORD 810 bajtów TBYTE 10paragraf PARA 16strona PAGE 256segment SEGMENT 65536( !�"������� ����#���������������������� �� �"�����������������������)

Architektura mikroprocesora* ��� ���� �����������#�����#� ����,�-����������� �����������cykl rozkazowy,�.��������������������������pojedynczej instrukcji. Na jeden cykl rozkazowy przypada kilka cykli maszynowych������+�� ���������������������#��kilku cykli zegarowych. Jeden cykl zegarowy wykonywany jest w jednym takcie zegara. Poszczególne cykle maszynowe�������������������������� ������� ���������+��������,�/�����������'

BU������������������������"�0����������������������������� �#�����# ������� ������������� �����+������������������������������������ ����$���������#�������

IU�������������� �"�0������������� ���������������+������������������ ����������������� �������� ���potok).EU �������������� ��"�0���������������� ��������������������������������������123���������,����� ��������������������,��������� ���#������������������� ����� ������� "

AU����������������"�0������������# ������������ ���������������������!�� ���������!��� ���� �����,1+��������$�� �������������������������#�����+��� ��������� ����,������+����� ��������4/���������

������ �#��5/������������������#��������� �#,

Adresy

6����������������7)������,�8����������#�������������7��������+�,�-��������������������segmentu (okienko 65536-����������������+����������������#����������������������������������������+��� ����������#"��������������

������# ���offset"�������$����������������+��#���# ��������� �,�8��������+���� ���������������������# �����#����� ��������������,�.�#�������offsetu���(�����������#���������������������#����� (20 - bitowego) ojeden bajt, natomiast ( ! "���������#������������������%(&�����������#��������������#�������������� �����segmentu o 16 bajtów (adres segmentowy - adres paragrafu).

( ! ) - adres nie jest jednoznaczny �������������������������� ����,�9�$����������������������#�����������#��������������(:�����+������������ �������������!!��������������(:�����+������7������������������

�#��+� ���������������+��#,

Zapis adresu - w postaci: <segment> : <offset> � 0100H:0001H.

Page 2: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 2

Dekodowanie adresu����������������� ��������������������������������������(:��������������7)�������� ��#���+���������������;������������������",�<��������� ������������������(:�������� �������������!!����,�* ����������

adres 20-bitowy.

Bufor obrazu��������� ��������������������8=>55����������$������������������,�8����������������# ����������'�)?@))A�������"�����)?)))A������",�B����������$����������������������7������'�(�������8=>55

��$�����������������7�������������������;��������������������������������������",�8������������������������������

)CA,�-��������������������������#������������+���������������������������������������������������������������

������������,�9�������������(:)�����+�, ( !�"�3�����������������$�����������# ���������������� ���������bajty (np. write() )

Data BIOS�������������#�������������������)DDDD')))E,���������������������������������������!!������������)����(E",<���������������������� ������$ �����+��8=>55���������� � ������'�25/04/97

Restart (zimny) - w BIOS zapisana pod adresem 0FFFF:0000 instrukcja skoku do procedury startowej.

Rejestry

Rejestry segmentowe����������������������������������������+������������(:���+�,CS (code segment"��������������� ���������������������#��������� ������,�8������������������+��������������#�������������������� �#$��������������������#���>=

DS (data segment"���������������������������#��������� ������ ,�3����������������������+������ ������������� ����������������������������������

SS (stack segment"����������������� ��������������������ES (extra segment) - zawiera adres dodatkowego segmentu danych

Dodatkowe rejestry segmentowe (386 / 486)FS i GS - (nazwa od kolejnych liter alfabetu"���������������������������� ��������+������ ( !�"������������ ����������������������������������������������������������� �����"����������������+����������� �������������������������������� �������������������,

Rejestry ogólnego przeznaczenia����������������+����!��� ��• przechowywanie offsetów: BX, BP, SP, SI, DI,�8������������#������������#��+� �����,'�SS : SP . ( !�"�B��������������������!!���+���������+��8F��>F� ���<F,

• ��+����������+�'���������������������@�����������������#��� � ��������+�'�AX, BX, CX, DX. Odpowiednio������������������#��������������������� ������'�8X = AH + AL�,�=���������+�������MSB (most significantbyte"�������������LSB (least significant byte)

Rejestry 32-bitowe (386 / 486)* �������������������+������������ ������������?-��=-��=5��<5"��������������G7���+��� nazwa 32-bitowegoodpowiednika tworzona jest zgodnie ze schematem: AX �EAX.( !�"�B���������������������������������������������������������������������������������������EAX to AX)* ���H��������� ��- rejestr IP��������������� ���������!!����������� ����������������+����#�����������������������#��,�-������ ����������� ��>-/���#�����5-����������$������+������������������������������������������ ��

maszynowa.( ! ) ����������������#��������#���������� ���������CS:IP( ! ) �����������5-��������������$������ �������������

Rejestr znaczników (!���"���(:���������#����$����+��������������������������������(����������������������������� �������������+��������������������������� ��������+�,�* #����$�������� �����������$ ���������

��������������������������������������������������������+�����+�",�* �@)@:���������������#��������I���+���

�������������,�6�������������!����"���������������������#'

OF (overflow flag) ����� ��������������������������������������� ���������������������$ ��#�����������przeznaczeniaDF (direction flag) - znacznik kierunku � nie wskazuje niczego, ( !�"���������������������������������� ��������������������������������������� �������,�J���<D���������������������� ����������������#�K����+����������L����

��������������� ������+�������)��������������#���� ������+�,�/�����������(������ ��STD, 0 - CLD.( !�"���� �������������� ���������������$ ���K)L

Page 3: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 3

IF (interrupt enable flag"������ �����������������������������������������������>-/������������������������������� �������� ��STI (na 1) oraz CLI�����)",��9�$������������$�������)�����������������#�������������,TF (trap flag) ����� ��������������������������������������������������SF (sign flag) - znacznik znaku � ustawiany, gdy wynik operacji jest ujemny (1 na najstarszym bicie), zerowany - wynikdodatni.ZF (zero flag) - znacznik zera � ustawiony, gdy wynikiem operacji jest ‘0’ ( ! ) , zerowany, gdy cokolwiek innego.AF (auxiliary carry flag) - znacznik przeniesienia pomocniczego ��������������������������� ��� �������#��� kodowanych binarnie - BCD - bajt traktowany jako para 4-bitowych nybli��������������� ������������� �!���)�I,PF (parity flag"������ �����������$ ������������������ ������������ ���+��������������� �� ������ �������jest parzysta, zerowany - gdy nieparzysta.CF (carry flag) - znacznik przeniesienia ��������������������������������������� ��� �����������������������������������������������������������,�D���#��������������!������������ ����STC (CF = 1), CLC (CF = 0), CMC(CF = -CF)AC (alignment check"��;@:"�������������#������+�������������������������������������������# ������������������������;,�* �;@:������ ��$���� ��������#�G7������������� �������������#����������������#

���+������������������ �����+��� ���+�,

Kopiowanie rejestru flag������������������ ��32M�� nale¿y u¿yæ stosu - naspierw PUSHF a potem POP

Rodzaje danych i adresacje

������������������������������

Instrukcje wymagaj�� �#�����������������H�+�������� ��������� ���� �����������������H�+��� ) i adresu������ ��������������������������!���� ����������operand przeznaczenia). Operand przeznaczenia stoi za zwyczaj������������ ���,�MOV DX, AX ��<F���������� ������8F���H�+���,

Rodzaje danych5�������G������������� ����+������������������������������'

Dane natychmiastowe��������������#��adresowaniu natychmiastowemu - dana zawarta jest w segmencie kodu zaraz po������������ ������������������� ���������������� �",

( ! "���3������������������������H�+���������������������$ ������������������������ �������������@��+�� ��������@�������� ������H�+���",

Dane natychmiastowe to �� �����������#���������� �����,�MOV AX, 1<������������������������������������� ����� ��������������������+�����!!����������������# �������������

���������$���������������������(:������������@������������������ ����� ����������"������,

Dane rejestrowe������ ������������������ �>-/,�<���#�����#��adresowaniu rejestrowemu (ukrytemu). Sprowadza�#����������������������������' MOV AX, BX - w BX jest dana rejestrowa, która zostanie zapisana jako danarejestrowa w AX.

( !�"������������������H�+����@���+����� ����(:���������������������,

<������# ����������������#�����$���(3?������������# ,���!�"�* ��#����$ ������� ����������������������+��������������������# ,�<������������������ ��� �����������,�B���������������������������������

�������+�������$�������������������������# �,�B���#�������������#�������� ��[ ], którymi wskazujemy, w jakich�������� ���������������+�����# ,

������������������

=������������ ���$������'

( !�"�* ���������������������������przedrostka zmiany segmentu.• [ <rejestr_offsetu> ] � [BX] - �������# ���������������������� dla BX i offsetu zawartego w BX• [ <rejestr_bazowy> + <rejestr_indeksu> ] � [BX + DI] - ������������������������#������������������# �����

segmentu DS����!!�� ���+���������������$ ���?F��<5 ( !�"����������������������������������+������ ������������������������������ ���������� ����������������� ����!��������������� ��������������������������� ���������# ������#����� ���������� �"• [ <rejestr_bazowy> + <dana_natychmiastowa> ] � [SI + 1] - ������������$��������������# �� -

<����N���� �������O�������������# ���������������$��� �����"�����#�����������������!!����������������", ( !�"����������������������������������#����������� �+��������������������������������� ������������������� ��������"��������# �������������������������������������������������� ��������������������������������� �����������#������������ ��#�����+������#�����������������"

Page 4: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 4

• [ <rejestr_bazowy> + <rejestr_indeksu> + <dana_natychmiastowa> ] �[BX + DI + 7] - adresowanie indeksowe����#�����������������# ������������# ������<=���!!�����+����������!!���+���������+��������$ �� ������,

( !�"������������������������������������#������������� �+�������� � �������+��� <rejestr_bazowy> wskazuje adres tablicy, <rejestr_indeksu> - element tablicy (rekord), <dana_natychmiastowa> - konkretne pole w danym ��������������������#������������������ �������������������������������������$������+������ ������������"

Adresowanie wielowymiarowe - dla tablic o wielu wymiarach ���������������������������������������<�������N������O���� ���������� ���Pdana_natychmiastowa> - pole w rekordzie, <rejestr_indeksu> - konkretny element���� �����+���� ��$�������������� ��������������������������������"����������������� ������K)L"�'

nr_wiersza * ���������������������nr_kolumny

<���$�����������������������������������#����������������������+��,�* ����� �����������������!!�������������

�����������������������������$���,�* ����$ ����������������������������� �����������������+������� �������

������!!���,�B�� �#$ �������$��������������#��������'

• DS dla offsetów BX, SI, DI• SS dla offsetu SP ( !�"���������������������• SP dla BP9�$�� ��������������$����������������������������������������przedrostka zmiany segmentu w postaci<rejestr_segmentu> : ���������������������!!������,�ES:[BX], CS:[SI], ES:[BX + DI] itd.Tworzenie programu „exe”6������������������������ ����������G������������� ���'������������ ������,�3����������# ����������+�,

=���������!������#������� ������������=4J34BQ�������������������'

P�����O�=4J34BQ��R��S�R��� ����S�R%nazwa_klasy’] np. MojeDane SEGMENT.gdzie:• P�����O��������������� ����������������������• R��S�������$������������ �����#���������������� �������������������$ '

BYTE - od pierwszego wolnego bajtu WORD���������������������������� PARA - od pierwszego wolnego adresu podzielnego przez 16 PAGE - od pierwszego wolnego adresu podzielnego przez 256

( !�"���$���������������������$��������#�����������-818• R��� ����S����!�����������������������+���� �����������������������������������������������$ '

PUBLIC�������������#������������+���������������������+����������������������#����������������������� � ����������������������������#���������������+��������� ��������+�������������

COMMON�������������������������������#����������+����������� ��������������$�����������T �����$ �����#����������� ���� ��������+�

MEMORY������������������������ ����������� ���������������������������������������(������������ AT <��������N������ ���O - segment zostanie umieszczony pod adresem segmentowym znanym w czasie

������� ������$�����������P��������N������ ���O STACK������������������������������������� �����=Q8>6�����������+��������������������������$

równej ich sumie ( !�"�9�$����� �������������������������$��������#��������PRIVATE���������������#�������������������� ����,• [‘�����N�����&S�������������������������������������������� ������+�����$������������������#�������������������#�����+�������������������������������� ����

6��� ���!� ��������������������$���������������ENDS���������+�������P�����O,6��������������������!� ���������� ��������+����������������"���� ��������������������������END poza����������������+�,�8������������#���� ����������� ������� ����������������������� � ��#���4B<,

��������������������

8������������������������������������������ ��� ��������� � ��������+���������� ��� ��,��7)�U�(E��������)w kodzie programu,�2�� ����� �����������#��� ������������ ����������������������������������������������������������������$�������������� ����������#������������������� �������������������!������������� �

4V/",�3������+�������������������NOT <op>����������� ����������������������������������po obliczeniu zostanie��������������������� ����������������$�,�B2Q���������������������Pop>. ����!�������������"#$�%�&#$�%�'#$

B������������������������ ������������������������� ������"'�.486 (MASM/TASM) lub P486N (TASM).9�������+������ �����

• @)@:�W�@)@@��� ������������������������ ���+�����������������������������$��-/=AD���� �����������������!�����������������������-2-D����$���������#�������������������@)@:����$�����,,,

Page 5: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 5

• 7@:��� ������������������������ ���+������������������������������� ����������� ������������(7�(;�����zastosowanie) ����#����������� ������������@)@:,�9�$�������������������������7@:����$�����,,,

• 386 - rejestr AC zawsze równy 0 ���$����������#����������� mamy 386, w przeciwnym razie 486

Segment stosuAdres segmentu stosu przechowuje SS,�9���������������������<2=�������� �������������,�1���������������������������� ����(6?����������������������������������������������������������+�����!��� �����������<2=��?52=,

=��������������� ������#����==')������������������������ �������������#�� ������������������� ����������� �,

B��� ������SP wskazuje na koniec stosu (SS + rozmiar stosu).3#����==������������=='=-�����������#����������� ����=='=-�������������������������������������������Szczytstosu",�3#����==')���=='=-������������#���������������������������������������# ,

�(��������������

-���������������������zmniejsza��#�=-�����������������������������������������=='=-,�2�������#��������� ��PUSH�������������������������$������������������������������ ������������������������7@:"������natychmiastowej) lub PUSHF������������������!���"��,�

PUSHFPUSH AXPUSH [BX]PUSH 21H

( !�"�2��������� �����������������������(�����������������������������������������+��@������ ,�?��������������������#�����������'��������� �� ����=='=-������������� �� ��=='=-�(

( !�"������������������������������� �����$���� ��@)@:"

Zdejmowanie ze stosu.������� ���������� ��������#��� ��������������������#�������������������$��=-,�1���������#���������� �

POP (ogólne) lub POPF (dla flag). ( !�"�2��� �������������������$ �(�����������@���",POPFPOP AXPOP [BX]

Inicjalizacja stosu<�!������#������������������������������������������������ ��DUP (patrz: Segment danych) np.

DB 64 DUP(‘STACK!!!’);

( !�"������ ���#������������������ ������� ��������$������!���� �����������,�%��� �&"�������#���������������������������H�������<4?/J,�Q� ����#��������������������������������������

Segment danychTyp danych - w asemblerze oznacza rozmiar danych.

Definiowanie zmiennych<�!���� ������������$����#��������������������������"������������������!� ������ :DB (define byte) - definiuj bajtDW (define word)�����!���������DD (define double)�����!�������+���������DQ�����!������ ��+���������DT ����!�����()�����+���E���+�"np. �������<* ���X��K������L��#����������������7�����+�,

( ! ) W przypadku gdy zmienna „��L������(:��������������������#���'�MOV AL, zm, �����������$�typów �����@���+��K�������#L�(:���+�,�B�������+� ���������specyfikatora zmiany typu.

.��������������������� ������������������������������#������$�����������,�zmienna DW 0FFFFH.

SS + rozmiar

SS:SP

SS:0

Page 6: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 6

)���������*�+�,���

.�������������� �������+���string"������ ����������������# ,�3��� ������� ������������#�� ������� ����������������+�,�-�����������������������#���������#�DB ( ! ) ����+��������� ����#� �������+�,�>�������+������ ����#���„ ” lub ‘ ‘������������ �� �����������$ �������� �����+��8=>55���������� ���� ����,�Q���# �<?�����������������(��������#�� ��� ������������������� � �,�Q�������������������������������� �������<?,

Y ��������+����������!� ��� �������������������������������� �����+�,�3������� ������������������� � ��+�

����+��� ������� � ���������� ������� �����%,’ np.lancuch DB „Ala”, „ma kota”, ‘$’Eol DB 0DH, OAH, ‘$’

<����$����� � ������$����� ������������� � �� �������������������$�������� �����������������������������

��� � �"��������#������� �����������!� �������������'

-����.EQU $ - <��������*�+�,�.����'�P�����O����#�����������������$����� � ��P�����N��� � �O��$��������������� ���� �������������� - zwraca���������� ���������������+�������������,�* ���������� ��P�����N��� � �O�������������������������stringu, $ - napierwszy bajt zaraz po ���������# �P�����O��#������$ ������+��stringu np.

Napis DB ‘Ala ma kota, ale kot jest zielony’Dl EQU $ - Napis ������������� ����� ����������������

)���������/(����,����������

9�$�� ��������������������� ���������������#����������#������������������������������ �������������

ze stringów������������������������DUP,�.��������!������#������������ ������'<nazwa_zmiennej> DB <ile> DUP( < ���N������O�"

<?�������������������� ������������

P��O���� �������+�����������������������

< ���N������O��������� ����� ����� ��� string, liczba lub ?������� ������������������������������������������� ����#�����# ,

np. Nazwa DB 10 DUP(‘Luke’) ; ”Nazwa” zajmie 40BTemp DB 10 DUP(?) ; „Temp” zajmie 10B, nie inicjalizowana

( ! ) - ��������#������������'����U�sizeof ( < ���N������O"

Zmienne anonimoweQ�������#������������ ��������������������������������� ������ ���,� DB 100 DUP(?),�<���#�������������������������������#�������� ���������������# ���������������������� ������ ,

( ! ) - offset zmiennej w DS�T���$������+�����+������#�������������!�������� ��$������������ ������

Dyrektywa LABEL<�������������������������$����������$ ���# �����������������������������,�3����������#��� ��������#'

<nazwa_zmiennej> LABEL <������N��# Ogdzie: <������N��# O������������������������������,�WORD, DWORDB��������������#�����#����������������������+�����# ����+��������������!��������������������� �

jednej z dyrektyw definicji zmiennych (DB, DW). Z <�����N�������O��#���������������������������� nie trzeba�#�������������specyfikatora zmiany typu ����������",

Tablice<�!������#�������� ������������DB������+����������� �����������#�������������������������stringu lub������� �����������</-��"������+������������ ������������������ ��������$ ���������������������</-�����

������ ����T���$ ��������� �+������ ���,

Tab DB ’1234567890’ ������ ��()� ������������������������������������+��()� ���������+��(�������� ,Tab DB 100 DUP(‘12’) ������ �����+���������������������� ������())��������+��7�������� ,3������������������� �����������,�DW���+� ��������������������������������������������������������# ����������� ������� ���������������������������� �� ������������������������������ ����������

��������������������������������������������� ���������� �",�-����������'

Tab DW 0B800H DW 0A000H

DW 0000H . . .( !�"�-����������������#����������� ��������+������ ����������#� ����� �� �������������������� ��, wówczas����������������������� ���������� ������������������������������������������ �,�9�$��������������� �������������

n-����+������������������������������������$ ��n.( !�"�2�� ���#������$��elem. tablicy (n"���!���������������������$��K7L���������������� �������# ��i-tego�������������������#���������i*n�� ���������+� ������������������������� ��=AY

Page 7: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 7

( !�"�-����������������#������,����� �������������������� ����� ������������������������ � wówczas rejestr��������������������������������������������� �������������������������������$�"�����������#�� ������������ �,

( !�"��������������������+������ ��������������������#��� �'<nazwa_tablicy>[ <indeks> ] np. tab[2]

�����P�����O����� ������������+����������� �,�1������������$�"����+��������������������������������������

definiowania tablicy (np. DB, DW ), ewentualnie od zadeklarowanego dla <�����N���� �O�����������# ������� �dyrektywy LABEL.Szybkie odwzorowania - tworzenie ���� ����������� ������ ����������� �������������������+������i-tym������ ������������#������$������������������������ ��i. ( f ( i ) ",�Q�������� #������������������ ��������������������������",�<�#������������������������������������������������ ����f( i )���,��������������������������'���$��i T�)����+��C����$��i = (����+��7��,,,

0���

<�!� ������� �����������#�������� ������������EQU���������+���������������������������+��������#���������������+�������������������������������,������������������ �������������������!� ��������� �������,"��,

Stala EQU 2-7*4Imie EQU ‘Cindy’Data EQU 0FFFF:0005( ! ) EQU dziala jak #define, na etapie ���� ���������������������������������������������������������$�,

Zmiana typu* ��#����$ �������+������������� ������������������������������#������# �����������������������

( ����� ����������"����,�B4J��5B>��<4>��B2Q������������������������������$ ����� �����#������������np. ���B4J������������������� ��� ����������������������������",�2������#���������������specyfikatorów zmianytypu - BYTE PTR, WORD PTR itp. np. NEG BYTE PTR [BX]

( !�"���������������$����������� ������� ������� �,( !�"�* ������ ������� �������@���+��������(:���������������������������������(:�������������specyfikator zmiany BYTE PTR i zostanie tam zapisana starsza���+����������������,MOV AL, BYTE PTR Zmienna

Segment kodu

Definiowanie EtykietEtykieta��������������� ��������� ���������$��������� ������# ����������T���������������������������������� �w kodzie, adres segmentu itp. ).* ������������������������!�����������������+�������������������������������� ������� ���������� �,

/��������������������������������������� ��������������������������T��������������� ����������������� ��

������������# ������#����>=�������������� �,�4�����#���!������#�����#��� �'

<etykieta> : gdzie <etykieta> - dowolny string np. Tutaj :( !�"�2���������������������������#������������������������,�MOV SI, Tutaj.

1�2��������������!(+����3���+

-����������� ��������+���� �������� ��������������������������#��,�=����,�B���#�����END��������������#tej etykiety.

(���������(��+����������������,���3�����

<���������������������������+�����������������������������+������������������8==/34,�/������#����

�������������#��� ������� ��'�ASSUME CS:Kod, DS:Dane, SS:Stos , gdzie Kod, Dane i Stos to etykiety - nazwy�������+�,�2��������������������������#����Dane SEGMENT a Dane ENDS���������������������������������������� �����#�������������������������!����������������#����Dane SEGMENT a Dane ENDS���������#�������� ������ ���#������� ���������#����������� ��������������� ���!������ ��������� ������,�B�����

������������������#�������������������������$ ������������ ����������������.( !�"���B����������������������������������� �������������<=,�B��������������������������������$����������������� ��������� �����# ����,�1�������#�������#��� �����+�'

mov AX, Danemov DS, AX

Page 8: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 8

Procedury

Definiowanie-�� ���������������������� ������������PROC���������+���������������T�nazwa procedury,�B���#�����!������#������ ��������� ���������� ����#������� ��ENDP���������+��������������� �������,

Moja PROCmov AX, Danemov DS, AXdec CX....ret

Moja ENDP

*���������� �������������� ��CALL <nazwa_procedury> np. call Moja. >8YY��������������������������������!!���= 2B = 16b) i skacze do wskazanego miejsca. ( ! ) - -�� ������������������������ �#�RET���������� �����+����������������������������������>8YY���14Q�������������������������� ����������,

( !�"�������������� �������������������������� ����������� �#$ �������������������������������� ,

4��������*���

-���������������� ����������������������������������������������������� ���"���������������������$���

����������� ����������������������������,�5������������������ ������ ����#���K��������L�����������#

�����������������!����������������������������,�8�����������������������������#�������,�B��� ���������������

������������������������������+������������� �#$ ��#����������!�������������#��������������� ����� �����

���������������������������������$ ��,

Moja PROC; zabezpieczenie wart. rejestrowpush AXpushf...XOR AX, AX ;modyfikowany rejestr AXCMP AX, zmienna ;modyfikowane flagi......; przywrocenie wartosci z momentu wywolaniapopfpop AXret

Moje ENDP

Przekazywanie parametrów do procedur• przez odpowiednie rejestry �������������������� ����������������#��������+�������+�� �������������������������������������������������������������������������������,"���������� �!������������ ���������

procedura zwróci wynik• przez stos����� ����������������������������������������������������� ����$ �����������$�������������$ ,* ����$������ ����������������������������������,���!�"���������������������������������#���������� ���������zawiera adres powrotu z procedury �����������������$ ������������"�����������#����=='R=-�7S

���(�����������3+����������������+�������+����+����+

* �������������������������������������������������� ����� �� ��������������������������� ��������������#

������+������# ��������� � ��#�K��L��� �����������,�=� ���������������������������������������=-,�B���������

����������������������������������������������������������$��������������# ��,�D��� �#�����������������

��������������?-,�* � ������ �������������+����������� ������ ������������������������+���������������$����

�����$ �=-��������#��������������������#������+����# ��������������������� ����������?-�;��?-�:�,,,

-����������������#����������� �����������+���������������#���������������� �������'Moja PROC

;zabezpieczenie rejestrówpush BPpush AXpush BX����������������������������

��� ! �"������������#$%&����'��'����(�)*+�����#$%,� *+�����#$%-�)$+

; pod SP+8 - adres powrotu z procedury dla RETmov BP, SPmov BX, [BP+10] ;do BX trafia drugi ��.��������mov AX, [BP+12] ;do AX pierwszy...�������������� ��������������������

pop BXpop AXpop BP

Page 9: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 9

retMoja ENDP

-������������������������ ��������������'...push arg1push arg2call Mojapop arg2 �'� ������/�������������� ������������������0�������/���� �����������

pop arg2 ���1���'���������������...

...

( !�"���* ��������������������������� ����������������������������$ ���������+����+����������$���������������������������������-2-����$ ���# �� ���������,�* ����� ���������#�����������������

ADD SP, N

gdzie N��������$ ������+������������������������������������,

Zmienne lokalne9�$���� �������� ���$����������������������� �������� ������������ �����������������������������������

�����,�* ����� ���������������#������������$��N - bajtów miejsca (SUB SP, N ). W tym momencie mamy dodyspozycji N�����+�������������������������������������������,�<��������� ������� �������������#������������� �����������?-����+��������������+�����������=-,

( !�"�9�$���������������������� �������������������� �������������#��,������������+������������� ������������� ��������������������#��������������?-�����������#���N�����+����������� ��������+������#��������������$ �?-�������#�������N np.

mov BP, SP������)$%,�"�����������������������

sub SP, 4 �������������������������������������

mov BP, SP ;SP wskazuje na ostatn�2�������2�������2; pod BP + 8 - pierwszy ��.��������

( !�"�* ������ ����������������������������������������������������������������������������� ���������������� ��8<<�=-��N.( !�"�-���������������������������� �������������������������� �����������������������������������������,

sub SP, 4; �����'�����'�������&�����

mov BP, SP;OPIS ZMIENNYCH LOKALNYCH:�)$�"����������1��������...

�)$%&�"����������1��������...

...

+�(����������

* ����� ��� ���������������!�����������������+���+H���������������������������������$ ��� tej procedury.<�#����������������������� ���(�������� �����������������+����!��� ����������� ������� �����������$ �����

����������� ������� �",�<�#��������������,����!�����������$ �����$������ ���������+����#���� ���������

������ ����������������������-12>��������#������!��������������$ �������� ������� �� ���������� ����

����#����������������� ��������+���,DodajDomysl PROC

mov AX, 2mov BX, 2

Dodaj: add AX, BXret

DodajDomysl ENDP

*���������� �����������������������$ ��������������#�������� '�CALL <����N���$ ���O.( ! ) <����������� �����������������������'

• nazwa procedury• co dana procedura robi• �����������������$ ���• ��+����������������������������������������������$ ���• ������������������������������������wej.• ��+�������������������!��������������������������� �����• ����� ��������� ����� ��������������$�• ���� �������������������������������� ���������$�• ���������������� ����������� ����

Page 10: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 10

Makroinstrukcje3������������������������� ������K����L������������������ ������������� �����preprocesingu asemblacji.2�������#������������������������������� ��������������������� ��� ,

Definiowanie3�������!������#���!�"��������������������������!� �#����������� ������#�����#��� �'<nazwa_makra> MACRO <parametr1> , <parametr2>, ...�����P��������O��������������� ���� ����������parametry�������������+��������� ������������preprocesingu)����������������������argumenty.Parametr makra�����������������"�����������$�������������������38>12�������!� �������Argument makra������������������$ �������������������������,2������������������+������������ ��� ��������+�"���������#��������������������� ���������P��������O<�!� �#���������� �������������ENDM.( ! ) - etykiety�������� �����������lokalne�����������������������������������������!� �������������������������������",�* ����� �������������7����������������������������� ���38>12"��������������������������

������������� �������� ����������������������'

LOCAL <etykieta1> , <etykieta2>, ...4��������������� ������������������#�����!� �������,

-������������$���������������������+�������������"Gotoxy MACRO WspX, WspY

LOCAL Petla, Koniecmov DH, WspXmov DL, WspY

Petla: dec CX...

Koniec: mov AX,[BX]ENDM

( !�"��������� �������������������14Q������������������������������������������"( ! ) - przed ENDM nie stoi nazwa makra( !�"�����$����������������#���������������� ������+��������������������� �������������������� ������ ������� parametrów (��������������#������� �#���+���������������������� ����� ������� �������� ��������������parametrze � ��$���������������������������������������������� �������������������������������������������������#������������� �����������������������������) � ����������������������������� ��������� �� ��������+��������+���������������������$ ���������� ��������� ����������� ���������� ����� ������� �

�����$�������������������������������#�������������������� �#������������������)

�����������

.�� ���������������������������������� �������������������"�����������#������������ ������'

<nazwa_makra> <argument1> , <argument2>, ... np. Gotoxy 10, 20( !�"���������������# �����������+������������+�����������������������������",�.�������arg. ������,( !�"�������������>8YYPrzekazywanie dalekiego adresu�������������������������+ ���!!����������$�������������������������������������,������ ������# �����������! ����"�����������������#������� ��LES wg. schematu:

Clrscr MACRO AdresBuf, CzymczyscLES DI, DWORD PTR AdresBuf ; ���)�0�����������������������3#4�5

*�����������������������������������'Clrscr 0B800H:0000H,‘ ‘

Wzorzec programu „exe”;---------------------------SEGMENT STOSU - STARTStos SEGMENT STACK

DB 64 DUP (‘STACK!!!’)Stos ENDS;---------------------------SEGMENT STOSU - KONIEC

;---------------------------SEGMENT DANYCH - STARTDane SEGMENT

Zmienna DBDane ENDS;---------------------------SEGMENT DANYCH - KONIEC

;---------------------------SEGMENT KODU - STARTKod SEGMENT

assume CS:Kod, DS:DaneMain PROCStart: ��������������(������

mov AX, Dane

Page 11: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 11

mov DS, AX ��� ������������������'�������������������/

...

mov AH, 4CH ��6�����������7#���8��2��'������

mov AL, 0 ��������������� �������������'�39979:3;3:

int 21HMain ENDP

Kod ENDS;---------------------------SEGMENT KODU - KONIEC

END Start

Program typu „com”�����������

• zbiory . ��������+��������,���E(7�������������+��������,exe)• programy . ������������������#��������� ����������� ��:;6?• dla programów .com stos jest generowany automatycznie, miejsce na niego przydzielane jest w ramach segmentu�����������������������������$��������������$������ ���������� �����������#

• program . ���������!�������������������������������������� ��������������������������� ������������� ������������� �������������

• ������������������������������������������������������� ���������������������� ������������NEAR)• ���������� ������������������������������������������ ��������������������������������������"• ��������������������7E:?����PSP �����+������� ��������������������# �<2="�������� �����������'

ORG 100H ���� �������������

Wzorzec programu

Kod SEGMENTassume CS:Kod, DS:Kod, SS:KodORG 100H

Start: jmp Main������0����'����(�������������������4

Zmienna DB...

Main PROC NEAR

...ret

Main ENDPKod ENDSEND Start

Tworzenie programu wynikowego• ��������������� ������H�+�������• ����������������� ��� �����������Warning: No STACK segment! )• ������� ���������EXE2BIN ������������������,exe na .com

��������������� ������������

5������������+������������+�������������

-�� ���������������������������� ���� ,�-�����������������������#�������������������������,�-���������

�������#��� �� � �'

• nie posiada punktu startowego (nic po END)• ��������������������� ���������T���+�������������"• ������������������������������������������������������+�����"• ������������������������ �� �������������������������#�����"• ��$������$�procedury�����������$ ���"� ���������#��������������������������������������������� �����

segmentu kodu: PUBLIC <etykieta1> , <etykieta2> , ... � P��������O��������������#�������� �������������������$ ����� * ��������� �#$ �����������������!����������$���� ��� �������� ������������� ��-12>��4B<-• ��$�� ���������#����dane��������������������� ����������������������� ������������������� ' PUBLIC <zmienna1> , <zmienna2> , ... ������������ �#$ ��������������������!��������������������+����

zmienne (np. ������� �����������<?��<* � ���</-��" )

Page 12: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 12

• ( !�"���$������������ ����� ��������������������#�����$�������� ������ ���������������������������������������=4J34BQ��������������#�PUBLIC.

• ( !�"�������������������� ���������������������������te same nazwy����+� ���������������������������� �#$ �����������������������������,

• ( !�"�����������������������������������+������������ASSUME.

-�������'�""""""""""""""""""��������������������������""""""""""""""""""

Dane SEGMENT PUBLICPUBLIC Eol, Ekran

Eol DB 0DH, 0AH, ‘$’ ��������������������������2������������emEkran DW 184FH ; y = 18H = 24D, x = 4FH = 79D

Dane ENDS

Kod SEGMENT PUBLICPUBLIC DodajDomysl, Dodaj

ASSUME CS:Kod, DS:Dane

DodajDomysl PROCmov AX, 2mov BX, 2

Dodaj: add AX, BXret

DodajDomysl ENDP

Kod ENDS

END

��(����������������+���������,������+���

• ��$������������ ����������������������$��� ����# ����#���������������������������' EXTERN <nazwa_procedury> : PROC np. EXTERN ClrScr: PROC <�#�������K��!������L�������#����������������������������������� ���$�,�8������������������������������ �� �� ����#��������� ���#�������#�������������, ( !�"�<������ ������������#��������� ������������ ����������� ��� ���� ( !�"�9�$�� ��������������������+�����$ ��� ������������������������������,• ��$�� ����������������danych����!������ ����������������������������������' EXTERN <nazwa_zmiennej> : <specyfikator_typu> , ... gdzie specyfikator typu�����$���������������������������������������������������������������������������$ ����������������� ��+��������������������� ������� ����������� ",�3���������������#��� �������$ ' BYTE, WORD, DWORD���������#�������������������!���������������������<?��<*��<<, ( !�"�J�������#����������������������KstringL����������������������� ��DUP( ) jest ona definiowana przy pomocy dyrektywy DB ������������������������������BYTE -��������������� ������������� � �����������' EXTERN Eol:BYTE, Ekran:WORD ( !�"�-������������������ ����������#����������#�specyfikatora typu�����-12> ( ! ) Deklaracja ta jest w segmencie danych

6!����������+���

Z� ��������������������������� ������������������������������.obj������������ ������+�������#������������������������������������#�����������+�������������� ������+�,

Biblioteki makr?������#���������������������������������� ����������!� ���������� ������������������+������ ���

segmentu kodu). Plik taki ma rozszerzenie .mac ,�*�� ��������������������(�K������ ��L�������������������+�����"����#����������� ������������INCLUDE ������+��������#�������������,

Przerwania ��������������/���

/�������������#�����������������#����� ������������� �������������#���� . W odpowiedniej chwili oprócz���������������������������������������������������������!���� �����������������0�kod typu,�3����� �������������+����7E:��+��� ����+�,�B����������������� �������� ��������������������������0���� �������������

���������������������� ��������������;,�<�#�������������������������� ���� ��������+��� ���������

��� ����������+�����������,�2�+ ����������� ���� � �������������������� �����������������������������

Page 13: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 13

������������������,������������������)",�-��������������������������������������������������������������

programów...

Przerwania programowe* ������� ��K)L�����������#����������7E:���� �� ���������� ���������;����������7���������������������������7��������

��������# �"�����������+���+��� ��� ����������������������� " ��������������������(6?�183,�6����adres - wektor przerwania . Tabela ta zwana jest �������������+���������,�-��#���������������?52=��<2=����������������������$�������� ��,�* ��������������<2=�����������������������������������������T�numer przerwania)����������#��������� �������������� ����"��������� ��������������������� ����������������#����+��� ����� � ,

*���������������������#���������� ��INT <numer_przerwania> np. INT 21H. Przed skokiem do odpowiedniejprocedury (przerwania) INT wykonuje:• �����������������������$�������������� ���+���(������"• �������!���#�5D������������� ����������������������������������������������������������������������$ ������������������"������QD

• ������������������������������������>=• ���������������������������������������• �����������������������!!����������5-• ����������������$�������������������8��������������+��������������������������������������������� ��������IRET����+�������������������przeciwne do INT.( ! ) – istnieje warunkowa wersja INT – INTO���������������������������������������������������������(overflow)

Przerwania zarezerwowane-������������)����(DA�����������������������5����&�,�3������,�����#��� ��!��� ��'

)�0��������������0�����������$ ��#������������������������������)

(�0������� ��������0�����#������������������� �����������debugowanie krok po kroku2 – ����������������������0������������������������������������������������G�0�����������������0������������������������������������# �������������������

;�0��������0���������������� �#�����������������,

...-������������7)A����GDA�����������������������<2=,

7) �0������ �����������������������

7( �0�����������������<2=

22h – adres powrotu po wykonaniu programu7G �0����������$ ������Ctrl-Break7; �0��������������������#��

25h – odczyt sektorów z dysku26h – zapis sektorów na dysk7C �0������ �������������������������������#

1�2�����������������,�������+������+3���������*

-�� ��������������������������������� �������������,�<�!������#������������������ ��'<nazwa> PROC FAR

...IRET

<nazwa> ENDP

*���������� �����������������#�������������������5D���������������������������$ �!������,�����������������5BQ,

�������������!���,�������+������+3���������*

1. �����������������������#�������� ��������������$�����������������������������2. �����������������������������#����������������� �����������������������������"3. ��������������������������������������������������� �������������������+ �������������������������-���������� ���� � �����$ �����������#�������#��� � �!��� �����������21H DOS:• ustawienie wektora przerwania � funkcja AH = 25H, AL - numer przerwania, DS:DX����������� ������������• odczyt wektora przerwania � funkcja AH = 35H, AL - numer przerwania, ES:BX���������!���������� ������������-����������� �� �������������������������������������'

; w segmencie danych istnieje linia: wektor DW�����0�������������2�������(�MojePrzerw; w segmencie danych istnieje linia: adres DD MojePrzerw...�����������������/������'���� ��

Page 14: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 14

mov AH, 35Hmov AL. 0int 21H�������(����������'���� ��

mov wektor[0], BXmov AX, ESmov wektor[1], AX;zapisanie nowego adresu�����*+�����������#4�*���0�����������'����.��6�����

mov AH, 25Hmov AL. 0int 21H...;przywrócenie pierwotnych wart.lds DX, DWORT PTR wektormov AH, 25Hmov AL. 0int 21H...

1���������+��+3�1 0

<2=������#��������E)��� ����������������#������������������21H,�* ��+���� ����������$���� �����AH oraz����������������� ���� ��������+������������$ �����������������������,

( !�"�0�D��� �����������������������������!�����>D,�J���>D�T�)�0����� �������� ������#����$�����>DT(�������������������+������������!�����8F,

( !�"�0������������� � ���������� ����������+����������� �����#��������%)&,AH Operacja 1������������ Wyniki

2�������������

2 *�$��������������������������Ctrl-Break) DL = znak kursor za znakiem5 Wydruk znaku DL = znak6 *�$���������������������������Ctrl-Break) DL = znak kursor za znakiem9 *�$����������� � ������� �������%[&

�������� ������������������������� ������ �

<='<F�T���������� � �

( !�"�������� �����%[&,������������� � ��

40 patrz � !���������"������������������� BX = 1, ...2����������������

1 >��������������������������������#��

��$�����������������������Ctrl-Break)AL = znak

6 Odczyt znaku z klawiatury (bez kontroli Ctrl-Break) DL = 0FFH 8Y�T���������$���������

= 0, gdy brak znaku7 >��������������������������������������$�������

(bez kontroli Ctrl-Break)AL = znak

8 >��������������������������������������$�������

������������Ctrl-Break)AL = znak

A * ���������� � �������������������!���

������ ����"�� ���������������#������������������

� ���$� ���� ���� ����������� ������� �$

������������� �� �� ��������������

� �������� �%&'%!

DS:DX = adres bufora,( ! ) – pierwszy bajt bufora����$����������������

����� ����� �� ������bajtu,���� ���� �7�������,

Drugi bajt bufora����$�����$�

przeczytanych znaków

B Odczyt stanu klawiatury AL = FFH - brak znaku,������T�)�0����������#��

C *� ���� �������!������������������������!��� �

����������������

8Y�T�������!��� ��������

(1, 6, 7, 8, A)* ��������$ ���

������������!��� �

Czas i data2A Pobranie daty CX = rok

<A�T�����

<Y�T�����

2B Ustawienie daty CX = rok (1980 – 2099)<A�T�����

<Y�T�����

AL = 0 – data poprawna������T�DD�0��������#���

2C Pobranie czasu CH = godzinaCL = minutyDH = sekundyDL = setne sekundy

Page 15: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 15

2D Ustawienie czasu CH = godzinaCL = minutyDH = sekundyDL = setne sekundy

AL = 0 – czas poprawny������T�DD�0� ������#���

Komunikacja asynchroniczna3 �� ������������������$ ������ ��� ����� AL = znak4 ��������������������$ ������ ��� ��� DL = znak

2���������+�

D Zapis zmienionych buforów dyskowych z powrotem����������#

E *�����������$��������#�������� DL = numer dysku(0 = A, 1 = B, 2 = C ...)

8Y�T���$������+�

�7���������������#��"

19 -����������������$����������� AL = nr dysku (j. w.)2E .�������������H��������!�� � DL=0

8Y�T�)�0����� ����

������T�(�0���� ����

30 Pobranie numeru wersji MS-DOS AL = numer wersjiAH = numer zmianyBX, CX = 0

2����������������������

25 /����������������������� DS:DX = adres wektoraAL = numer przerwania

35 -���������������������� AL = numer przerwania ES:BX = adres wektora1�����������!��� ������������+����������+�

39 Utworzenie katalogu <='<F�T���������� � ���

��������������

3A /���# ���������� DS:DX = j. w.3B Zmiana katalogu roboczego DS:DX = adres katalogu do

��+����� ��������$�

47 -�������������������������� �����0����� ��� <=�T������#��

�)�T�����$����

1 = A, 2 = B ...)DS:DX = adres 64-bajtowego bufora

<='=5�T���������� � �

docelowego

36 Pobranie wolnego obszaru na dysku <Y�T������#�����,��," 8F�T���$��������+����

klaster, = 0FFFFH w�������#��

?F�T���$�������

klastrów>F�T���$������+����

sektor<F�T� ����������$�

klastrów3C Utworzenie pliku <='<F�T���������� � ���

�����

CX = atrybuty pliku (patrz����������"

AH = uchwyt do pliku����������������"

3D Otwarcie pliku <='<F�T���������� � ���

�����

AL =0 – otwarcie do odczytu =1 – zapisu =2 – odczyt & zapis

AH = uchwyt do pliku����������������"

3E .����# ����� BX = uchwyt pliku�������������������������"

3F 2� ��������������������" BX = uchwyt pliku�������������������������"

>F�T���$�� ������ �����+�

DS:DX = adres bufora

8F�T���$���� ������

bajtów = 0 odczyt poza plik

40 .��������������������" BX = uchwyt pliku 8F��T���$��������

Page 16: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 16

�������������������������"

>F�T���$������+������

<='<F�T�������H�+���� ���,

bajtów

41 /���# ����� <='<F�T���������� � ���

�����

43 Nadawanie atrybutów plikowi AL = 1<='<F�T���������� � ���

�����

CX = atrybuty (patrz pod�������"

54 Pobranie znacznika sprawdzania AL = 0 – brak zapisu sprawdzania = 1 – zapis ze sprawdzaniem

56 Zmiana nazwy pliku <='<F�T���������� � ����

�����������

4='<5�T���������� � ���

����������

.������������ ����

31 .���� �������������������������������# AL = kod powrotu<F�T����������# ��

paragrafach4B .��������������������������� AL = 0

<='<F�T���������� � �

nazwy programuES:BX = adres blokuparametrów

4C .���� ������������ AL = kod powrotu dlaErrorLevel

4D -��������������#������������������������� AL = kod powrotu dla�� ���������� ���

62 Pobranie adresu bloku PSP BX = adres segmentuPSP programu

.������������# �

48 .���������������# �������������183" ?F�T���$�������������

paragrafówAX = adres segmentu z����������������# �

49 .�������������������������# ES = adres segmentu ze�����������# �

4A .����������$ �������������������������# ES = adres segmentu obszaru��#

-����������������������������#��

59 -����������������������������#�� BX = 0 AX = rozszerz. kod?A�T���������#��

BL = zalecana reakcja>A�T��������

Atrybuty pliku�����$���������������+�,�.�� ������������ ���+�'0 – read only, 1 – ������7�0���������G�0� ������������������;�0� ���������������������E�0� �����������������backup)Uchwyt pliku�0������������!���� ���������������������������5W2,�5�����������#��� ����������� ���+�')�0����������������$ ���<2=���������������������������������������"

(�0����������������$ �������$�����������)7�0����������������$ �������������#�+���niezmienialne)G�0�������������������������������������"

4 – drukarka=�������������������� �����������������������������;�� ���������<2=�����������@�� ���+�,�3��������������

��#�����,

���(�������������������2��������������1 0�%�4� 0

( !�"�>�#���������� ���������������������������� ��� �����������"�� ����+��������������?52=���� ���������� �<2="�����������#�������������������$ ����������AH

Page 17: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 17

VIDEO (BIOS) - przerwanie 10H.• gotoxy � AH = 02H, do BH - strona karty graficznej (zwykle = 0), DL�����+���#����K\L��DH�����+���#����K�&���+���#������! ) liczone od 0

• scrolling okna/ekranu (czyszczenie okna/ekranu) � AH = 06H, CX�����+���#������������+�����������������DX -��+���#��������������������������������+���#����� ��������)������������ �����+����K�L������������ ���K\L����

AL�����$�����scrollingu, ( ! ) AL = 0 - czyszczenie ekranu.• odczyt typu karty �AH = 1AH, AL = 0 (������������� �������!���� �����8Y����� �������!�����������"

Konfiguracja (BIOS) - przerwanie 11H, zapisuje do AX������������+���������������� ���+��� ���+������ ��'0 - istnieje FDD 1 - istnieje koprocesor 2 - zainstalowana mysz G�����$��183 4,5 - tryb video :�C�����$��D<<

I�()�((�����$�����+����������� 12 - istnieje GamePort 13 - zainstalowany modem (wew.) 14,15 - il. druk.

Programy rezydentneProgram rezydentny �+����#���������������������������!��� ������������� �������������������������� ������,-��������������������������������# ������������������������������������������������������������# ����������,

*������������������������+�������$������������#��� ��������������������,�*+� �������$���������

������������$ ����������������� �������������� ������������������# ������� ���������Q=1,�-�������

�����������������+�������������������!��� �����+ ����������������������,�5 ��� ���������+� ������

� �����������������������������"����+������������������������ �,�* �����������������������������������

�,��� ����#�������������������������������������������������������������� �#������������������� ������

���������,

-�������������� ������������������������ ��������������#��� � �!��� �'

KEEP - funkcja 31H przerwania 21H,�-�������������������������������������'AH - 31HAL -��������$ ��������������������������� �������� ����,������������ERRORLEVEL)<F������������# ������������������������������������������(:�������� �������!�

D��� �����������������$ ������� �������� ����,�� ���&��<2="���������� ������������� ��������# ,�Gdyprogram otrzymuje kontrolê, funkcja EXEC (4bH) alokuje blok pamiêci zaczynajacy siê od PSP i zawieraj¹cy ca³¹ dostêpn¹pamiêæ. Pamiêæ ta przydzielana jest procesowi. Wykorzystuj¹c funkcjê 31H <2=������ �����#�������� ���������� ���������������������������������������<F�������$��<F�U�(:�?���+�",�D��� ��������������������� �������+�

��# ����+����� ������#���� ��������������������� ��!��� ��;@A,

TSR - przerwanie 27H,�B������������'<F���������������������+�����# �������������������� �#$��������������������������!!��������#����<=�

��#���������(,

D��� ����������������������������������<2=������ ��������# �������������������# ���� ��������

� ������-=-�������$ ������������<F,�-��#������������������#������������ ����,

( !�"�-���������7CA�������� ���������������������������<2=������� ��������$ �������+����������77A�7;A����� ������!��� ����������������������+����� ������ � �Critical Error lub Ctrl - Break��������������,( !�"�-���������7CA���������#�������������������������������������������+�������������PT�:;6?�� ���������!�������������������������������?���� ���(:������������������<F"

Dyrektywy zaawansowaneEVEN�0���������������������������H������������������������������� ������+���� ���������������� ���������������������������#����� ��,

<nazwa> GROUP <nazwa_segmentu1> [,<nazwa_segmentu2>, ...]�0��������������������������������P�����O����������������������������:;������������������,

5D]]�P��������O�,,,�R�4Y=4�S�,,,�4B<5D�0������������������� ������������������������������� ������ � �#$

�����������������$ ����P��������O,�8������ ��������� �������4Y=4��� �������������$ ���������������������

IF:5D4�0���������������)

5D�0������������������)

5D<4D�0�����������������������!�������������

5DB<4D����������������������������!�������������

Operatory2������+������������������������������������������������������,

Page 18: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 18

• arytmetyczne+, -, *, /, MOD�0����������P�����$�(O�P�������O�P�����$�7O� SHL, SHR ���������P�����$�(O�P�������O�P��������O

• logiczneAND, OR, XOR�0����������P�����$�(O�P�������O�P�����$�7O� NOT�0����������B2Q�P�����$�O

• relacji�����������������������#�P��������(O�P�������O�P��������7O������ ��������#����'

EQ – a1 = a2, NE – a1 != a2, LT – a1 < a2, GT – a1 > a2, LE – a1 <= a2, GE – a1 >= a2• ����(��+!���������

$������� ������ �������$������H��������������0������$������H��������������[SEG 0����� �������$������������������������������������ �������������������OFFSET�0����� �������$���!!������������������������LENGTH 0����� ����������������� ���������� �0����������$ �������������������������������!������"

�����������!��������������� ��</-

TYPE�0����������� ������ � ����Q̂ -4����� �'�(�0�?^Q4��7�0�*21<��;�0�<*21<�,�<�������������� �'��(

–NEAR, -2 – FAR.

SIZE – zwraca iloczyn LENGTH i TYPE• atrybutu

PTR�0�����#��������������'�P��O�-Q1�P��������O�������P��O��?^Q4��*21<��,,,���B481��D81�"����� ���������������������������������������������������,

DS:, ES:, SS:, CS: - atrybuty zmiany segmentuSHORT�0��������'�93-�=A21Q�P�������O����!��������������������P�������O������������������(7C�����+����

instrukcji aktualnej.THIS�0����� ������������ ��������H�������������HIGH – zwraca starszy bajt 16-bitowej liczbyLOW 0����� �����������������WW��

Koprocesor��_�"�0�8������������������� ���������������������������#�,7@C�����������,

Budowa6��� �����������@��@)������ ��������+������ ��(��������������(����������������,�=�����������������!��� ��

������ ����������������!���,�=�������������������$�������������+������ �������������������������������������

���������������� ����$������������������$����� ���,�1������+������ �������������#������stosu koprocesora. Stos ten������������������������� ���� ������������� ������������������������������������������",

Typy danychY �������������� ������������������� '�(�0�����������(E�0���+�������������:;�0������������,�6��������� ��

��������������� ������ ���������������������� ��� � ������� ��������������� ���� ,�<���#�����

����#��� ���������� ���������#���������$ ��������� � �!�"'

• Word Integer - 16b, -32768, 32767, 5 cyfr• Short Integer - 32b, -2 * 10^9, 2 * 10^9, 9 cyfr• Long Integer - 64b , -2 * 10^18, 9 * 10^18, 18 cyfr• Short Real - 32b, 10^-37 , 10^38, 7 cyfr• Long Real - 64b, 10^-307, 10^308 , 16 cyfr• Temporary Real - 80b, 10^-4932, 10^4932, 19 cyfr• Packed <� ������@)���(@� �!������#��� ���������(@� �!�

Instrukcje koprocesoraInstrukcja Opis ����������������,

D?Y<�PH�+���O

FBSTP <przeznaczenie>D5Y<�PH�+���O

FIST <przeznaczenie>FISTP <przeznaczenie>

���������� ������������� ������������������+������ ����� �����

��������������������#���

����#�������P������ ����O��������������#����������������������

������� �������

����#�������P������ ����O� �����������_�0���������������������"

����#�������P������ ����O� ��������������������������

Page 19: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 19

DY<�PH�+���O

FST <przeznaczenie>FSTP <przeznaczenie>FXCH <przeznaczenie>

���������� ������

����#������� ������

����#������� ���������������������

�������������������� ����������� �����������

Arytmetyczne

D8<<�RP������ ����O��PH�+���OS

D8<<-�P������ ����O��PH�+���O

D58<<�H�+���

D=/?�RP������ ����O��PH�+���OS

D=/?-�P������ ����O��PH�+���O

D5=/?�PH�+���O

D=/?1�RP������ ����O��PH�+���OS

D=/?1-�P������ ����O��PH�+���O

D5=/?1�PH�+���O

D3/Y�RP������ ����O��PH�+���OS

D3/Y-�P������ ����O��PH�+���O

D53/Y�PH�+���O

D<5M�RP������ ����O��PH�+���OS

D<5M-�P������ ����O��PH�+���O

D5<5M�PH�+���O

D<5M1�RP������ ����O��PH�+���OS

D<5M1-�P������ ����O��PH�+���O

D5<5M1�PH�+���O

FSQRTFSCALEFPREMFRNDINTXTRACT

FABSFCHS

( !�"���������������������������#������7�������� ����������������������#�H�+������������� ����������������� ����������H�+���"�

odwróconym������������#������� ��������H�+����������H�+��������przeznaczenie)

dodaje rzeczywistedodaje rzeczywiste i zdejmuje ze stosu������� �������

odejmuje rzeczywisteodejmuje rzeczywiste i zdejmuje ze stosu��������� �������

odejmuje rzeczywiste (odwrócona)odejmuje rzeczywiste i zdejmuje ze stosu (odwrócona)��������� ��������(odwrócona)

��������� ������

��������� �������������������������

������ �������

dzieli rzeczywistedzieli rzeczywiste i zdejmuje ze stosu����� �������

dzieli rzeczywiste (odwrócona)dzieli rzeczywiste i zdejmuje ze stosu (odwrócona)����� ��������(odwrócona)

pierwiastek kwadratowy�����������������#�#�7

�#$ ����������

��������������� ��������

wydzielenie cechy i mantysy

*����$���������#���

Zmiana znaku

Porównania

D>23�RPH�+���OS

D>23-�RPH�+���OS

FCOMPP

D5>23�PH�+���O

D5>23-�PH�+���O

FTSTFXAM

��+������� ��������� ������������������ ������� ��������������������

����#

porównuje rzeczywisteporównuje rzeczywiste i zdejmuje ze stosuporównuje rzeczywiste i 2 razy zdejmuje ze stosu

��+������ �������

��+������ ��������������������������

sprawdza, czy szczyt stosu jest 0bada szczyt stosu

����/���

F2XM1FYL2XFYL2XP1FPTAN

��� �����!��� �������������������� ���,

oblicza 2^X - 1oblicza Y * log_2 (X)oblicza Y * log_2 (X+ 1) �#$ �����������

Page 20: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 20

FPATAN �#$ ����arcus tangens

0����,

FLDZFLD1FLDPIFLDL2TFLDL2EFLDLG2FLDLN2

����� ������������������� ������ �� ���������� ����������������

��������$���Temporary Real)

��������),)

��������(,)

��������-5

�����������N7��()"

�����������N7���"

�����������N()��7"

��������log_e (2)

0��+!��

DY<>* �PH�+���O

FSTCW/ FNSTCW <przeznaczenie>FSTSW / FNSTSW <przeznaczenie>FSTSW/ FNSTSW AXFSAVE/ FNSAVE <przeznaczenie>D1=Q21�PH�+���O

DY<4BM�PH�+���O

FSETPMFSTENV / FNSTENV <przeznaczenie>FWAITFINIT / FNINITFENI / FNENIFDISI / FNDISIDCLEX / FNCLEXFINCSTPFDECSTPFFREEFNOP

�����#������!���� ������������������$ ����������,�����������

����+����������������������������������,

��������������������� �

����#����������������� �

����#���������������

����#����������������8F

zachowaj stanodtwórz stan��������$��������

ustaw wirtualny tryb pracy����#����$��������

wait (zatrzymuje proc., zabezp. przed korzyst. z tych samych obszarówRAM)inicjuje (resetuje) koprocesorzezwala na przerwaniablokuje reakcje przerwania�������������

��#���������H��������

�������������H��������

zwalnia (zeruje) rejestrynic nie rób

Niebieskie karty5������ ��������������������#� �#���������� �������� �����,�.����������������������������� ���

����� ���������������#�����!������ �znaczników��������������!����� ���� �,�8������+��������#���!������� �����������#�����#��� ��symbole operandów:• r8���@���������+������������• r16 - 16-bitowy rejestr ogólnego przeznaczenia• sr - jeden z rejestrów segmentowych• m8����������+������ ���# ��� ������"• m16�����������# ���• i8 - bajt natychmiastowy• i16 ������������ �������• d8 - 8-bitowe przemieszczenie��������������������$���#����������������������������� �����������������������+��� ������� ���,�-������� ���������������������������������������������,�9�����������������#���

aktualnej instrukcji.• d16���(:�������������� ������������������������� �������� �� ������������������+�

InstrukcjeRozkazy transmisji danych( ! "���5������ �������������������!�������� ���+�,MOV <op1>, <op2> ����������������$����������7��������������� ��������������"������������(,�2�������������������������������������� ������ ���'

( !�"������������������������$ �������������,���# ����������( !�"�����������������������,�����������������������������������������

Page 21: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 21

( !�"����������������������� ����� ������� �����������+������������ ( !�"���������������������������� �������� ��+��� ������$ �(MOV 16bitów 8bitów)( !�"����������!������������������������� ���+�

* ���������������������7����������������������������������(������������������������$�������������,

LEA <op1>, <op2> � przenosi efektywny adres operandu 2 do operandu 1 np. LEA DX, ZmiennaLDS <op1>, <op2> � przenosi daleki adres <op2> do pary rejestrów DS:<op1>LES <op1>, <op2> � przenosi daleki adres <op2> do pary rejestrów ES:<op1>LAHF � przenosi do AH�������������������������� ���+�SAHF ���������������������������������������� ���+���������$�����������8AIN <op1> , <op2> ������������P�(O��������$�����R�P�7O�S( !�"�������������������������������'�8Y�������$��@������������8F��<FOUT <op1>, <op2> ���������������R�P�(O�S��������$��P�7O( !�"�������������������������������'������$��@��������8Y������<F��8FXCHG <op1>, <op2> ����������#��������������$ ������������������������,XLAT � zapisuje w AL �������# ������������<='R?F�8YS������������ê, gdy pod DS:BX jest tablica bajtów, a do AL������������������������� ̀����������������� �

PUSHA (286) - ����������������������������������$ '�8F��>F��<F��?F��=-��?-��=5��<5,( !�"�* ����$��SP�������������������������$�����������������-/=A8�����$�� ���#����������������-2-������������������������������# ��=-����������# ��=-��#��������������������������������������������������+�"

�������+��8F��>F��<F��?F������ ������� �����#

POPA �7@:"���$ �������������������������������$ ��������������-/=A8������ ����������������=-PUSHAD i POPAD (386) - jak PUSHA i POPA, tylko dla rejestrów 32-bitowychIN <op1>, <op2> - przenosi dane z portu do akumulatora. <op1> = AL – przenoszony jest bajt, = AX – przenoszone jest�������P�7O��������������0���������� �������������������$�����������<F,

OUT <op1>, <op2>�������������������������������������P�(O��������������0���������� �������������������$�<F��P�7O�������������������� w AL lub AX.

Operacje arytmetyczne( !�"�2���������������������������� ����������� �������������!�����'�2D��=D��.D��8D��-D��>DINC <op> ����#�������(������$�������������! ) nie zmienia CF.DEC <op> ������������(������$�������������! ) nie zmienia CFNEG <op> ��������������$����������5 � -5ADD <op1> <op2> � dodaje <op2> do <op1>, dla bez i ze znakiemSUB <op1> <op2> � odejmuje <op2> od <op1>, dla bez i ze znakiemMUL <op> ������������������������������� �������8F�������$��������#��������:EEGE���������<F��8F���������bity w AX). <�O�����������@���+� ������������������������#����AL����������@������",�P�O����������P�(:O����P�(:O���+� �������������������AX�����������",( ! ) MUL modyfikuje AX i DX( ! ) <�O�B54������������������� �������IMUL <op> ���������������3/Y����������� ����������������������!�����8F���$�����������#��������G7C:CDIV <op> �������� ��#������������������� ���#���8F������Pop>, wynik trafia do AL, a do AH trafia modulo.3�������������������������(:��������������������������#���<F���8F����������!�����8F������������<F

IDIV <op> � jak DIV, tylko dla liczb ze znakiemADC <op1> <op2> � �������P�7O����P�(O������������� �������>D�SBB <op1> <op2> � ���������P�7O����P�(O����������� ������ �����>DCBW ����$������������������AL ustawiony ������������������8A������� ���������������������������CWD ����$�������������AX ustawiony ������������������<F������� ���������������������������AAA ����������������#��������� ��������������������?><�����������AX). W BCD w ramach ���������#�����������;�����������������;���������������������"������ ������������������������������ � �!��)�I,�888������

����#��� �'�����������������$��;�������� ���+��8Y������$������������ ��#�OI�� dodaje 6 do AL., zeruje 4 starsze��������������� ����>D��8D����������������$��8A�����������#������,�9�$����8Y,������� ����PT�I��>D��8D���

zerowane.AAD ����������������������������?><�����������8FAAM �������������������������?><�����������8FAAS �������������������������?><�����������8F( !�"�.����8=>55���������� �� �!��������������!�������������$���������������� ��������8=>55����������������������������� ��#�?><��+� ����������������$����������������������������,

DAA ��������������������������������� ������������� ���������������?><������������������������������7� �!������ ��#�����#�������������������#���;�������������� �!�#

DAS � korygowanie wyniku odejmowania dla liczb traktowanych jako upakowane BCD

Page 22: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 22

Operacje logiczne( !�"�B�������� ���������������������� ����������� �������������������������$�����������seg. do innego( !�"�<��������������� ���������� AND <op1>, <op2> � dokonuje logicznego and�������������������+��� ���� � ������������P�(O��P�7O�wynik umieszcza w <op1>.

<�O������������@�����(:������,OR <op1>, <op2> � jak w AND, tylko dla logicznego or.XOR <op1>, <op2> � jak w AND, tylko dla logicznego xor.NOT <op> � neguje wszystkie bity <op>, wynik w <op>( ! ) nie modyfikuje ¿adnych znaczników (nawet ZF)Wydzielanie bitu��������� ������������+�������������������������������("�������� ��8B<��#���������������������������������"

Ustawianie bitu�����������#�����#������+�����������������������������,��K(L��������#���21��#�������������������W�����������+���� ��������������

Zerowanie bitu����������������#������+��������������������������������K(L��������B2Q������� ��������"�����+��� �����������������21��#�������������������������������������"�����������������B2Q"

Szybkie zerowanie danej������ �������� ��F21���������������������,�XOR AX, AX zeruje AX.

Instrukcje przesuwaniaSHL <op>, <licznik> � przesuwa bity <op> w lewo, uzupe³nia 0-wym bitem, <op> - pamiêæ lub rejestr, <licznik> -liczba „1” lub rejestr CL (nie CX), w CL jest iloœæ, o jaki¹ nale¿y przesun¹æ bity, ewentualnie przesuniêcie o „1”.( ! ) wysuwane bity trafiaj¹ do CF (a z niego donik¹d)( ! ) przesuniêcie 16-krotne = zerowanie s³owa�7@:"���P� ���O�����������������������$ ������ ���������,�SHL AX, 7�7@:"��������$��������# ��P� ���O������ ��������G(��bo np. 32 daje to samo co 0)SAL <op>, <licznik> ���������������������=AYSHR <op>, <licznik> ������=AY�����������������������������������������7@:",SAR <op>, <licznik> � jak SHR, ale uzupe³nia najstarszym bitem (bitem znaku)ROL <op>, <licznik> � rotuje bity <op> w lewo, wysuniêty bit trafia na koniec oraz do CF �����7@:"ROR <op>, <licznik> � jak ROL, tylko w prawo, wysuniêty bit trafia na pocz¹tek oraz do CF �����7@:"RCL <op>, <licznik> � rotuje bity <op> w lewo, wysuniêty bit trafia do CF a bit z CF na koniec�����7@:"RCR <op>, <licznik> � jak ROL, tylko w prawo, wysuniêty bit trafia do CF, a bit z CF na pocz¹tek �����7@:"Szybciej jest zapisaæ kilka razy SH? <op>, 1������������������������������>Y�� ����������#������;��������� ���"=���������������������������������� �������������������������#�#���+�����������������������������

��������� ������������������,���������3/Y������CC� ���"

( !�"������������������a���� #����� ��K���������L�������!������������$ �������������� ��� n "������������������������$ ��7���������������� �������# ��i����������������������������i * n (co szybko��������������� ��=AY"

����+(����(�(+�����/��

JMP <etykieta> � skok do <etykieta> (<etykieta> - wczeœniej zdefiniowana etykieta��������������������$��� �������segment:offset), skok jest bezwarunkowy.( !�"������������������������������������������������G7���������������"J? <etykieta> ����������P�������O����������$ ����%]&����������� ���+�����������������"( !�"�5������ ������������������������������������bliskie��������������������������R�(7@��(7CS��������������( !�"��������� �����������������������������������������������������������#������������������������instrukcji

�������� ��������������������������������

( !�"�<���������������� ��������������������������������� ����������� ���������������������������� �����������( !�"������������� ���������������,��#�����T��������������+���)( !�"�5��������������������������� ������� ���signed i unsigned.Liczby ze znakiem - najstarszy bit = 1, gdy liczba ujemnaRelacje��#����� ����'• ��������W��#������less / greater) �liczby ze znakiem (signed)• �����W��������above / below) � liczby bez znaku

Relacje po wykonaniu CMP:Relacja dla:

bez znaku(��������

(co testuje)dla:ze znakiem

(��������

(co testuje)

Page 23: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 23

= JE ZF = 1 JE ZF = 1< > JNE ZF = 0 JNE ZF = 0> JA

JNBECF = 0 i ZF = 0 JG

JNLEZF = 0 lub SF = OF

< JBJNAE

CF = 1 JLJNGE

SF < > OF

>= JAEJNB

CF = 0 JGEJNL

SF = OF

<= JBEJNA

CF = 1 lub ZF = 1 JLEJNG

ZF = 1 i SF < > OF

5������ ���������������������������� �������� ���!���'

mnemonik ��� � �� co testujeJNS skok, gdy brak znaku SF = 0JS skok, gdy jest znak SF = 1JNO ������������������������� OF = 0JO ������������������������ OF = 1JP/JPE ����������������������$� PF = 1JNP/JPO �����������������������$ PF = 0JCXZ <etykieta> ����������P�������O����� �������>F�T�)������������������������ ����"( ! ) tylko skoki bliskie [-128 - 127]( ! ) nie istnieje instrukcja przeciwna JCXNZ������ �� ����+������+��>F�PO),( !�"�����������#���9>F.�������������������������Y22-�����,�B54���� ��������>F�PO�)�����������#����������� ������$ ����#��������� ���������������+������#��#������� ����>F�������),

CMP <op1>, <op2>�����+���������������������������������� ��������������$ �������� ���#�������������P��PT��T��OT��O�",�<���������������������'�wynik = <op1> - <op2>, zapomina wynik a tylko ustawia znaczniki.( !�"����� ��������������� ���������,�9]�����������$ �������� ���#�������������������������������������������>3-������ ���������� ��������������������9]�����9]���� ����������"�������������������������$ �!���,

TEST <op>, <maska>��������������� ���+����������������P�O���������� ����� ��8B<�������K���L��������ustawia znaczniki.( ! ) TEST modyfikuje ZF �����!����������������� ������������������������������ ����������������� �������������������������������B2Q�Pop>BT <op>, <nr> (386) ���������������$����������������P��O�����)"������������P�O�������������������������CF.( ! ) TEST jest szybsze, ale tylko dla sprawdzania, czy bit jest ‘1’ .LOOP <etykieta>��������� ���#��������������#��� �'

• zmniejsza CX o 1• ��$��>FPO)�� skacze do <etykieta>• ��$��>FT)�� przerywa������������#�����#��������� ������Y22-

LOOPNZ / LOOPNE <etykieta> �������� ���#�������������Y22-������������#��� �'• zmniejsza CX o 1• ��$��>FPO)����.D�T�)�� skacze do <etykieta>• ��$��>FT)������.D�T�(�� przerywa������������#�����#��������� ������Y22-

LOOPZ / LOOPE <etykieta> �������� ���#�������������Y22-������������#��� �'• zmniejsza CX o 1• ��$��>FPO)����.D�T�(�� skacze do <etykieta>• ��$��>FT)������.D�T�)�� przerywa������������#�����#��������� ������Y22-

( !�"�5������ ���Y22-]����������#��������+ �����$ ����#������������������������$ ������������������������$ ����������$����������������"��#�����+����W��+�������� ��������������������������",�*+� ��������������������

����������Y22-]������������ ���>3-���+����� ������������������������� ��,

����+(�����*�+�,���

5������ ������ � ���������������������#��� � ��������'

( !�"���� � �H�+����� wskazywany jest przez DS:SI (suorce index)( !�"���� � �docelowy wskazywany jest przez ES:DI (destination index)( ! ) �����$��������� � +������$������������CX( !�"��������� ������������������AX���#�����������!������"( !�"����������������������!�������=5��<5"�����������������!����DF, gdy DF=0 �����������������#�����������DF=1 ����������������������,

Page 24: ASSEMBLER strona 1artemis.wszib.edu.pl/~zab/arch/Asembler_x86.pdf · ASSEMBLER strona 3 IF (interrupt enable flag" ˜ ˇ ˝ >-/ ˙ STI (na 1) oraz CLI˛)",9 $ ˘ $˝ ) ˘ # ˜, TF

ASSEMBLER strona 24

REP STOS{W/B} ������������ � ��� ���������4='<5���������$ �7U>F�����+�"�������������>F������������zawartym w AX (bajtem z AL). ( !�"�-������������� �� ������������# �>F�������������������(����������������������,�*+� ���������� ������ �����������������H�����4='<5�������������������������������� �"���

�������������� � ��,

( ! ) Gdy DF�T�(�������������+�������+�"��� ������#�����������4='<5������ ��������������������������<5���������������������7��("���������������������������������#����������K�����L",�B����� ��<5���������

� ��������� � �,

STOS{W/B}�����������������8F���������8Y"����4='<5��<5���#�����������������������<D�T�("��������7����modyfikuje CXREP MOVS{W/B} - odpowiednik instrukcji REP STOSW (bez REP ������=Q2=*"���+�� ���������������������������������������������<='=5�������������������������������������� ��������������8F�W�8Y"����������4='<5

LODS{W/B} ������������<='R=5S�������W�������������������8F�W�8Y,�B������ ���#�����=5���������W�����,SCAS{W/B} ����+������������������������ ���������� ���"�������W����������4='R<5S����������$ ��8F�W�8Y,B���#�����#�����<5,

CMPS{W/B} ����+������������W�����������<='R=5S������4='R<5S�����������$ ����<D���#������������������=5��<5,REP ���������������������� ������32M=��=Q2=����$��>F�PO)������������������������� �#���� � �����������������>F�����������������(��������$��5-�����������+������#��������� ����#������+��14-"

REPE / REPZ � przedrostek dla SCAS, CMPS, gdy CX<>0 �������������������������� �#���� � �����������������>F����$��.D�T�(��+� ������������#��#�����������5-���("

REPNE / REPNZ � przedrostek dla SCAS, CMPS, gdy CX<>0 �������������������������� �#���� � �����������������>F����$��.D�T�)��+� ������������#��#�����������5-���("

INS{W/B} ����<F�����������#����������������������������$������������� � �������� ����OUTS{B/W} �����<F�������������������������������������� � ��H�+�������

����+(�������,�������������/����

NOP�0��������� ����� ������ ������������������������������������+H����HLT�0����������������������������� ��������������������������������������������niemaskowalneWAIT�0������������������������������������������������������������$ ������� ������Q4=Q�0��������$�����������������������������������#������