Вроде там еще надо будет что-то сравнить по быстродействию, это добавлю в будущих коммитах
52 lines
1006 B
NASM
52 lines
1006 B
NASM
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
|