diff --git a/04-addr-methods/task3.asm b/04-addr-methods/task3.asm index fe447b5..1e135a5 100644 --- a/04-addr-methods/task3.asm +++ b/04-addr-methods/task3.asm @@ -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 diff --git a/04-addr-methods/task3.c b/04-addr-methods/task3.c index d31ad3d..ec4ce60 100644 --- a/04-addr-methods/task3.c +++ b/04-addr-methods/task3.c @@ -1,17 +1,43 @@ #include +#include -extern void fill_arr(int* arr, size_t size, size_t row_size); +extern void fill_arr1(int* arr, size_t size, size_t row_count); +extern void fill_arr2(int* arr, size_t size, size_t row_count); + +double measure_fill_time(void(*function)(int*, size_t, size_t), int* arr, size_t size, size_t row_count) +{ + const size_t times = 10000000; + clock_t begin = clock(); + for (size_t i = 0; i < times; i++) + { + function(arr, size, row_count); + } + clock_t end = clock(); + return (double)(end - begin)/(CLOCKS_PER_SEC); +} int main() { const int arr_size = 256; - int array[arr_size]; - fill_arr(array, arr_size, 16); + int array1[arr_size]; + + printf("String methods took %fs to loop 10,000,000 times\n", measure_fill_time(fill_arr1, array1, arr_size, 16)); + for (size_t i = 0; i < arr_size; i++) { - printf("%d ", array[i]); + printf("%d ", array1[i]); } printf("\b \n"); + + int array2[arr_size]; + + printf("Lea methods took %fs on to loop 10,000,000 times\n", measure_fill_time(fill_arr2, array2, arr_size, 16)); + for (size_t i = 0; i < arr_size; i++) + { + printf("%d ", array2[i]); + } + printf("\b \n"); + return 0; }