section .data
fmt_d db "%d", 0
fmt_out db "%d", 0
fmt_sp db " ", 0
fmt_nl db 10, 0
section .bss
n_mat resd 1
max_sz resd 1
max_ptr resd 1
max_tr_l resd 1
max_tr_h resd 1
cur_sz resd 1
cur_ptr resd 1
is_first resd 1
section .text
global main
main:
push ebp
mov ebp, esp
push ebx
push esi
push edi
and esp, -16
sub esp, 32
lea eax, [ebp-4]
mov [esp+4], eax
mov dword [esp], fmt_d
call scanf
mov eax, [ebp-4]
mov [n_mat], eax
mov dword [is_first], 1
mov dword [max_ptr], 0
.m_loop:
mov eax, [n_mat]
test eax, eax
jle .print_res
dec dword [n_mat]
lea eax, [ebp-8]
mov [esp+4], eax
mov dword [esp], fmt_d
call scanf
mov eax, [ebp-8]
mov [cur_sz], eax
mov ebx, eax
imul ebx, eax
mov eax, ebx
shl eax, 2
mov [esp], eax
call malloc
mov [cur_ptr], eax
xor esi, esi
.f_data:
cmp esi, ebx
jge .c_tr
lea eax, [ebp-12]
mov [esp+4], eax
mov dword [esp], fmt_d
call scanf
mov eax, [ebp-12]
mov edx, [cur_ptr]
mov [edx+esi*4], eax
inc esi
jmp .f_data
.c_tr:
xor ebx, ebx
xor ecx, ecx
mov edx, [cur_sz]
test edx, edx
jz .cmp_max
mov edi, [cur_ptr]
mov esi, [cur_sz]
mov eax, [cur_sz]
inc eax
shl eax, 2
mov [ebp-16], eax
.t_loop:
mov eax, [edi]
cdq
add ebx, eax
adc ecx, edx
add edi, [ebp-16]
dec esi
jnz .t_loop
.cmp_max:
cmp dword [is_first], 1
je .upd
mov eax, ebx
sub eax, [max_tr_l]
mov edx, ecx
sbb edx, [max_tr_h]
jl .dsc
.upd:
mov dword [is_first], 0
mov eax, [max_ptr]
test eax, eax
jz .sk_f
mov [esp], eax
call free
.sk_f:
mov [max_tr_l], ebx
mov [max_tr_h], ecx
mov eax, [cur_ptr]
mov [max_ptr], eax
mov eax, [cur_sz]
mov [max_sz], eax
jmp .m_loop
.dsc:
mov eax, [cur_ptr]
mov [esp], eax
call free
jmp .m_loop
.print_res:
mov eax, [max_ptr]
test eax, eax
jz .quit
xor esi, esi
.o_r:
cmp esi, [max_sz]
jge .done
xor edi, edi
.o_c:
mov eax, esi
imul eax, [max_sz]
add eax, edi
mov edx, [max_ptr]
mov eax, [edx+eax*4]
mov [esp+4], eax
mov dword [esp], fmt_out
call printf
inc edi
cmp edi, [max_sz]
jge .r_e
mov dword [esp], fmt_sp
call printf
jmp .o_c
.r_e:
mov dword [esp], fmt_nl
call printf
inc esi
jmp .o_r
.done:
mov eax, [max_ptr]
mov [esp], eax
call free
.quit:
lea esp, [ebp-12]
pop edi
pop esi
pop ebx
pop ebp
ret