; program wypisuje 15000 liczb pierwszych ; autor: Janusz Skubacz ; kontakt: johnny (at) klub (dot) chip (dot) pl ; kompilacja: ml prime.asm .model tiny .386 .code org 100h main proc xor edi,edi ; edi przechowuje ilo˜ść wyliczonych liczb p. mov esi,3h ; esi przechowuje warto˜ść sprawdzanej liczby mov eax,4h ; edx:eax przechowuje kwadrat liczby pierwszej mov ebx,offset liczby ; ebx przechowuje wskaźnik do następnej liczby mov dword ptr [ebx],2h ; w tablicy liczb pierwszych mov ebp,1h ; przechowuje numer znalezionej liczby pierwszej 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 ptr [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 ax,(0eh shl 8) or ',' int 10h cmp ecx,ebp jb L6 mov eax,4c00h ; koniec programu int 21h main endp ;--------------------------------------------------- ; 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 proc pushfd ; flagi na stos push eax ; zmieniane rejestry na stos push ecx push edx push esi mov ecx,0ah ; ustawienie dzielnika xor si,si ; 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+si],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+si-1] ; zapisanie cyfry or al,'0' ; przerobienie liczby na liczbę w ascii int 10h ; 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_liczbe endp .data liczby dd 15000 dup(0) bufor db 20 dup(?) end main