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; +} +