Operacje na łańcuchach/tablicach
Rejestry indeksowe

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

Po wykonaniu operacji rejestry te są automatycznie zwiększane lub zmiejszane w zależności od stanu flagi kierunku (DF) procesora.

Flagi modyfikujemy przez

Odczyt i zapis pamięci
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.

Kopiowanie tablicy

; 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

Przykład: kopiowanie tablicy

Porównania CMPSx, SCASx

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
Zakładamy że flaga DF jest wyzerowana.

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
Nawet jeżeli znajdziemy szukany element to EDI zostanie przesunięte.

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 instrukcji REPx

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:

Tomasz Kapela, Kraków 2011-2020