ceva_megamind

heap from file

May 25th, 2021
783
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %include "io.inc"
  2. CEXTERN malloc
  3. CEXTERN realloc
  4. CEXTERN fopen
  5. CEXTERN fclose
  6. CEXTERN fread
  7. CEXTERN fwrite
  8. CEXTERN free
  9.  
  10. section .rodata
  11.     RB dd "rb", 0
  12.     NAMEIN dd "input.bin", 0
  13.     WB dd "wb", 0
  14.     NAMEOUT dd "output.bin", 0
  15.    
  16.  section .bss
  17.     iin resd 1
  18.     oout resd 1
  19.     ans resd 1
  20.     size resd 1
  21.     maxsize resd 1
  22.     a resd 1
  23.  
  24. section .text
  25. comp:            ;cmp(int a, int b, int*predict)
  26.     push    ebp ;проверка а - родитель, b - сын
  27.     mov     ebp, esp
  28.     mov     ecx, [ebp + 8]  ;ecx - a
  29.     mov     edx, [ebp + 12] ;edx - b
  30.     mov     eax, [ebp + 16]
  31.     mov     eax, [eax]  ;eax - *predict
  32.     test    eax, eax
  33.     jne     .if1
  34.     mov     eax, 0      ;if *predict==0 return 0
  35.     jmp     .return     ;уже точно не пирамида
  36. .if1:
  37.     cmp     eax, 1      ;должна быть неубывающей
  38.     jne     .if2        ;if *predict == 1
  39.     cmp     ecx, edx
  40.     setle   al
  41.     movzx   eax, al
  42.     jmp     .return     ;return (a<=b)
  43. .if2:
  44.     cmp     eax, -1     ;должны быть невозрастающей
  45.     jne     .if3        ;if *predict == -1
  46.     cmp     ecx, edx
  47.     setge   al
  48.     movzx   eax, al
  49.     jmp     .return     ;return (a>=b)
  50. .if3:                   ;пока неясно, какая
  51.     cmp     ecx, edx
  52.     jge     .if4
  53.     mov     eax, [ebp + 16]
  54.     mov     dword[eax], 1   ;*predict = 1 должна быть неубывающей
  55. .if4:
  56.     cmp     ecx, edx
  57.     jle     .return1
  58.     mov     eax, [ebp+16]
  59.     mov     dword[eax], -1  ;должны быть невозрастающей
  60. .return1:       ;пока всё ок, проверим на следующем шаге
  61.     mov     eax, 1
  62. .return:
  63.     leave
  64.     ret
  65.        
  66.     global CMAIN
  67. CMAIN:
  68.     mov ebp, esp; for correct debugging
  69.     sub     esp, 4
  70.     push    RB
  71.     push    NAMEIN  ;выравняли и вызвали
  72.     call  fopen
  73.     add     esp, 12
  74.     mov     dword[iin], eax
  75.     sub     esp, 8
  76.     push    WB
  77.     push    NAMEOUT     ;выравняли и вызвали
  78.     call  fopen
  79.     add     esp, 16
  80.     mov     dword[oout], eax
  81.     mov     dword[ans], 2
  82.     mov     dword[maxsize], 128
  83.     mov     dword[size], 0
  84.     mov     eax, [maxsize]
  85.     sal     eax, 2          ;*sizeof(int)
  86.     sub     esp, 12
  87.     push    eax             ;всё выравняли
  88.     call  malloc
  89.     add     esp, 16
  90.     mov     DWORD[a], eax
  91.     jmp     .while
  92. .real:
  93.     add     dword[size], 1
  94.     mov     eax, [size]
  95.     add     eax, 1
  96.     cmp     dword[maxsize], eax     ;if size+1==maxsize
  97.     jne     .while
  98.     mov     edi, [maxsize]
  99.     sal     edi, 1                  ;расширемся в 2 раза
  100.     mov     dword[maxsize], edi
  101.     mov     eax, [maxsize]
  102.     sal     eax, 2
  103.     sub     esp, 8
  104.     push    eax
  105.     push    DWORD[a]           ;всё выровнено
  106.     call  realloc
  107.     add     esp, 16
  108.     mov     dword[a], eax       ;a = malloc(...)
  109. .while:               ;// читаем массив, индексация с 1 (sorry)
  110.     mov     eax, [size]
  111.     add     eax, 1
  112.     lea     edx, [eax * 4]
  113.     mov     eax, [a]
  114.     add     eax, edx
  115.     push    dword[iin]
  116.     push    1
  117.     push    4
  118.     push    eax         ;всё выравняли
  119.     call  fread
  120.     add     esp, 16
  121.     cmp     eax, 1
  122.     je      .real      ;while fread т.е. while input
  123.     mov     esi, 1       ;esi === i - counter
  124.     jmp     .testi
  125. .loop:
  126.     mov     eax, [ans]
  127.     test    eax, eax
  128.     je      .exit           ;if ans==0 это не пирамида
  129.     mov     eax, esi
  130.     lea     edx, [eax * 8]
  131.     mov     eax, [a]
  132.     add     eax, edx
  133.     mov     edx, [eax]
  134.     mov     eax, esi
  135.     lea     ecx, [eax*4]
  136.     mov     eax, [a]
  137.     add     eax, ecx            
  138.     mov     eax, [eax]
  139.     sub     esp, 4              ;выравняли
  140.     lea     ecx, [ans]
  141.     push    ecx
  142.     push    edx
  143.     push    eax
  144.     call  comp        ;cmp(a[i], a[2i], &ans)
  145.     add     esp, 16
  146.     test    eax, eax
  147.     jne     .L14
  148.     mov     dword[ans], 0       ;левый сын не прошёл проверку, это не пирамида
  149. .L14:
  150.     mov     eax, esi
  151.     add     eax, eax
  152.     add     eax, 1
  153.     cmp     dword[size], eax        ;if 2i+1 <= size
  154.     jb      .inci
  155.     mov     eax, esi
  156.     sal     eax, 3
  157.     lea     edx, [eax+4]
  158.     mov     eax, [a]
  159.     add     eax, edx
  160.     mov     edx, [eax]
  161.     mov     eax, esi
  162.     lea     ecx, [0+eax*4]
  163.     mov     eax, [a]
  164.     add     eax, ecx
  165.     mov     eax, [eax]
  166.     sub     esp, 4
  167.     lea     ecx, [ans]
  168.     push    ecx
  169.     push    edx
  170.     push    eax             ;всё выравняли
  171.     call  comp
  172.     add     esp, 16
  173.     test    eax, eax
  174.     jne     .inci           ;if cmp(a[i],a[2i+1],&ans) ans=0
  175.     mov     dword[ans], 0   ;правый сын не прошёл проверку, этл не пирамида
  176. .inci:
  177.     inc     esi
  178. .testi:
  179.     mov     eax, esi
  180.     add     eax, eax
  181.     cmp     dword[size], eax
  182.     jnb     .loop            ;while 2*i <= size
  183.    
  184.     mov     eax, [ans]
  185.     cmp     eax, 2          ;все элементы равны друг другу
  186.     jne     .exit
  187.     mov     dword[ans], 1   ;нужно вывести 1
  188. .exit:
  189.     push    dword[oout]
  190.     push    1
  191.     push    4       ;sizeof int
  192.     push    ans
  193.     call  fwrite
  194.     add     esp, 16
  195.     sub     esp, 12     ;всё выравняли
  196.     push    dword[a]
  197.     call  free        ;всё почистили
  198.     add     esp, 16
  199.     sub     esp, 12
  200.     push    dword[iin]
  201.     call  fclose        ;всё закрыли
  202.     add     esp, 16
  203.     sub     esp, 12     ;всё выравняли
  204.     push    dword[oout]
  205.     call  fclose      ;всё закрыли
  206.     add     esp, 16
  207.     xor     eax, eax
  208.     ret
RAW Paste Data