В приготовления входит макрос для замера времени и предварительно записанные строки для printf
67 lines
1.5 KiB
NASM
67 lines
1.5 KiB
NASM
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
|