feat: первый прототип для 2 пунтка написан

This commit is contained in:
root
2024-10-01 15:58:31 +03:00
parent df80a7190e
commit 541524bd6f
2 changed files with 74 additions and 11 deletions

View File

@ -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

View File

@ -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