From 541524bd6ff5b090a6e9bebc394f4a7a5a85c5b5 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 1 Oct 2024 15:58:31 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=82=D0=BE=D1=82=D0=B8=D0=BF=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=202=20=D0=BF=D1=83=D0=BD=D1=82=D0=BA=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 04-addr-methods/task2.asm | 83 ++++++++++++++++++++++++++++++++++----- 04-addr-methods/timer.inc | 2 +- 2 files changed, 74 insertions(+), 11 deletions(-) diff --git a/04-addr-methods/task2.asm b/04-addr-methods/task2.asm index 8ee37cc..ea4ff9d 100644 --- a/04-addr-methods/task2.asm +++ b/04-addr-methods/task2.asm @@ -22,24 +22,44 @@ section .bss section .text +%macro PUSH_M 1-* + %rep %0 + push %1 + %rotate 1 + %endrep +%endmacro + +%macro RPOP_M 1-* + %rotate -1 + %rep %0 + pop %1 + %rotate -1 + %endrep +%endmacro + %define CLOCK_REALTIME 0 -%macro TIME_10000 0-1+ ; принимает команду, которую будет пытаться обмерить по времени +%macro TIME_1_000_000 0-1+ ; принимает команду, которую будет пытаться обмерить по времени + PUSH_M rax, rdi, rsi, rcx mov rax, 228 ; Время начала mov rdi, CLOCK_REALTIME mov rsi, start syscall + RPOP_M rax, rdi, rsi, rcx - mov rcx, 10000 - %%loop + mov rcx, 1000000000 ; выполняем миллион раз + %%loop: %1 loop %%loop + PUSH_M rax, rdi, rsi, rcx mov rax, 228 ; Время конца mov rdi, CLOCK_REALTIME mov rsi, finish syscall + RPOP_M rax, rdi, rsi, rcx ; считаем секунды + push rax ; можно было бы оптимизировать, но мне лень макросы переписывать mov rax, [finish + timespec.tv_sec] sub rax, [start + timespec.tv_sec] mov [deltatime + timespec.tv_sec], rax @@ -48,19 +68,62 @@ section .text mov rax, [finish + timespec.tv_nsec] sub rax, [start + timespec.tv_nsec] mov [deltatime + timespec.tv_nsec], rax + pop rax +%endmacro + +%macro PRINT_DELTATIME 1 + 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 %endmacro main: ; В качестве базы возьму inc ; регистровая - inc ecx + ;inc ecx + ;mov rax, example + ;xor rbx, rbx + ;; косвенно-регистровая + ;inc byte [rax] + ;; "Индексно-базовая", хотя у меня почти все может быть базой + ;inc byte [rax + rbx] + ;; "Индексно-базовая" со смещением + ;inc byte [rax + rbx + 122] + + xor rax, rax ; поскольку приходим сюда из компилятора, лучше обнулить + TIME_1_000_000 + nop + PRINT_DELTATIME nop_command + nop ; для дебага + + TIME_1_000_000 inc rax + nop + PRINT_DELTATIME reg_command + nop + + mov rax, example + TIME_1_000_000 inc byte [rax] + nop + PRINT_DELTATIME rel_reg + nop + mov rax, example xor rbx, rbx - ; косвенно-регистровая - inc byte [rax] - ; "Индексно-базовая", хотя у меня почти все может быть базой - inc byte [rax + rbx] - ; "Индексно-базовая" со смещением - inc byte [rax + rbx + 122] + TIME_1_000_000 inc byte [rax + rbx] + nop + PRINT_DELTATIME ind_base + nop + mov rax, example + xor rbx, rbx + TIME_1_000_000 inc byte [rax + rbx + 122] + nop + PRINT_DELTATIME ind_base_disp + nop + + xor rax, rax ; сообщаем gcc, что все закончилось успешно ret diff --git a/04-addr-methods/timer.inc b/04-addr-methods/timer.inc index 483340a..afa1e5d 100644 --- a/04-addr-methods/timer.inc +++ b/04-addr-methods/timer.inc @@ -1,6 +1,6 @@ section .data - str_template: db "Command %s took %l seconds and %l milliseconds to execute 10000 times", 10, 0 + str_template: db "Command %s took %lld seconds and %lld nanoseconds to execute 1 000 000 000 times", 10, 0 template_len equ $-str_template nop_command: db '`empty loop`', 0