Archived
230 lines
3.4 KiB
NASM
Executable File
230 lines
3.4 KiB
NASM
Executable File
;
|
|
;
|
|
; ÔÓÍÊÖÈÈ
|
|
; Ðåçóëüòàò çàïèñûâàåòñÿ â EAX, ñòàòóñ - â EDX.
|
|
;  ñëó÷àå óñïåõà EDX ñîäåðæèò çíà÷åíèå SUCCESS (0),
|
|
; èí÷àå - àäðåñ ñîîáùåíèÿ îá îøèáêå.
|
|
;
|
|
;
|
|
|
|
; Ââåñòè ìàêñèìàëüíîå ÷èñëî
|
|
; Ðåçóëüòàò: EAX - ìàêñèìàëüíîå ÷èñëî
|
|
input_max_number:
|
|
;ñîçäàòü ñòåê-ôðåéì,
|
|
;4 áàéòà äëÿ ëîêàëüíûõ ïåðåìåííûõ
|
|
enter 4, 1
|
|
|
|
;ïîêàçûâàåì ïîäïèñü
|
|
push str_max_number_label ;ñì. string_constants.asm
|
|
call _printf
|
|
add esp, 4
|
|
|
|
;âûçûâàåì scanf
|
|
mov eax, ebp
|
|
sub eax, 4
|
|
|
|
push eax
|
|
push str_max_number_input_format ;ñì. string_constants.asm
|
|
call _scanf
|
|
add esp, 8
|
|
|
|
mov eax, [ebp-4]
|
|
|
|
;ïðîâåðêà
|
|
cmp eax, MIN_MAX_NUMBER
|
|
jb .number_too_little
|
|
cmp eax, MAX_MAX_NUMBER
|
|
ja .number_too_big
|
|
jmp .success
|
|
|
|
;âûõîä
|
|
.number_too_little:
|
|
mov edx, str_error_max_num_too_little ;ñì. string_constants.asm
|
|
jmp .return
|
|
|
|
.number_too_big:
|
|
mov edx, str_error_max_num_too_big ;ñì. string_constants.asm
|
|
jmp .return
|
|
|
|
.success:
|
|
push eax
|
|
push str_max_number_output_format ;ñì. string_constants.asm
|
|
call _printf
|
|
add esp, 4
|
|
pop eax
|
|
mov edx, SUCCESS
|
|
|
|
.return:
|
|
leave
|
|
ret
|
|
|
|
|
|
; Âûäåëèòü ïàìÿòü äëÿ ìàññèâà ôëàãîâ
|
|
; Àðãóìåíò: EAX - ìàêñèìàëüíîå ÷èñëî
|
|
; Ðåçóëüòàò: EAX - óêàçàòåëü íà ïàìÿòü
|
|
allocate_flags_memory:
|
|
enter 8, 1
|
|
|
|
;âûäåëèòü EAX+1 áàéò
|
|
inc eax
|
|
mov [ebp-4], eax
|
|
|
|
push eax
|
|
call _malloc
|
|
add esp, 4
|
|
|
|
;ïðîâåðêà
|
|
cmp eax, 0
|
|
je .fail
|
|
mov [ebp-8], eax
|
|
|
|
;èíèöèàëèçàöèÿ
|
|
mov byte [eax], 0
|
|
|
|
cld
|
|
mov edi, eax
|
|
inc edi
|
|
mov edx, [ebp-4]
|
|
add edx, eax
|
|
|
|
mov al, 1
|
|
.write_true:
|
|
stosb
|
|
cmp edi, edx
|
|
jb .write_true
|
|
|
|
;âûõîä
|
|
mov eax, [ebp-8]
|
|
jmp .success
|
|
|
|
.fail:
|
|
mov edx, str_error_malloc_failed ;ñì. string_constants.asm
|
|
jmp .return
|
|
|
|
.success:
|
|
mov edx, SUCCESS
|
|
|
|
.return:
|
|
leave
|
|
ret
|
|
|
|
; Îñâîáîäèòü ïàìÿòü îò ìàññèâà ôëàãîâ
|
|
; Àðãóìåíò: EAX - óêàçàòåëü íà ïàìÿòü
|
|
free_flags_memory:
|
|
enter 0, 1
|
|
|
|
push eax
|
|
call _free
|
|
add esp, 4
|
|
|
|
leave
|
|
ret
|
|
|
|
|
|
;Íàéòè ïðîñòûå ÷èñëà ñ ïîìîùüþ ðåøåòà Ýðàòîñôåíà
|
|
;Àðãóìåíòû: EAX - óêàçàòåëü íà ìàññèâ ôëàãîâ, EBX - ìàêñèìàëüíîå ÷èñëî
|
|
find_primes_with_eratosthenes_sieve:
|
|
enter 8, 1
|
|
mov [ebp-4], eax
|
|
|
|
add eax, ebx
|
|
inc eax
|
|
mov [ebp-8], eax
|
|
|
|
;âû÷åðêèâàåì ñîñòàâíûå ÷èñëà
|
|
cld
|
|
mov edx, 2 ;p = 2
|
|
mov ecx, 2 ;ìíîæèòåëü ñ = 2
|
|
.strike_out_cycle:
|
|
;x = c*p
|
|
mov eax, edx
|
|
push edx
|
|
mul ecx
|
|
pop edx
|
|
|
|
cmp eax, ebx
|
|
jbe .strike_out_number
|
|
jmp .increase_p
|
|
|
|
.strike_out_number:
|
|
mov edi, [ebp-4]
|
|
add edi, eax
|
|
mov byte [edi], 0
|
|
inc ecx ;c = c + 1
|
|
jmp .strike_out_cycle
|
|
|
|
.increase_p:
|
|
mov esi, [ebp-4]
|
|
add esi, edx
|
|
inc esi
|
|
|
|
mov ecx, edx
|
|
inc ecx
|
|
.check_current_number:
|
|
mov eax, ecx
|
|
mul eax
|
|
cmp eax, ebx
|
|
ja .return
|
|
|
|
lodsb
|
|
inc ecx
|
|
cmp al, 0
|
|
jne .new_p_found
|
|
jmp .check_current_number
|
|
|
|
.new_p_found:
|
|
mov edx, ecx
|
|
dec edx
|
|
mov ecx, 2
|
|
jmp .strike_out_cycle
|
|
|
|
.return:
|
|
leave
|
|
ret
|
|
|
|
|
|
; Âûâåñòè ïðîñòûå ÷èñëà
|
|
; Ïàðàìåòðû: EAX - óêàçàòåëü íà ìàññèâ ôëàãîâ, EBX - ìàêñèìàëüíîå ÷èñëî
|
|
print_primes:
|
|
enter 12, 1
|
|
mov [ebp-4], eax
|
|
mov [ebp-8], ebx
|
|
|
|
push str_print_primes_label
|
|
call _printf
|
|
add esp, 4
|
|
|
|
cld
|
|
mov esi, [ebp-4]
|
|
mov edx, esi
|
|
add edx, [ebp-8]
|
|
inc edx
|
|
|
|
mov [ebp-12], edx
|
|
mov ecx, 0
|
|
.print_cycle:
|
|
lodsb
|
|
cmp al, 0
|
|
jne .print
|
|
jmp .check_finish
|
|
.print:
|
|
push esi
|
|
push ecx
|
|
push str_prime ;ñì. string_constants.asm
|
|
call _printf
|
|
add esp, 4
|
|
pop ecx
|
|
pop esi
|
|
mov edx, [ebp-12]
|
|
.check_finish:
|
|
inc ecx
|
|
cmp esi, edx
|
|
jb .print_cycle
|
|
|
|
push str_cr_lf
|
|
call _printf
|
|
add esp, 4
|
|
|
|
leave
|
|
ret
|