diff --git a/04-addr-methods/task2.asm b/04-addr-methods/task2.asm index 06a2091..0da6718 100644 --- a/04-addr-methods/task2.asm +++ b/04-addr-methods/task2.asm @@ -46,7 +46,7 @@ section .text syscall RPOP_M rax, rdi, rsi, rcx - mov rcx, 1000000000 ; выполняем миллион раз + mov rcx, 10000000000; выполняем миллион раз %%loop: %1 loop %%loop @@ -76,16 +76,19 @@ section .text %endmacro %macro PRINT_DELTATIME 1 - sub rsp, 8 + ;sub rsp, 8 mov rdi, str_template mov rsi, %1 mov rdx, [deltatime + timespec.tv_sec] mov rcx, [deltatime + timespec.tv_nsec] call printf - add rsp, 8 + ;add rsp, 8 %endmacro main: + push rbp + mov rbp, rsp + sub rsp, 16 xor rax, rax ; поскольку приходим сюда из компилятора, лучше обнулить TIME_1_000_000 PRINT_DELTATIME nop_command @@ -108,6 +111,29 @@ main: PRINT_DELTATIME ind_base_disp ; Под конец давайте посчитаем тактовую частоту на примере той же самой команды + rdtsc + mov [rbp - 4], edx + mov [rbp - 8], eax + mov rcx, 10000000000 + mov rax, example + xor rbx, rbx + .loop: + inc byte [rax + rbx + 122] + loop .loop + rdtsc + sub eax, [rbp - 8] + sbb edx, [rbp - 4] + mov [rbp - 8], eax + mov [rbp - 4], edx + + mov [rbp - 16], rsp + and rsp, -16 + mov rdi, tick_count + mov rsi, [rbp - 8] + call printf + mov rsp, rbp + pop rbp xor rax, rax ; сообщаем gcc, что все закончилось успешно ret + diff --git a/04-addr-methods/timer.inc b/04-addr-methods/timer.inc index afa1e5d..25db19f 100644 --- a/04-addr-methods/timer.inc +++ b/04-addr-methods/timer.inc @@ -9,3 +9,5 @@ section .data ind_base: db '`inc byte [rax + rbx]`', 0 ind_base_disp: db '`inc byte [rax + rbx + 122]`', 0 + tick_count: db 'Last command also took %lli ticks to complete', 10, 0 +