Advertisement
Guest User

Untitled

a guest
Apr 9th, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %include "io.inc"
  2.  
  3. ; <memory_reserved>
  4. %macro cdecl_prologue 1
  5.     push ebp
  6.     mov ebp, esp
  7.     sub esp, %1
  8. %endmacro
  9.  
  10. %macro cdecl_epilogue 0
  11.     leave
  12.     ret
  13. %endmacro
  14.  
  15. section .bss
  16. parr: resd 1
  17. fin: resd 1
  18. fout: resd 1
  19.  
  20. section .rodata
  21. fin_name: db "C:/input.bin", 0
  22. fout_name: db "C:/output.bin", 0
  23. fin_fmt: db "rb", 0
  24. fout_fmt: db "wb", 0
  25.  
  26. N equ 2000000
  27.  
  28. section .text
  29. CEXTERN malloc
  30. CEXTERN free
  31. CEXTERN fopen
  32. CEXTERN fclose
  33. CEXTERN fread
  34. CEXTERN fwrite
  35.  
  36. global CMAIN
  37. CMAIN:
  38.     sub esp, 32
  39.    
  40.     mov dword[esp + 4], N * 4
  41.     call malloc
  42.     mov dword[parr], eax
  43.    
  44.     mov dword[esp + 8], fin_fmt
  45.     mov dword[esp + 4], fin_name
  46.     call fopen
  47.     mov dword[fin], eax
  48.    
  49.     mov dword[esp + 8], fout_fmt
  50.     mov dword[esp + 4], fout_name
  51.     call fopen
  52.     mov dword[fout], eax
  53.        
  54. ;    mov eax, dword[fin]
  55. ;    mov dword[esp + 16], eax
  56. ;    mov dword[esp + 12], N
  57. ;    mov dword[esp + 8], 4
  58. ;    mov eax, dword[parr]
  59. ;    mov dword[esp + 4], eax
  60. ;    call fread
  61. ;    
  62. ;    mov dword[esp + 8], eax
  63. ;    mov eax, dword[parr]
  64. ;    mov dword[esp + 4], eax
  65. ;    call is_pyramid
  66. ;    
  67. ;    mov dword[esp + 20], eax
  68. ;    mov eax, dword[fout]
  69. ;    mov dword[esp + 16], eax
  70. ;    mov dword[esp + 12], 1
  71. ;    mov dword[esp + 8], 4
  72. ;    lea eax, [esp + 20]
  73. ;    mov dword[esp + 4], eax
  74. ;    call fwrite
  75.    
  76.     mov eax, dword[fin]
  77.     mov dword[esp + 4], eax
  78.     call fclose
  79.    
  80.     mov eax, dword[fout]
  81.     mov dword[esp + 4], eax
  82.     call fclose
  83.    
  84.     mov eax, dword[parr]
  85.     mov dword[esp + 4], eax
  86.     call free
  87.    
  88.     add esp, 32
  89.     xor eax, eax
  90.     ret
  91.  
  92. ; ebp + 12  : int n    
  93. ; ebp + 8   : int *arr
  94. is_pyramid_element:
  95.     cdecl_prologue 8
  96.     mov dword[esp + 8], 0; last
  97.     mov dword[esp + 4], 1; result
  98.    
  99.     .loop1:
  100.         cmp dword[ebp + 12], 0
  101.         jz .end_loop1
  102.         mov eax, dword[ebp + 12]
  103.         mov dword[esp + 8], eax
  104.        
  105.         ; n = (n + 1) / 2 - 1
  106.         inc eax
  107.         xor edx, edx
  108.         mov ecx, 2
  109.         div ecx
  110.         sub eax, 1
  111.         mov dword[ebp + 12], eax
  112.        
  113.         ; if ((arr[last] - arr[n]) * result < 0)
  114.         mov ecx, dword[ebp + 8]
  115.         mov eax, dword[ecx + 4 * eax]
  116.        
  117.         mov edx, dword[esp + 8]
  118.         sub eax, dword[ecx + 4 * edx]
  119.        
  120.         mul dword[esp + 4]
  121.         cmp eax, 0
  122.         jle .loop1
  123.        
  124.         cmp dword[esp + 4], 1
  125.         jne .l1
  126.        
  127.         mov dword[esp + 4], -1
  128.         jmp .loop1
  129.        
  130.         .l1:
  131.        
  132.         mov eax, 0
  133.         cdecl_epilogue
  134.        
  135.         jmp .loop1
  136.     .end_loop1:
  137.    
  138.     mov eax, dword[esp + 4]
  139.     cdecl_epilogue
  140.  
  141. ; ebp + 12  : int size    
  142. ; ebp + 8   : int *arr
  143. is_pyramid:
  144.     cdecl_prologue 24
  145.     ; [esp + 4; esp + 8] : f_args
  146.     mov dword[esp + 12], 1; result
  147.    
  148.     mov eax, dword[ebp + 12]
  149.     mov ecx, 2
  150.     div ecx
  151.     mov ecx, eax
  152.    
  153.     .loop1:
  154.         cmp ecx, dword[ebp + 12]
  155.         jae .end_loop1
  156.        
  157.         ;mov eax, dword[ebp + 12]
  158.         mov dword[esp + 8], ecx
  159.         mov eax, dword[ebp + 8]
  160.         mov dword[esp + 4], eax
  161.        
  162.         mov dword[esp + 16], ecx; save
  163.         call is_pyramid_element
  164.         mov ecx, dword[esp + 16]; load
  165.        
  166.         test eax, eax
  167.         jnz .l1
  168.        
  169.         cdecl_epilogue
  170.        
  171.         .l1:
  172.        
  173.         mul dword[esp + 12]
  174.         cmp eax, 0
  175.         jge .next1
  176.        
  177.         cmp dword[esp + 12], 1
  178.         jne .l2
  179.        
  180.         mov dword[esp + 12], -1
  181.         jmp .next1
  182.        
  183.         .l2:
  184.        
  185.         mov eax, 0
  186.         cdecl_epilogue
  187.        
  188.         .next1:
  189.         inc ecx
  190.         jmp .loop1
  191.     .end_loop1:
  192.    
  193.     mov eax, dword[esp + 12]
  194.     cdecl_epilogue
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement