Asembler x86/Przykładowe programy/FASM/Przeszukiwacz
Program wyszukujący największą wartość z ciągu liczb, który jest już zaszyty na stałe w kodzie źródłowym. Wyszukana wartość jest zwracana jako kod błędu w rejestrze EBX. Kod źródłowy:
format ELF executable
entry _start
segment readable executable
_start:
mov edi,data_items ;do EDI załaduj początkowy adres naszego ciągu. Coś jak "&tablica[0]" w C/C++
mov eax, [edi] ;element spod tego właśnie pierwszego adresu przenieś do rejestru EAX
mov ebx,eax ;w rejestrze EBX zwracamy jako kod błędu nasz wynik.
;Przed przebiegiem pętli niech pierwszy element będzie tym szukanym
start_loop:
cmp eax, 0 ;czy mamy koniec ciągu ? 0 = koniec
je loop_exit ;jeśli tak to zakończ pętlę i zwróć wartość w EBX
add edi,4 ;przesuń EDI o 4 bajty dalej ponieważ pracujemy na liczbach DD, czyli czterobajtowych
mov eax,[edi] ; to na co wskazuje EDI przenieś do EAX
cmp ebx,eax ;porównaj EAX z dotychczasową maksymalną wartością przechowywaną w EBX
jnc start_loop ;jeśli EAX jest mniejsze to skocz na początek pętli. Trzeba szukać dalej
mov ebx,eax ;w przeciwnym wypadku należy naszego "maksa" przenieść z EAX do EBX
jmp start_loop;i skocz na początek pętli (bezwarunkowo). Szukamy dalej aż do 0 w ciągu
loop_exit:
mov eax,1 ;numer wywołania systemowego Linuksa: sys_exit
int 80h ; w EBX mamy nasz maksymalny element ciągu
segment readable writeable
data_items dd 3,67,34,222,45,75,54,34,44,33,1,11,66,245,0 ;ciąg liczb 32-bitowych, który przeszukujemy
</source>
Aby wyświetlić w konsoli naszą wyszukaną liczbę (którą zwróciliśmy jako kod błędu) należy wydać polecenie:
<source lang=bash>
./przeszukiwacz
echo $?
W ten sposób naszym oczom ukaże się wartość 245.