feat: написаны функции сравнения времени выполнения

This commit is contained in:
root
2024-10-02 20:07:05 +03:00
parent 4b05989ba5
commit 414f189d18
2 changed files with 100 additions and 29 deletions

View File

@ -1,4 +1,5 @@
global fill_arr
global fill_arr1
global fill_arr2
section .note.GNU-stack
@ -19,33 +20,77 @@ section .text
%endrep
%endmacro
fill_arr: ; rdi - указатель на память, rsi - сколько, rdx - сколько рядов
;xor rax, rax ; заполнять видимо будем нулями
PUSH_M r8, rdi, rsi, rdx, rcx
push rdx ; один раз для сохранения, другой - для трюка
; считаем сколько четных рядов
mov rax, rdx
fill_arr1:
push rbp
mov rbp, rsp
PUSH_M rdi, rsi, rdx
; Вычисляем сколько числе в строке
mov rax, [rbp - 16]
xor rdx, rdx
div qword [rbp - 24]
push rax ; сохраняем в локальные переменные. rbp - 32
; Вычисляем сколько проходов цикла необходимо
mov rax, [rbp - 24]
xor rdx, rdx
mov rcx, 2
div rcx
mov rcx, rax
; считаем сколько колонок
mov rax, rsi
div qword [rsp]
mov rcx, rax
mov rdx, rax
add rsp, 8
mov rax, 777
; заполняем массив
.fill_even_row:
push rax ; rbp-40
; Надеюсь rdi не успел поменяться
; заполняем память
push rbx
mov rbx, [rbp - 32]
mov rcx, [rbp - 40]
mov rax, 777 ; специально такое число, чтобы выделялось
.next_row:
push rcx
push rdi
.loop_row:
stosd
loop .loop_row
pop rdi
mov rcx, [rbp - 32]
rep stosd
lea rdi, [rdi + 4 * rbx] ; пропускаем строку
pop rcx
lea rdi, [rdi + 8 * rdx]
loop .fill_even_row
RPOP_M r8, rdi, rsi, rdx, rcx
loop .next_row
pop rbx
add rsp, 16 ; чистим 2 доп переменные, образовавшиеся в процессе вычислений
RPOP_M rdi, rsi, rdx
pop rbp
ret
fill_arr2:
push rbp
mov rbp, rsp
PUSH_M rdi, rsi, rdx
; Вычисляем сколько числе в строке
mov rax, [rbp - 16]
xor rdx, rdx
div qword [rbp - 24]
push rax ; сохраняем в локальные переменные. rbp - 32
; Вычисляем сколько проходов цикла необходимо
mov rax, [rbp - 24]
xor rdx, rdx
mov rcx, 2
div rcx
push rax ; rbp-40
; Надеюсь rdi не успел поменяться
; заполняем память
push rbx
mov rbx, [rbp - 32]
mov rcx, [rbp - 40]
mov rax, 777 ; специально такое число, чтобы выделялось
.next_row:
push rcx
mov rcx, [rbp - 32]
.fill:
mov [rdi], rax
lea rdi, [rdi + 4]
loop .fill
lea rdi, [rdi + 4 * rbx] ; пропускаем строку
pop rcx
loop .next_row
pop rbx
add rsp, 16 ; чистим 2 доп переменные, образовавшиеся в процессе вычислений
RPOP_M rdi, rsi, rdx
pop rbp
ret