Poniżej przedstawię najczęściej używane instrukcje skoku:
( Mo przykład dla instrukcji M0VSB:
• JA — skocz, jeżeli powyżej (flagi CF=0 i ZF=0);
• JAE — skocz, jeżeli powyżej lub równe (flaga CF=0);
• JB — skocz, jeżeli poniżej (flaga CF=1);
• JBE — skocz, jeżeli poniżej lub równe (CF=1 lub ZF=1);
• JE — skocz, jeżeli równe (ZF=1);
. 386
.model fiat, stdcall
optlon casemap: nonę
Include Windows.inc include kernel32.inc Include user32.inc
1ncludel i b user32.1ib includelib kerne!32.1ib
• JG — skocz, jeżeli większe (ZF=0 i SF=OF);
• JGE — skocz, jeżeli większe lub równe (SF=OF);
.data
/rodło db "Witaj", 0 : 6-bajtowy ciąg znaków cel db 6 dup(O) ; pusty ciąg 6 bajtów
.codę
Itart:
mov esi, offset zrodlo mov edi, offset cel dd
mov ecx, 6 rep movsb
• JL — skocz, jeżeli mniejsze (SF!=OF);
• JLE — skocz, jeżeli mniejsze lub równe (ZF=1 lub SF!=OF);
• JNE — skocz, jeżeli różne (flaga ZF=0);
• JNZ — skocz, jeżeli nie zero (ZF!=0);
• JZ — skocz, jeżeli zero (ZF=0).
Myślę, że na początek to wystarczy. Więcej informaqi na ten tem; można znaleźć w Intel 64 and IA-32 Architectures Software Developer Manuał: Volume 2A & 2B.
; do ESI adres źródła
; do EDI adres docelowy
; wyczyszczenie flagi kierunku (Direction Flag)
; do rejestru licznika dajemy 6 (liczba kopiowanych bajtów) ; powtarzaj instrukcję MOVSB ECX razy (6 razy)
invoke MessageBox, NULL, addr cel, 0, MB_0K ; wyświetl skopiowany ciąg znaków invoke ExitProcess, NULL end start
CMPS
Instrukcje CMPS* porównują odpowiednią liczbę bajtów z rejestrów SI/ESI oraz DI/EDI.
C Mo przykład:
.386 | |
.model fiat, |
stdcal1 |
option casemap: nonę | |
Include |
Windows.inc |
Include |
kernel32.inc |
Include |
user32.inc |
Includelib |
user32.1ib |
includelib |
kerne!32.1ib |
.data
napisl db "asdfghjkl", 0 ; dwa napisy, które napis2 db "asdfghzkl", 0 ; będziemy porównywać Równe db "Ciągi znaków są równe.", 0 Nierówne db "Ciągi znaków są nierówne", 0
Opisane poniżej instrukcje operują na ciągach znaków spod rejestrt źródła SI/ESI oraz rejestru docelowego DI/EDI. Instrukcje te występuj; w czterech formatach: *B, *W, *D (32-bitowe) oraz łQ (64-bitowe) Modyfikacją rejestrów SI/ESI i DI/EDI steruje flaga kierunku (DF; ang Direction Flag). Jeśli flaga jest równa zero, oba rejestry są zwiększam o odpowiednią liczbę, a jeśli flaga jest równa jeden, oba rejestry s< zmniejszane o odpowiednią liczbę. Flagę można wyczyścić instruk cją CLD, a ustawić za pomocą STD.
MOVS
Instrukcje M0VS* służą do przeniesienia odpowiedniej liczby bajtów1 spod rejestru źródła (SI/ESI) do rejestru docelowego (DI/EDI).
.codę