feat: написаны приготовления для 2 пункта
В приготовления входит макрос для замера времени и предварительно записанные строки для printf
This commit is contained in:
66
04-addr-methods/task2.asm
Normal file
66
04-addr-methods/task2.asm
Normal file
@ -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
|
||||||
11
04-addr-methods/timer.inc
Normal file
11
04-addr-methods/timer.inc
Normal file
@ -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
|
||||||
|
|
||||||
Reference in New Issue
Block a user