Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %include "io.inc"
- ; <memory_reserved>
- %macro cdecl_prologue 1
- push ebp
- mov ebp, esp
- sub esp, %1
- %endmacro
- %macro cdecl_epilogue 0
- leave
- ret
- %endmacro
- section .bss
- parr: resd 1
- fin: resd 1
- fout: resd 1
- section .rodata
- fin_name: db "C:/input.bin", 0
- fout_name: db "C:/output.bin", 0
- fin_fmt: db "rb", 0
- fout_fmt: db "wb", 0
- N equ 2000000
- section .text
- CEXTERN malloc
- CEXTERN free
- CEXTERN fopen
- CEXTERN fclose
- CEXTERN fread
- CEXTERN fwrite
- global CMAIN
- CMAIN:
- sub esp, 32
- mov dword[esp + 4], N * 4
- call malloc
- mov dword[parr], eax
- mov dword[esp + 8], fin_fmt
- mov dword[esp + 4], fin_name
- call fopen
- mov dword[fin], eax
- mov dword[esp + 8], fout_fmt
- mov dword[esp + 4], fout_name
- call fopen
- mov dword[fout], eax
- ; mov eax, dword[fin]
- ; mov dword[esp + 16], eax
- ; mov dword[esp + 12], N
- ; mov dword[esp + 8], 4
- ; mov eax, dword[parr]
- ; mov dword[esp + 4], eax
- ; call fread
- ;
- ; mov dword[esp + 8], eax
- ; mov eax, dword[parr]
- ; mov dword[esp + 4], eax
- ; call is_pyramid
- ;
- ; mov dword[esp + 20], eax
- ; mov eax, dword[fout]
- ; mov dword[esp + 16], eax
- ; mov dword[esp + 12], 1
- ; mov dword[esp + 8], 4
- ; lea eax, [esp + 20]
- ; mov dword[esp + 4], eax
- ; call fwrite
- mov eax, dword[fin]
- mov dword[esp + 4], eax
- call fclose
- mov eax, dword[fout]
- mov dword[esp + 4], eax
- call fclose
- mov eax, dword[parr]
- mov dword[esp + 4], eax
- call free
- add esp, 32
- xor eax, eax
- ret
- ; ebp + 12 : int n
- ; ebp + 8 : int *arr
- is_pyramid_element:
- cdecl_prologue 8
- mov dword[esp + 8], 0; last
- mov dword[esp + 4], 1; result
- .loop1:
- cmp dword[ebp + 12], 0
- jz .end_loop1
- mov eax, dword[ebp + 12]
- mov dword[esp + 8], eax
- ; n = (n + 1) / 2 - 1
- inc eax
- xor edx, edx
- mov ecx, 2
- div ecx
- sub eax, 1
- mov dword[ebp + 12], eax
- ; if ((arr[last] - arr[n]) * result < 0)
- mov ecx, dword[ebp + 8]
- mov eax, dword[ecx + 4 * eax]
- mov edx, dword[esp + 8]
- sub eax, dword[ecx + 4 * edx]
- mul dword[esp + 4]
- cmp eax, 0
- jle .loop1
- cmp dword[esp + 4], 1
- jne .l1
- mov dword[esp + 4], -1
- jmp .loop1
- .l1:
- mov eax, 0
- cdecl_epilogue
- jmp .loop1
- .end_loop1:
- mov eax, dword[esp + 4]
- cdecl_epilogue
- ; ebp + 12 : int size
- ; ebp + 8 : int *arr
- is_pyramid:
- cdecl_prologue 24
- ; [esp + 4; esp + 8] : f_args
- mov dword[esp + 12], 1; result
- mov eax, dword[ebp + 12]
- mov ecx, 2
- div ecx
- mov ecx, eax
- .loop1:
- cmp ecx, dword[ebp + 12]
- jae .end_loop1
- ;mov eax, dword[ebp + 12]
- mov dword[esp + 8], ecx
- mov eax, dword[ebp + 8]
- mov dword[esp + 4], eax
- mov dword[esp + 16], ecx; save
- call is_pyramid_element
- mov ecx, dword[esp + 16]; load
- test eax, eax
- jnz .l1
- cdecl_epilogue
- .l1:
- mul dword[esp + 12]
- cmp eax, 0
- jge .next1
- cmp dword[esp + 12], 1
- jne .l2
- mov dword[esp + 12], -1
- jmp .next1
- .l2:
- mov eax, 0
- cdecl_epilogue
- .next1:
- inc ecx
- jmp .loop1
- .end_loop1:
- mov eax, dword[esp + 12]
- cdecl_epilogue
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement