Compare commits
6 Commits
0aed286bcb
...
labs/04
| Author | SHA1 | Date | |
|---|---|---|---|
| 6794efeedd | |||
| 414f189d18 | |||
| 4b05989ba5 | |||
| e86f3701fe | |||
| a309019bdb | |||
| f2ca981037 |
@ -1,9 +1,15 @@
|
|||||||
ASM = nasm
|
ASM = nasm
|
||||||
CXX = gcc
|
CXX = gcc
|
||||||
CXX_FLAGS = -Os -static
|
CXX_FLAGS = -Og -static
|
||||||
ASM_FLAGS = -felf64 -g
|
ASM_FLAGS = -felf64 -g
|
||||||
LINK = ld
|
LINK = ld
|
||||||
|
|
||||||
|
task3: task3_c.o task3.o
|
||||||
|
$(CXX) -Og $^ -o $@ -g
|
||||||
|
|
||||||
|
task3_c.o: task3.c
|
||||||
|
$(CXX) -Og -c $^ -o $@ -g
|
||||||
|
|
||||||
task2: task2.o
|
task2: task2.o
|
||||||
$(CXX) $(CXX_FLAGS) $^ -o $@
|
$(CXX) $(CXX_FLAGS) $^ -o $@
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# Лабораторная работа 4
|
# Лабораторная работа 4
|
||||||
|
|
||||||
## Способы адресации и сегментная организация памяти
|
На данный момент нормального README не будет, потому что у меня немного нет времени его офомить. Как только сдам лабу - напишу тут немного больше
|
||||||
|
|
||||||
|
|||||||
@ -46,7 +46,7 @@ section .text
|
|||||||
syscall
|
syscall
|
||||||
RPOP_M rax, rdi, rsi, rcx
|
RPOP_M rax, rdi, rsi, rcx
|
||||||
|
|
||||||
mov rcx, 1000000000 ; выполняем миллион раз
|
mov rcx, 10000000000; выполняем миллион раз
|
||||||
%%loop:
|
%%loop:
|
||||||
%1
|
%1
|
||||||
loop %%loop
|
loop %%loop
|
||||||
@ -76,46 +76,64 @@ section .text
|
|||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
%macro PRINT_DELTATIME 1
|
%macro PRINT_DELTATIME 1
|
||||||
sub rsp, 8
|
;sub rsp, 8
|
||||||
mov rdi, str_template
|
mov rdi, str_template
|
||||||
mov rsi, %1
|
mov rsi, %1
|
||||||
mov rdx, [deltatime + timespec.tv_sec]
|
mov rdx, [deltatime + timespec.tv_sec]
|
||||||
mov rcx, [deltatime + timespec.tv_nsec]
|
mov rcx, [deltatime + timespec.tv_nsec]
|
||||||
call printf
|
call printf
|
||||||
add rsp, 8
|
;add rsp, 8
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
main:
|
main:
|
||||||
|
push rbp
|
||||||
|
mov rbp, rsp
|
||||||
|
sub rsp, 16
|
||||||
xor rax, rax ; поскольку приходим сюда из компилятора, лучше обнулить
|
xor rax, rax ; поскольку приходим сюда из компилятора, лучше обнулить
|
||||||
TIME_1_000_000
|
TIME_1_000_000
|
||||||
nop
|
|
||||||
PRINT_DELTATIME nop_command
|
PRINT_DELTATIME nop_command
|
||||||
nop ; для дебага
|
|
||||||
|
|
||||||
TIME_1_000_000 inc rax
|
TIME_1_000_000 inc rax
|
||||||
nop
|
|
||||||
PRINT_DELTATIME reg_command
|
PRINT_DELTATIME reg_command
|
||||||
nop
|
|
||||||
|
|
||||||
mov rax, example
|
mov rax, example
|
||||||
TIME_1_000_000 inc byte [rax]
|
TIME_1_000_000 inc byte [rax]
|
||||||
nop
|
|
||||||
PRINT_DELTATIME rel_reg
|
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]
|
TIME_1_000_000 inc byte [rax + rbx]
|
||||||
nop
|
|
||||||
PRINT_DELTATIME ind_base
|
PRINT_DELTATIME ind_base
|
||||||
nop
|
|
||||||
|
|
||||||
mov rax, example
|
mov rax, example
|
||||||
xor rbx, rbx
|
xor rbx, rbx
|
||||||
TIME_1_000_000 inc byte [rax + rbx + 122]
|
TIME_1_000_000 inc byte [rax + rbx + 122]
|
||||||
nop
|
|
||||||
PRINT_DELTATIME ind_base_disp
|
PRINT_DELTATIME ind_base_disp
|
||||||
nop
|
|
||||||
|
|
||||||
|
; Под конец давайте посчитаем тактовую частоту на примере той же самой команды
|
||||||
|
rdtsc
|
||||||
|
mov [rbp - 4], edx
|
||||||
|
mov [rbp - 8], eax
|
||||||
|
mov rcx, 10000000000
|
||||||
|
mov rax, example
|
||||||
|
xor rbx, rbx
|
||||||
|
.loop:
|
||||||
|
inc byte [rax + rbx + 122]
|
||||||
|
loop .loop
|
||||||
|
rdtsc
|
||||||
|
sub eax, [rbp - 8]
|
||||||
|
sbb edx, [rbp - 4]
|
||||||
|
mov [rbp - 8], eax
|
||||||
|
mov [rbp - 4], edx
|
||||||
|
|
||||||
|
mov [rbp - 16], rsp
|
||||||
|
and rsp, -16
|
||||||
|
mov rdi, tick_count
|
||||||
|
mov rsi, [rbp - 8]
|
||||||
|
call printf
|
||||||
|
|
||||||
|
mov rsp, rbp
|
||||||
|
pop rbp
|
||||||
xor rax, rax ; сообщаем gcc, что все закончилось успешно
|
xor rax, rax ; сообщаем gcc, что все закончилось успешно
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|||||||
96
04-addr-methods/task3.asm
Normal file
96
04-addr-methods/task3.asm
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
global fill_arr1
|
||||||
|
global fill_arr2
|
||||||
|
|
||||||
|
section .note.GNU-stack
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
fill_arr1:
|
||||||
|
push rbp
|
||||||
|
mov rbp, rsp
|
||||||
|
PUSH_M rdi, rsi, rdx
|
||||||
|
; Вычисляем сколько числе в строке
|
||||||
|
mov rax, [rbp - 16]
|
||||||
|
xor rdx, rdx
|
||||||
|
div qword [rbp - 24]
|
||||||
|
push rax ; сохраняем в локальные переменные. rbp - 32
|
||||||
|
; Вычисляем сколько проходов цикла необходимо
|
||||||
|
mov rax, [rbp - 24]
|
||||||
|
xor rdx, rdx
|
||||||
|
mov rcx, 2
|
||||||
|
div rcx
|
||||||
|
push rax ; rbp-40
|
||||||
|
|
||||||
|
; Надеюсь rdi не успел поменяться
|
||||||
|
; заполняем память
|
||||||
|
push rbx
|
||||||
|
mov rbx, [rbp - 32]
|
||||||
|
mov rcx, [rbp - 40]
|
||||||
|
mov rax, 777 ; специально такое число, чтобы выделялось
|
||||||
|
.next_row:
|
||||||
|
push rcx
|
||||||
|
mov rcx, [rbp - 32]
|
||||||
|
rep stosd
|
||||||
|
lea rdi, [rdi + 4 * rbx] ; пропускаем строку
|
||||||
|
pop rcx
|
||||||
|
loop .next_row
|
||||||
|
pop rbx
|
||||||
|
|
||||||
|
add rsp, 16 ; чистим 2 доп переменные, образовавшиеся в процессе вычислений
|
||||||
|
RPOP_M rdi, rsi, rdx
|
||||||
|
pop rbp
|
||||||
|
ret
|
||||||
|
|
||||||
|
fill_arr2:
|
||||||
|
push rbp
|
||||||
|
mov rbp, rsp
|
||||||
|
PUSH_M rdi, rsi, rdx
|
||||||
|
; Вычисляем сколько числе в строке
|
||||||
|
mov rax, [rbp - 16]
|
||||||
|
xor rdx, rdx
|
||||||
|
div qword [rbp - 24]
|
||||||
|
push rax ; сохраняем в локальные переменные. rbp - 32
|
||||||
|
; Вычисляем сколько проходов цикла необходимо
|
||||||
|
mov rax, [rbp - 24]
|
||||||
|
xor rdx, rdx
|
||||||
|
mov rcx, 2
|
||||||
|
div rcx
|
||||||
|
push rax ; rbp-40
|
||||||
|
|
||||||
|
; Надеюсь rdi не успел поменяться
|
||||||
|
; заполняем память
|
||||||
|
push rbx
|
||||||
|
mov rbx, [rbp - 32]
|
||||||
|
mov rcx, [rbp - 40]
|
||||||
|
mov rax, 777 ; специально такое число, чтобы выделялось
|
||||||
|
.next_row:
|
||||||
|
push rcx
|
||||||
|
mov rcx, [rbp - 32]
|
||||||
|
.fill:
|
||||||
|
mov [rdi], rax
|
||||||
|
lea rdi, [rdi + 4]
|
||||||
|
loop .fill
|
||||||
|
lea rdi, [rdi + 4 * rbx] ; пропускаем строку
|
||||||
|
pop rcx
|
||||||
|
loop .next_row
|
||||||
|
pop rbx
|
||||||
|
|
||||||
|
add rsp, 16 ; чистим 2 доп переменные, образовавшиеся в процессе вычислений
|
||||||
|
RPOP_M rdi, rsi, rdx
|
||||||
|
pop rbp
|
||||||
|
ret
|
||||||
43
04-addr-methods/task3.c
Normal file
43
04-addr-methods/task3.c
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
extern void fill_arr1(int* arr, size_t size, size_t row_count);
|
||||||
|
extern void fill_arr2(int* arr, size_t size, size_t row_count);
|
||||||
|
|
||||||
|
double measure_fill_time(void(*function)(int*, size_t, size_t), int* arr, size_t size, size_t row_count)
|
||||||
|
{
|
||||||
|
const size_t times = 10000000;
|
||||||
|
clock_t begin = clock();
|
||||||
|
for (size_t i = 0; i < times; i++)
|
||||||
|
{
|
||||||
|
function(arr, size, row_count);
|
||||||
|
}
|
||||||
|
clock_t end = clock();
|
||||||
|
return (double)(end - begin)/(CLOCKS_PER_SEC);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
const int arr_size = 256;
|
||||||
|
int array1[arr_size];
|
||||||
|
|
||||||
|
printf("String methods took %fs to loop 10,000,000 times\n", measure_fill_time(fill_arr1, array1, arr_size, 16));
|
||||||
|
|
||||||
|
for (size_t i = 0; i < arr_size; i++)
|
||||||
|
{
|
||||||
|
printf("%d ", array1[i]);
|
||||||
|
}
|
||||||
|
printf("\b \n");
|
||||||
|
|
||||||
|
int array2[arr_size];
|
||||||
|
|
||||||
|
printf("Lea methods took %fs on to loop 10,000,000 times\n", measure_fill_time(fill_arr2, array2, arr_size, 16));
|
||||||
|
for (size_t i = 0; i < arr_size; i++)
|
||||||
|
{
|
||||||
|
printf("%d ", array2[i]);
|
||||||
|
}
|
||||||
|
printf("\b \n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
@ -9,3 +9,5 @@ section .data
|
|||||||
ind_base: db '`inc byte [rax + rbx]`', 0
|
ind_base: db '`inc byte [rax + rbx]`', 0
|
||||||
ind_base_disp: db '`inc byte [rax + rbx + 122]`', 0
|
ind_base_disp: db '`inc byte [rax + rbx + 122]`', 0
|
||||||
|
|
||||||
|
tick_count: db 'Last command also took %lli ticks to complete', 10, 0
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user