; program wypisuje 15000 liczb pierwszych ; autor: Janusz Skubacz ; kontakt: johnny (at) klub (dot) chip (dot) pl ; kompilacja: ml prime.asm ; ; przerobka na Linux: Bogdan D., bogdandr (at) op . pl ; kompilacja: fasm prime.fasm format ELF executable entry _start segment readable executable _start: xor edi,edi ; edi przechowuje ilość wyliczonychliczb p. mov esi,3h ; esi przechowuje wartośćsprawdzanej liczby mov eax,4h ; edx:eax przechowuje kwadrat liczbypierwszej mov ebx, liczby ; ebx przechowuje wskaźnik do następnejliczby mov dword [ebx],2h ; w tablicy liczb pierwszych mov ebp,1h ; przechowuje numer znalezionej liczbypierwszej L1: cmp ebp,3a98h ; czy ebp jest mniejsze niż nasz limit (10 liczb) jnb pisz ; wypisz wyniki cmp esi,eax ; czy esi >= eax jb L2 inc edi ; wyliczenie kwadratu kolejnej liczby pierwszej mov eax,[ebx+edi*4] mul eax L2: mov ecx,1h ; ecx = 1h L3: cmp ecx,edi ; sprawdzenie czy ecx=edi to mamy liczbę pierwszą jb L5 mov dword [ebx+ebp*4],esi ; zapisz liczbę pierwszą inc ebp ; zwiększ ebp L5: add esi,2h ; powiększ esi o 2h jmp L1 pisz: xor ecx,ecx L6: inc ecx mov eax,[ebx+ecx*4-4] call pisz_liczbe mov al,',' call pisz_z cmp ecx,ebp jb L6 mov eax, 1 ; koniec programu xor ebx, ebx int 80h ;--------------------------------------------------- ; pisz_liczbe ; w eax znajduje się liczba, dzielimy ją przez 10 ; reszta zostaje w dl, przenosimy resztę do bufora ; na koniec należy wydrukować bufor wspak ;--------------------------------------------------- pisz_liczbe: pushfd ; flagi na stos push eax ; zmieniane rejestry na stos push ecx push edx push esi mov ecx,0ah ; ustawienie dzielnika xor esi,esi ; si będzie zawierała liczbę znaków w liczbie pisz1: xor edx,edx ; zerowanie rejestrów gdyż używa ich instrukcja div div ecx ; operacja dzielenia mov [bufor+esi],dl ; zapisanie w buforze znaku inc si ; zwiększenie wskaźnika bufora cmp eax,0h ; sprawdzenie czy dzielna jest różna od zera jnz pisz1 mov ah,0eh ; funkcja zapewniające wydrukowanie znaku i przesunięcie kursora pisz2: mov al,[bufor+esi-1] ; zapisanie cyfry or al,'0' ; przerobienie liczby na liczbę w ascii call pisz_z ; wypisanie liczby dec si jnz pisz2 pop esi ; przywrócenie rejestrów ze stosu pop edx pop ecx pop eax popfd ; i flag ret pisz_z: ; pisz_z ; we: AL=znak do wypisania push eax push ebx push ecx push edx mov [bufor+39], al mov eax, 4 ; funkcja zapisu do pliku mov ebx, 1 ; kierujemy na standardowe wyjscie lea ecx, [bufor+39] mov edx, 1 int 80h pop edx pop ecx pop ebx pop eax ret segment readable writeable liczby dd 15000 dup(0) bufor db 20 dup(?)