feat: первый прототип для 2 пунтка написан
This commit is contained in:
@ -22,24 +22,44 @@ section .bss
|
|||||||
|
|
||||||
section .text
|
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
|
%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 rax, 228 ; Время начала
|
||||||
mov rdi, CLOCK_REALTIME
|
mov rdi, CLOCK_REALTIME
|
||||||
mov rsi, start
|
mov rsi, start
|
||||||
syscall
|
syscall
|
||||||
|
RPOP_M rax, rdi, rsi, rcx
|
||||||
|
|
||||||
mov rcx, 10000
|
mov rcx, 1000000000 ; выполняем миллион раз
|
||||||
%%loop
|
%%loop:
|
||||||
%1
|
%1
|
||||||
loop %%loop
|
loop %%loop
|
||||||
|
|
||||||
|
PUSH_M rax, rdi, rsi, rcx
|
||||||
mov rax, 228 ; Время конца
|
mov rax, 228 ; Время конца
|
||||||
mov rdi, CLOCK_REALTIME
|
mov rdi, CLOCK_REALTIME
|
||||||
mov rsi, finish
|
mov rsi, finish
|
||||||
syscall
|
syscall
|
||||||
|
RPOP_M rax, rdi, rsi, rcx
|
||||||
|
|
||||||
; считаем секунды
|
; считаем секунды
|
||||||
|
push rax ; можно было бы оптимизировать, но мне лень макросы переписывать
|
||||||
mov rax, [finish + timespec.tv_sec]
|
mov rax, [finish + timespec.tv_sec]
|
||||||
sub rax, [start + timespec.tv_sec]
|
sub rax, [start + timespec.tv_sec]
|
||||||
mov [deltatime + timespec.tv_sec], rax
|
mov [deltatime + timespec.tv_sec], rax
|
||||||
@ -48,19 +68,62 @@ section .text
|
|||||||
mov rax, [finish + timespec.tv_nsec]
|
mov rax, [finish + timespec.tv_nsec]
|
||||||
sub rax, [start + timespec.tv_nsec]
|
sub rax, [start + timespec.tv_nsec]
|
||||||
mov [deltatime + timespec.tv_nsec], rax
|
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
|
%endmacro
|
||||||
|
|
||||||
main:
|
main:
|
||||||
; В качестве базы возьму inc
|
; В качестве базы возьму 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
|
mov rax, example
|
||||||
xor rbx, rbx
|
xor rbx, rbx
|
||||||
; косвенно-регистровая
|
TIME_1_000_000 inc byte [rax + rbx]
|
||||||
inc byte [rax]
|
nop
|
||||||
; "Индексно-базовая", хотя у меня почти все может быть базой
|
PRINT_DELTATIME ind_base
|
||||||
inc byte [rax + rbx]
|
nop
|
||||||
; "Индексно-базовая" со смещением
|
|
||||||
inc byte [rax + rbx + 122]
|
|
||||||
|
|
||||||
|
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
|
ret
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
section .data
|
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
|
template_len equ $-str_template
|
||||||
|
|
||||||
nop_command: db '`empty loop`', 0
|
nop_command: db '`empty loop`', 0
|
||||||
|
|||||||
Reference in New Issue
Block a user