| Код | ;--------------------------------------------------------------- %include "asm_io.inc" ;--------------------------------------------------------------- segment .data limitInputMsg db "Enter limit ", 0 okMsg db "OK", 0 ;--------------------------------------------------------------- segment .bss limit resd 1 ; unsinged int limit; ;--------------------------------------------------------------- segment .text global _asm_main _asm_main: enter 0, 0 pusha mov eax, limitInputMsg call print_string call read_int mov [limit], eax ; for(int i = 1; i <= limit; i++) ; { ; if(IsPrime(i)) cout << i << endl; ; } ; mov ebx, 1 xor ebx, ebx inc ebx ; int i = 1 loop_start: ; call showOK push ebx call IsPrime add esp, 4 test eax, eax ; compare eax with 0 jz next_step ; if(eax == 0) jmp nextStep call print_int call print_nl next_step: inc ebx cmp ebx, [limit] jbe loop_start ; end of the loop popa mov eax, 0 leave ret ;--------------------------------------------------------------- ; IsPrime - функция, результат в EAX, 1 если переданное в стек значение - простое число IsPrime: ; for(int i = 2; i <= (parameter / 2); i++) ; { ; if(parameter % i == 1) return 0; ; } ; return 1; ;
push dword 2 ; int i = 2 mov ecx, [esp + 8] ; ecx = parameter shr ecx, 1 ; ecx /= 2 IsPrime_loop_start:
mov eax, [esp + 8] ; eax = parameter ; xor edx, edx ; edx = 0 - before division cdq div dword [esp] ; eax /= i test edx, edx ; if(edx == 0) jmp IsPrime_next_step jz IsPrime_next_step call showOK ; debug ; here return 1 add esp, 4 ; "delete" i mov eax, 1 ; returned value = 1 ret IsPrime_next_step: inc dword [esp] ; i++ cmp [esp], ecx ; cmp i, parameter / 2 jb IsPrime_loop_start xor eax, eax ret ;--------------------------------------------------------------- ; for debug showOK: push eax mov eax, okMsg call print_string call print_nl pop eax ret ;---------------------------------------------------------------
|
Прога выводит все простые числа от 1 до limit Комментил, как мог (ещё при написании) К сожалению, табуляция на форуме какая-то кривая
Если ввести 20, то выводится ОК 1 Exiting due to signal SIGSEGV и т.д.
|