feat: приведен шаблон для решения 3 пункта задания

Вроде там еще надо будет что-то сравнить по быстродействию, это добавлю в будущих коммитах
This commit is contained in:
root
2024-10-02 18:10:34 +03:00
parent a309019bdb
commit e86f3701fe
3 changed files with 74 additions and 0 deletions

View File

@ -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 $@

51
04-addr-methods/task3.asm Normal file
View File

@ -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

17
04-addr-methods/task3.c Normal file
View File

@ -0,0 +1,17 @@
#include <stdio.h>
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;
}