Практика

This commit is contained in:
IgorVolochay
2026-07-28 10:06:51 +03:00
parent 8602b7e845
commit 8e78cbeed9
89 changed files with 71068 additions and 0 deletions
@@ -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