Практика
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 156 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 3.6 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
@@ -0,0 +1,16 @@
|
||||
ifdef SystemRoot
|
||||
format = win32
|
||||
rm = del
|
||||
ext = .exe
|
||||
else
|
||||
format = elf
|
||||
rm = rm -f
|
||||
ext =
|
||||
endif
|
||||
|
||||
all: primes.o
|
||||
gcc primes.o -o primes$(ext)
|
||||
$(rm) primes.o
|
||||
|
||||
primes.o:
|
||||
nasm -f $(format) main.asm -o primes.o
|
||||
@@ -0,0 +1,229 @@
|
||||
;
|
||||
;
|
||||
; ÔÓÍÊÖÈÈ
|
||||
; Ðåçóëüòàò çàïèñûâàåòñÿ â 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
|
||||
@@ -0,0 +1,63 @@
|
||||
%define SUCCESS 0
|
||||
%define MIN_MAX_NUMBER 3
|
||||
%define MAX_MAX_NUMBER 4294967294
|
||||
|
||||
global _main
|
||||
extern _printf
|
||||
extern _scanf
|
||||
extern _malloc
|
||||
extern _free
|
||||
|
||||
SECTION .text
|
||||
_main:
|
||||
enter 0, 0
|
||||
|
||||
;ââîä ìàêñèìàëüíîãî ÷èñëà
|
||||
call input_max_number
|
||||
cmp edx, SUCCESS
|
||||
jne .custom_exit
|
||||
mov [max_number], eax
|
||||
|
||||
;âûäåëÿåì ïàìÿòü äëÿ ìàññèâà ôëàãîâ
|
||||
mov eax, [max_number]
|
||||
call allocate_flags_memory
|
||||
cmp edx, SUCCESS
|
||||
jne .custom_exit
|
||||
mov [primes_pointer], eax
|
||||
|
||||
;îòñåÿòü ñîñòàâíûå ÷èñëà
|
||||
mov eax, [primes_pointer]
|
||||
mov ebx, [max_number]
|
||||
call find_primes_with_eratosthenes_sieve
|
||||
|
||||
;âûâåñòè ÷èñëà
|
||||
mov eax, [primes_pointer]
|
||||
mov ebx, [max_number]
|
||||
call print_primes
|
||||
|
||||
;îñâîáîäèòü ïàìÿòü îò ìàññèâà ôëàãîâ
|
||||
mov eax, [primes_pointer]
|
||||
call free_flags_memory
|
||||
|
||||
;âûõîä
|
||||
.success:
|
||||
push str_exit_success
|
||||
call _printf
|
||||
jmp .return
|
||||
|
||||
.custom_exit:
|
||||
push edx
|
||||
call _printf
|
||||
|
||||
.return:
|
||||
mov eax, SUCCESS
|
||||
leave
|
||||
ret
|
||||
|
||||
%include "functions.asm"
|
||||
|
||||
SECTION .data
|
||||
max_number: dd 0
|
||||
primes_pointer: dd 0
|
||||
|
||||
%include "string_constatns.asm"
|
||||
@@ -0,0 +1,14 @@
|
||||
;ïîäïèñè ââîäà-âûâîäà, ôîðìàòû
|
||||
str_max_number_label: db "Max number (>=3): ", 0
|
||||
str_max_number_input_format: db "%u", 0
|
||||
str_max_number_output_format: db "Using max number %u", 0xD, 0xA, 0
|
||||
|
||||
str_print_primes_label: db "Primes:", 0xD, 0xA, 0
|
||||
str_prime: db "%u", 0x9, 0
|
||||
str_cr_lf: db 0xD, 0xA, 0
|
||||
|
||||
;ñîîáùåíèÿ âûõîäà
|
||||
str_exit_success: db "Success!", 0xD, 0xA, 0
|
||||
str_error_max_num_too_little: db "Max number is too little!", 0xD, 0xA, 0
|
||||
str_error_max_num_too_big: db "Max number is too big!", 0xD, 0xA, 0
|
||||
str_error_malloc_failed: db "Can't allocate memory!", 0xD, 0xA, 0
|
||||
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 2.8 MiB |
|
After Width: | Height: | Size: 2.4 MiB |
|
After Width: | Height: | Size: 2.4 MiB |
|
After Width: | Height: | Size: 2.3 MiB |