feat: приведен шаблон для решения 3 пункта задания
Вроде там еще надо будет что-то сравнить по быстродействию, это добавлю в будущих коммитах
This commit is contained in:
@ -4,6 +4,12 @@ CXX_FLAGS = -Os -static
|
|||||||
ASM_FLAGS = -felf64 -g
|
ASM_FLAGS = -felf64 -g
|
||||||
LINK = ld
|
LINK = ld
|
||||||
|
|
||||||
|
task3: task3_c.o task3.o
|
||||||
|
$(CXX) -Os $^ -o $@
|
||||||
|
|
||||||
|
task3_c.o: task3.c
|
||||||
|
$(CXX) -Os -c $^ -o $@
|
||||||
|
|
||||||
task2: task2.o
|
task2: task2.o
|
||||||
$(CXX) $(CXX_FLAGS) $^ -o $@
|
$(CXX) $(CXX_FLAGS) $^ -o $@
|
||||||
|
|
||||||
|
|||||||
51
04-addr-methods/task3.asm
Normal file
51
04-addr-methods/task3.asm
Normal 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
17
04-addr-methods/task3.c
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user