From df80a7190e0a0537e3615d858daba53b81abada7 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 1 Oct 2024 12:52:23 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B8=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=202=20?= =?UTF-8?q?=D0=BF=D1=83=D0=BD=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В приготовления входит макрос для замера времени и предварительно записанные строки для printf --- 04-addr-methods/task2.asm | 66 +++++++++++++++++++++++++++++++++++++++ 04-addr-methods/timer.inc | 11 +++++++ 2 files changed, 77 insertions(+) create mode 100644 04-addr-methods/task2.asm create mode 100644 04-addr-methods/timer.inc diff --git a/04-addr-methods/task2.asm b/04-addr-methods/task2.asm new file mode 100644 index 0000000..8ee37cc --- /dev/null +++ b/04-addr-methods/task2.asm @@ -0,0 +1,66 @@ +global main + +extern printf + +struc timespec ; структура, в которой линукс хранит время. Тут нужна для удобства в будущем + .tv_sec: resq 1 + .tv_nsec: resq 1 +endstruc + +%include "timer.inc" + +section .note.GNU-stack + +section .data + example: times 128 db 127 + +section .bss + ; uses timespec model + start: resq 2 + finish: resq 2 + deltatime: resq 2 + +section .text + +%define CLOCK_REALTIME 0 +%macro TIME_10000 0-1+ ; принимает команду, которую будет пытаться обмерить по времени + mov rax, 228 ; Время начала + mov rdi, CLOCK_REALTIME + mov rsi, start + syscall + + mov rcx, 10000 + %%loop + %1 + loop %%loop + + mov rax, 228 ; Время конца + mov rdi, CLOCK_REALTIME + mov rsi, finish + syscall + + ; считаем секунды + mov rax, [finish + timespec.tv_sec] + sub rax, [start + timespec.tv_sec] + mov [deltatime + timespec.tv_sec], rax + + ; считаем наносекунды + mov rax, [finish + timespec.tv_nsec] + sub rax, [start + timespec.tv_nsec] + mov [deltatime + timespec.tv_nsec], rax +%endmacro + +main: + ; В качестве базы возьму inc + ; регистровая + inc ecx + mov rax, example + xor rbx, rbx + ; косвенно-регистровая + inc byte [rax] + ; "Индексно-базовая", хотя у меня почти все может быть базой + inc byte [rax + rbx] + ; "Индексно-базовая" со смещением + inc byte [rax + rbx + 122] + + ret diff --git a/04-addr-methods/timer.inc b/04-addr-methods/timer.inc new file mode 100644 index 0000000..483340a --- /dev/null +++ b/04-addr-methods/timer.inc @@ -0,0 +1,11 @@ + +section .data + str_template: db "Command %s took %l seconds and %l milliseconds to execute 10000 times", 10, 0 + template_len equ $-str_template + + nop_command: db '`empty loop`', 0 + reg_command: db '`inc ebx`', 0 + rel_reg: db '`inc byte [rax]`', 0 + ind_base: db '`inc byte [rax + rbx]`', 0 + ind_base_disp: db '`inc byte [rax + rbx + 122]`', 0 +