From e86f3701fe31cf9cfb22dc6f5534733051bdcaa7 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 2 Oct 2024 18:10:34 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=203?= =?UTF-8?q?=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=D0=B0=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Вроде там еще надо будет что-то сравнить по быстродействию, это добавлю в будущих коммитах --- 04-addr-methods/Makefile | 6 +++++ 04-addr-methods/task3.asm | 51 +++++++++++++++++++++++++++++++++++++++ 04-addr-methods/task3.c | 17 +++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 04-addr-methods/task3.asm create mode 100644 04-addr-methods/task3.c diff --git a/04-addr-methods/Makefile b/04-addr-methods/Makefile index 64d2ab9..b219938 100644 --- a/04-addr-methods/Makefile +++ b/04-addr-methods/Makefile @@ -4,6 +4,12 @@ CXX_FLAGS = -Os -static ASM_FLAGS = -felf64 -g LINK = ld +task3: task3_c.o task3.o + $(CXX) -Os $^ -o $@ + +task3_c.o: task3.c + $(CXX) -Os -c $^ -o $@ + task2: task2.o $(CXX) $(CXX_FLAGS) $^ -o $@ diff --git a/04-addr-methods/task3.asm b/04-addr-methods/task3.asm new file mode 100644 index 0000000..fe447b5 --- /dev/null +++ b/04-addr-methods/task3.asm @@ -0,0 +1,51 @@ +global fill_arr + +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_arr: ; rdi - указатель на память, rsi - сколько, rdx - сколько рядов + ;xor rax, rax ; заполнять видимо будем нулями + PUSH_M r8, rdi, rsi, rdx, rcx + push rdx ; один раз для сохранения, другой - для трюка + ; считаем сколько четных рядов + mov rax, rdx + xor rdx, rdx + mov rcx, 2 + div rcx + mov rcx, rax + ; считаем сколько колонок + mov rax, rsi + div qword [rsp] + mov rcx, rax + mov rdx, rax + add rsp, 8 + mov rax, 777 + ; заполняем массив + .fill_even_row: + push rcx + push rdi + .loop_row: + stosd + loop .loop_row + pop rdi + pop rcx + lea rdi, [rdi + 8 * rdx] + loop .fill_even_row + RPOP_M r8, rdi, rsi, rdx, rcx + ret diff --git a/04-addr-methods/task3.c b/04-addr-methods/task3.c new file mode 100644 index 0000000..d31ad3d --- /dev/null +++ b/04-addr-methods/task3.c @@ -0,0 +1,17 @@ +#include + +extern void fill_arr(int* arr, size_t size, size_t row_size); + +int main() +{ + const int arr_size = 256; + int array[arr_size]; + fill_arr(array, arr_size, 16); + for (size_t i = 0; i < arr_size; i++) + { + printf("%d ", array[i]); + } + printf("\b \n"); + return 0; +} +