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 +