Do pracy z tablicami/łańcuchami przeznaczone są specjalne instrukcje (string instructions). W mnemoniku przeważnie pojawia się literka S.
Używają one rejestrów
Flagi modyfikujemy przez
Zakładamy że flaga DF jest wyzerowana. W przeciwnym wypadku rejestry są zmiejszane.
Instrukcja LODSB/LODSW/LODSD STOSB/STOSW/STOSD MOVSB/MOVSW/MOVSD | "Odpowiednik" mov AL/AX/EAX, [DS:ESI] add ESI, 1/2/4 mov [ES:EDI], AL/AX/EAX add EDI, 1/2/4 mov [ES:EDI], [DS:ESI] ; 1,2 lub 4 bajty add ESI, 1/2/4 add EDI, 1/2/4 |
W trybie chronionym mamy tylko jeden segment danych więc nie musimy się przejmować wartością rejestrów ES i DS.
; kopiuje tablice zrodlo o rozmiarze n do tablicy cel ; copyArray(int n, int zrodlo[], int cel[]); copyArray: enter 0,0 cld ; zerujemy flagę DF mov ecx, [ebp+8] ; rozmiar tablicy mov esi, [ebp+12] ; zrodlo mov edi, [ebp+16] ; cel petla: lodsd stosd loop petla leave ret
Główną pętlę można też uprościć
petla: movsd loop petla
Instrukcje CMPSx służą do porównywania kolejnych komórek dwóch tablic jako liczb 1, 2 lub 4 bajtowych.
Instrukcja CMPSB CMPSW CMPSD | "Odpowiednik" cmp [DS:ESI], [ES:EDI] add ESI, 1/2/4 add EDI, 1/2/4 |
Instrukcje SCASx przeszukują tablicę w poszukiwaniu konkretnej wartości umieszczonej w rejestrze EAX
Instrukcja SCASB SCASW SCASD | "Odpowiednik" cmp AL/AX/EAX, [ES:EDI] add EDI, 1/2/4 |
Przykład: szukanie elementu w tablicy liczb typu int
cld mov edi, tablica ; adres poczatku tablicy mov ecx, [rozmiar] ; rozmiar tablicy mov eax, [liczba] ; liczba ktorej szukamy petla: scasd je znaleziono loop petla ; nie znaleziono jmp koniec znaleziono: sub edi, 4 ; edi wskazuje teraz na miejsce ;gdzie znajduje się szukany element koniec: ... segment .data tablica dd 1, 2, 3, 4, 5, 6, 7 rozmiar dd 7 liczba dd 4
Przedrostki REPx informują procesor, że ma wykonywać daną instrukcję tablicową określona liczbę razy, ewentualnie sprawdzając dodatkowy warunek.
Liczbę powtórzeń umieszczamy w rejestrze ECX
REP ; powtarza instrukcje ECX razy REPE/REPZ ; powtarza instrukcję jeżeli flaga ZF jest ustawiona, ; conajwyżej ECX razy REPNE/REPNZ ; powtarza instrukcję jeżeli flaga ZF jest wyzerowana, ; conajwyżej ECX razy
Przykład: kopiowanie tablicy
cld mov esi, zrodlo mov edi, cel mov ecx, [rozmiar] rep movsd
Przykład: porównanie dwóch tablic
cld mov esi, tablica1 mov edi, tablica2 mov ecx, [rozmiar] repe cmpsb ; powtarzaj jeżeli są równe je rowne ; jeżeli ZF==0 to tablice są rowne ; blok kodu gdy tablice są różne jmp koniec rowne: ; blok kodu gdy tablice są takie same koniec: