Asembler x86/Przykładowe programy/FASM/Przeszukiwacz

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania

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

Aby wyświetlić w konsoli naszą wyszukaną liczbę (którą zwróciliśmy jako kod błędu) należy wydać polecenie:

  ./przeszukiwacz
  echo $?

W ten sposób naszym oczom ukaże się wartość 245.