[ Pobierz całość w formacie PDF ]

" inne
Zacznijmy je po kolei omawiać (nie omówię wszystkich).
1. instrukcje przemieszczania danych.
Tutaj zaliczymy już wielokrotnie używane MOV oraz kilka innych: XCHG , PUSH i POP.
2. arytmetyka binarna.
add do_czego,co - dodaj
sub od_czego,co - odejmij
inc coś / dec coś - zwiększ/zmniejsz coś o 1
cmp co, z_czym - porównaj. Wykonuje działanie odejmowania co minus z_czym, ale nie
zachowuje wyniku, tylko ustawia flagi.
Wynikiem może być ustawienie lub wyzerowanie jednej lub więcej flag - zaznaczenie wystąpienia
jednego z warunków. Główne warunki to:
f& A - above - ponad (dla liczb traktowanych jako liczby bez znaku): co > z_czym
(przeskocz przykład użycia warunku A)
cmp al,bl
ja al_wieksze_od_bl ; ja - jump if above
f& B - below - poniżej (bez znaku): co
f& G - greater - więcej niż (ze znakiem): co > z_czym
f& L - lower - mniej niż (ze znakiem): co
f& O - overflow - przepełnienie (ze znakiem, np. przebicie 32767 w górę) ostatniej operacji.
Niekoniecznie używane przy cmp.
f& C - carry - przepełnienie (bez znaku, czyli przebicie np. 65535 w górę)
(przeskocz przykład użycia warunku C)
add al,bl
jc blad_przepelnienia ; jc - jump if carry
f& E lub Z - equal (równy) lub zero. Te 2 warunki są równoważne.
Bogdan Drozdowski 35
Bogdan Drozdowski Język asembler dla każdego 2009-02-25
(przeskocz przykłady użycia warunków równości)
cmp ax,cx
je ax_rowne_cx
...
sub bx,dx
jz bx_rowne_dx
f& NE/NZ - przeciwieństwo poprzedniego: not equal/not zero.
f& NA - not above, czyli nie ponad - mniejsze lub równe (ale dla liczb bez znaku)
f& NB - not below, czyli nie poniżej - większe lub równe (dla liczb bez znaku)
f& NG - not greater, czyli nie więcej - mniejsze lub równe (ale dla liczb ze znakiem)
f& NL - not lower, czyli nie mniej - większe lub równe (dla liczb ze znakiem)
f& NC - no carry
f& AE/BE - above or equal (ponad lub równe), below or equal (poniżej lub równe)
f& NO - no overflow
3. arytmetyka dziesiętna
f& NEG - zmienia znak.
f& MUL, IMUL - mnożenie, mnożenie ze znakiem (czyli uwzględnia liczby ujemne)
(przeskocz przykłady instrukcji mnożenia)
mul cl ; AX = AL*CL
mul bx ; DX:AX = AX*BX
mul esi ; EDX:EAX = EAX*ESI
mul rdi ; RDX:RAX = RAX*RDI
imul eax ; EDX:EAX = EAX*EAX
imul ebx,ecx,2 ; EBX = ECX*2
imul ebx,ecx ; EBX = EBX*ECX
imul si,5 ; SI = SI*5
f& DIV, IDIV - dzielenie, dzielenie ze znakiem.
(przeskocz przykłady instrukcji dzielenia)
div cl ; AL = (AX div CL), AH = (AX mod CL)
div bx ; AX = (DX:AX div BX),
; DX = (DX:AX mod BX)
div edi ; EAX = (EDX:EAX div EDI),
; EDX = (EDX:EAX mod EDI)
div rsi ; RAX = (RDX:RAX div RSI),
; RDX = (RDX:RAX mod RSI)
4. Instrukcje bitowe (logiczne). AND, OR, XOR, NOT, TEST. Instrukcja TEST działa tak samo jak
AND z tym, że nie zachowuje nigdzie wyniku, tylko ustawia flagi. Po krótce wytłumaczę te
instrukcje:
(przeskocz działanie instrukcji logicznych)
0 AND 0 = 0 0 OR 0 = 0 0 XOR 0 = 0
0 AND 1 = 0 0 OR 1 = 1 0 XOR 1 = 1
1 AND 0 = 0 1 OR 0 = 1 1 XOR 0 = 1
1 AND 1 = 1 1 OR 1 = 1 1 XOR 1 = 0
NOT 0 = 1
NOT 1 = 0
Przykłady zastosowania:
(przeskocz przykłady instrukcji logicznych)
36 Bogdan Drozdowski
2009-02-25 Język asembler dla każdego Bogdan Drozdowski
and ax,1 ; wyzeruje wszystkie bity z
; wyjątkiem bitu numer 0.
or ebx,1111b ; ustawia (włącza) 4 dolne bity.
; Reszta bez zmian.
xor cx,cx ; CX = 0
not dh ; DH ma 0 tam, gdzie miał 1
; i na odwrót
5. Instrukcje przesunięcia bitów.
1. SAL, SHL - shift left.
bit7 = bit6, bit6 = bit5, ... , bit1 = bit0, bit0 = 0.
2. SHR - shift logical right
bit0 = bit1, bit1 = bit2, ... , bit6 = bit7, bit7 = 0
3. SAR - shift arithmetic right
bit0 = bit1, bit1 = bit2, ... , bit6 = bit7, bit7 = bit7 (bit znaku zachowany!)
Najstarszy bit w rejestrze nazywa się czasem właśnie bitem znaku.
4. ROL - rotate left
bit7 = bit6, ... , bit1 = bit0, bit0 = stary bit7
5. RCL - rotate through carry left
carry flag CF = bit7, bit7 = bit6, ... , bit1 = bit0, bit0 = stara CF
6. ROR - rotate right
bit0 = bit1, ... , bit6 = bit7, bit7 = stary bit0
7. RCR - rotate through carry right
CF = bit0, bit0 = bit1, ... , bit6 = bit7, bit7 = stara CF
Przy użyciu SHL można przeprowadzać szybkie mnożenie, a dzięki SHR - szybkie dzielenie. Np.
SHL AX,1 jest równoważne przemnożeniu AX przez 2, SHL AX,5 - przez 2^5 = 32. SHR BX,4
dzieli bx przez 16.
6. Instrukcje sterujące wykonywaniem programu.
f& Skoki warunkowe (patrz: warunki powyżej): JA=JNBE, JAE=JNB, JNA=JBE, JNAE=JB , [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • szkla.opx.pl
  •