[ Pobierz całość w formacie PDF ]
JGE=JNL, JNGE=JL, JO, JNO, JC, JNC, JS (jump if sign czyli bit7 wyniku jest równy 1),
JNS, JP=JPE (jump if parity equal = liczba bitów równych jeden jest parzysta), JNP=JPO.
f& Skoki bezwarunkowe: JMP, JMP SHORT, JMP FAR
f& Uruchomienia procedur: CALL [NEAR/FAR]
f& Powrót z procedury: RET/RETF.
f& Przerwania: INT, INTO (wywołuje przerwanie INT4 w razie przepełnienia), BOUND (int 5)
f& Instrukcje pętli: LOOP. Składnia: LOOP gdzieś. Jeśli CX jest różny od 0, to skacz do gdzieś.
7. Operacje na łańcuchach znaków.
1. LODS[B/W/D/Q] - Load Byte/Word/Dword/Qword
MOV AL/AX/EAX/RAX , DS:[SI/ESI/RSI]
ADD SI,1/2/4/8 ; ADD, gdy flaga kierunku DF = 0, SUB gdy DF = 1
2. STOS[B/W/D/Q] - Store Byte/Word/Dword/Qword
MOV ES:[DI/EDI/RDI], AL/AX/EAX/RAX
Bogdan Drozdowski 37
Bogdan Drozdowski Język asembler dla każdego 2009-02-25
ADD DI,1/2/4/8 ; ADD/SUB jak wyżej
3. MOVS[B/W/D/Q] - Move Byte/Word/Dword/Qword
MOV ES:[DI/EDI/RDI], DS:[SI/ESI/RSI] ; to nie jest instrukcja!
ADD DI,1/2/4/8 ; ADD/SUB jak wyżej
ADD SI,1/2/4/8
4. CMPS[B/W/D/Q] - Compare Byte/Word/Dword/Qword
CMP DS:[SI/ESI/RSI], ES:[DI/EDI/RDI] ; to nie jest instrukcja!
ADD SI,1/2/4/8 ; ADD/SUB jak wyżej
ADD DI,1/2/4/8
5. SCAS[B/W/D/Q] - Scan Byte/Word/Dword/Qword
skanuje łańcuch bajtów/słów/podwójnych słów/poczwórnych słów pod ES:[DI/EDI/RDI] w
poszukiwaniu, czy jest tam wartość wskazana przez AL/AX/EAX/RAX.
Do każdej z powyższych instrukcji można z przodu dodać przedrostek REP (repeat), co spowoduje,
że będzie ona wykonywana, aż CX stanie się zerem, lub REPE/REPZ lub REPNE/REPNZ co
spowoduje, że będzie ona wykonywana, dopóty CX nie jest zerem i jednocześnie ZF (zero flag) =1
lub =0, odpowiednio.
8. Instrukcje wejścia/wyjścia do portów.
Są one bardziej szczegółowo opisane w części poświęconej portom, ale podam tu skrót:
f& IN
IN AL/AX/EAX, port/DX.
Pobierz z portu 1/2/4 bajty i włóż do AL/AX/EAX (od najmłodszego). Jeśli numer portu jest
mniejszy lub równy 255, można go podać bezpośrednio. Jeśli większy - trzeba użyć DX.
f& OUT
OUT port/DX, AL/AX/EAX.
Uwagi jak przy instrukcji IN.
9. Instrukcje flag
f& STC/CLC - set carry / clear carry. Do flagi CF wstaw 1 lub 0, odpowiednio.
f& STD/CLD. Ustaw DF = 1, DF = 0, odpowiednio.
f& STI/CLI. Interrupt Flag IF := 1, IF := 0, odpowiednio. Gdy IF=0, przerwania sprzętowe są
blokowane.
f& Przenoszenie flag
PUSHF / PUSHFD / PUSHFQ - umieść flagi na stosie (16, 32 i 64 bity flag, odpowiednio)
POPF / POPFD / POPFQ - zdejmij flagi ze stosu (16/32/64 bity flag)
SAHF / LAHF - zapisz AH w pierwszych 8 bitach flag / zapisz pierwsze 8 bitów flag w AH.
10. Instrukcja LEA - Load Effective Address.
Wykonanie:
lea rej, [pamięć]
38 Bogdan Drozdowski
2009-02-25 Język asembler dla każdego Bogdan Drozdowski
jest równoważne:
(przeskocz pseudo-kod LEA)
mov rej, offset pamięć ; TASM
mov rej, pamięć ; NASM/FASM
Po co więc osobna instrukcja? Otóż, LEA przydaje sie w wielu sytuacjach do obliczania złożonych
adresów. Kilka przykładów:
1. Jak w 1 instrukcji sprawić, że EAX = EBP-12 ?
Odpowiedz: lea eax, [ebp-12]
2. Niech EBX wskazuje na tablicę o 20 elementach o rozmiarze 8 każdy. Jak do ECX zapisać
adres 11-tego elementu, a do EDX elementu o numerze EDI?
Odpowiedz: lea ecx, [ebx + 11*8 ] oraz lea edx,[ebx+edi*8]
3. Jak w 1 instrukcji sprawić, że ESI = EAX*9?
Odpowiedz: lea esi, [eax + eax*8 ]
Pominąłem mniej ważne instrukcje operujące na rejestrach segmentowych i klika innych instrukcji. Te, które
tu podałem, wystarczają absolutnie na napisanie większości programów, które można zrobić.
Wszystkie informacje przedstawione w tej części pochodzą z tego samego zródła: podręczniki Intela i
podręczniki AMD
Byle głupiec potrafi napisać kod, który zrozumie komputer. Dobry programista pisze taki
kod, który zrozumie człowiek.
Poprzednia część kursu (Alt+3)
Kolejna część kursu (Alt+4)
Spis treści off-line (Alt+1)
Spis treści on-line (Alt+2)
Ułatwienia dla niepełnosprawnych (Alt+0)
wiczenia:
1. Zapisz instrukcje: do rejestru AX dodaj 5, o rejestru SI odejmij 178.
2. Nie używając cyfry jeden napisz jedną instrukcję, która zmniejszy rejestr DX o jeden.
3. Przemnóż wartość rejestru EDI przez 2 na przynajmniej dwa różne sposoby po jednej instrukcji.
Postaraj się nie używać instrukcji (I)MUL.
4. W jednej instrukcji podziel wartość rejestru BP przez 8.
[ Pobierz całość w formacie PDF ]