3o_3v

simple bst

May 11th, 2022 (edited)
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;sasm
  2. %include "io.inc"
  3. section .bss
  4.     derevo: resd 1
  5.     k: resd 1
  6.     v: resd 1
  7.     c: resb 1
  8. section .rodata
  9.     T2: db "%d %d", 0
  10.     T1: db "%d", 0
  11.     T3: db "%c", 0
  12.     T4: db "%d %d\n", 0
  13. section .text
  14. CEXTERN scanf
  15. CEXTERN printf
  16. CEXTERN malloc
  17. CEXTERN free
  18. global searchnode
  19. global findmin
  20. global cleanderevo
  21. global addnode
  22. global delnode
  23.  
  24. searchnode:
  25.     push ebp
  26.     mov ebp, esp
  27.     push ebx
  28.     mov ebx, dword[ebp+8]
  29.     L18:
  30.     cmp ebx, 0
  31.     je L19
  32.         mov eax, dword[ebp+12] ;key
  33.         mov edx, dword[ebx+12] ;derevo->key
  34.         cmp eax, edx
  35.         jle L20
  36.         mov ebx, dword[ebx+4]
  37.         jmp L18
  38.         L20:
  39.         je L21
  40.         mov ebx, dword[ebx]
  41.         jmp L18
  42.         L21:
  43.         mov eax, ebx
  44.         jmp L22
  45.     jmp L18
  46.     L19:
  47.     mov eax, 0
  48.     L22:
  49.     pop ebx
  50.     mov esp, ebp
  51.     pop ebp
  52.     ret
  53.  
  54. addnode:
  55.     push ebp
  56.     mov ebp, esp
  57.     sub esp, 8
  58.     mov dword[esp], edi
  59.     mov dword[esp+4], esi
  60.     sub esp, 16
  61.     ;код
  62.     mov dword[esp+8], 0
  63.     mov eax, dword[ebp+8]
  64.     mov dword[esp+12], eax
  65.     L10:
  66.     cmp dword[esp+12], 0
  67.     je L11
  68.         mov eax, dword[ebp+12] ;key
  69.         mov edx, dword[esp+12] ;node
  70.         mov edx, dword[edx+12] ;node->key
  71.         cmp eax, edx
  72.         jle L12
  73.             ; key>node->key
  74.             mov eax, dword[esp+12]
  75.             mov dword[esp+8], eax
  76.             mov eax, dword[eax+4]
  77.             mov dword[esp+12], eax
  78.             jmp L10
  79.         L12:
  80.             je L13
  81.             ;key<node->key
  82.             mov eax, dword[esp+12]
  83.             mov dword[esp+8], eax
  84.             mov eax, dword[eax]
  85.             mov dword[esp+12], eax
  86.             jmp L10
  87.         L13:
  88.             ;key == node->key
  89.             mov eax, dword[ebp+16]
  90.             mov edx, dword[esp+12]
  91.             mov dword[edx+16], eax
  92.             jmp L14
  93.     jmp L10
  94.     L11:
  95.     ;
  96.     mov dword[esp], 20
  97.     call malloc
  98.     cmp eax, 0
  99.     je L14
  100.     mov dword[esp+12], eax
  101.     mov edx, dword[ebp+12]
  102.     mov dword[eax+12], edx
  103.     mov edx, dword[ebp+16]
  104.     mov dword[eax+16], edx
  105.     mov edx, dword[esp+8]
  106.     mov dword[eax+8], edx
  107.     mov dword[eax], 0
  108.     mov dword[eax+4], 0
  109.     cmp dword[esp+8], 0
  110.     je L16
  111.     ;сравниваем key, prev->key
  112.     mov eax, dword[ebp+12]
  113.     mov edx, dword[esp+8]
  114.     mov edx, dword[edx+12]
  115.     cmp eax, edx
  116.     jg L17
  117.     mov eax, dword[esp+12]
  118.     mov edx, dword[esp+8]
  119.     mov dword[edx], eax
  120.     jmp L14
  121.     L17:
  122.     mov eax, dword[esp+12]
  123.     mov edx, dword[esp+8]
  124.     mov dword[edx+4], eax
  125.     jmp L14
  126.     L16:
  127.     mov eax, dword[esp+12]
  128.     jmp L15
  129.     L14:
  130.     mov eax, dword[ebp+8]
  131.     L15:
  132.     add esp, 16
  133.     mov edi, dword[esp]
  134.     mov esi, dword[esp+4]
  135.     add esp, 8
  136.     mov esp, ebp
  137.     pop ebp
  138.     ret
  139.  
  140. findmin:
  141.     push ebp
  142.     mov ebp, esp
  143.     mov eax, dword[ebp+8]
  144.     L8:
  145.     mov edx, dword[eax]
  146.     cmp edx, 0
  147.     je L9
  148.     mov eax, edx
  149.     jmp L8
  150.     L9:
  151.     mov esp, ebp
  152.     pop ebp
  153.     ret
  154.  
  155. cleanderevo:
  156.     push ebp
  157.     mov ebp, esp
  158.     sub esp, 8
  159.     mov eax, dword[ebp+8]
  160.     cmp eax, 0
  161.     je L5
  162.     mov edx, dword[eax]
  163.     cmp edx, 0
  164.     je L6
  165.     mov dword[esp], edx
  166.     call cleanderevo
  167.     L6:
  168.     mov eax, dword[ebp+8]
  169.     mov edx, dword[eax+4]
  170.     cmp edx, 0
  171.     je L7
  172.     mov dword[esp], edx
  173.     call cleanderevo
  174.     L7:
  175.     mov eax, dword[ebp+8]
  176.     mov dword[esp], eax
  177.     call free
  178.     L5:
  179.     mov esp, ebp
  180.     pop ebp
  181.     ret
  182.    
  183. delnode:
  184.     push ebp
  185.     mov ebp, esp
  186.     sub esp, 24
  187.     mov eax, dword[ebp+8]
  188.     mov dword[esp], eax
  189.     mov eax, dword[ebp+12]
  190.     mov dword[esp+4], eax
  191.     call searchnode
  192.     mov dword[esp+20], eax
  193.     cmp eax, 0
  194.     jne L23
  195.     mov eax, dword[ebp+8]
  196.     mov esp, ebp
  197.     pop ebp
  198.     ret
  199.     L23:
  200.     ;if (deleting->pravo == NULL && deleting->levo == NULL)
  201.     mov ecx, dword[eax]
  202.     mov edx, dword[eax+4]
  203.     cmp ecx, 0
  204.     jne L24
  205.     cmp edx, 0
  206.     jne L24
  207.         mov edx, dword[eax+8] ;deleting->verx
  208.         cmp edx, 0
  209.         je L25
  210.         mov ecx, dword[edx] ;deleting->verx->levo
  211.         cmp ecx, eax
  212.         jne L26
  213.         mov dword[edx], 0
  214.         mov dword[esp], eax
  215.         call free
  216.         mov eax, dword[ebp+8]
  217.         mov esp, ebp
  218.         pop ebp
  219.         ret
  220.         L26:
  221.         mov dword[edx+4], 0
  222.         mov dword[esp], eax
  223.         call free
  224.         mov eax, dword[ebp+8]
  225.         mov esp, ebp
  226.         pop ebp
  227.         ret
  228.         L25:
  229.         mov dword[esp], eax
  230.         call free
  231.         mov eax, 0
  232.         mov esp, ebp
  233.         pop ebp
  234.         ret
  235.     L24:
  236.     ;if (deleting->pravo && deleting->levo)
  237.     mov eax, dword[esp+20] ;deleting
  238.     mov edx, dword[eax]
  239.     mov ecx, dword[eax+4] ;deleting->pravo
  240.     cmp edx, 0
  241.     je L27
  242.     cmp ecx, 0
  243.     je L27
  244.         mov dword[esp], ecx
  245.         call findmin
  246.         mov dword[esp+16], eax
  247.         mov edx, dword[eax+12] ;nextnode->key
  248.         mov ecx, dword[esp+20] ;deleting
  249.         mov dword[ecx+12], edx
  250.         mov edx, dword[eax+16] ;nextnode->value
  251.         mov dword[ecx+16], edx
  252.         mov eax, dword[esp+16]
  253.         cmp dword[eax+4], 0
  254.         je L28
  255.             ;if (nextnode->pravo)
  256.             mov eax, dword[esp+16]
  257.             mov eax, dword[eax+8] ;nextnode->verx
  258.             mov edx, dword[esp+20] ;deleting
  259.             cmp eax, edx
  260.             jne L29
  261.             ;if (nextnode->verx == deleting)
  262.             mov eax, dword[esp+16] ;nextnode
  263.             mov eax, dword[eax+4] ;nextnode->pravo
  264.             mov dword[edx+4], eax
  265.             mov eax, dword[esp+20] ;deleting
  266.             mov edx, dword[esp+16] ;nextnode
  267.             mov edx, dword[edx+4] ;nextnode->pravo
  268.             mov dword[edx+8], eax
  269.             jmp L30
  270.             L29:
  271.             ;else
  272.             mov eax, dword[esp+16]
  273.             mov eax, dword[eax+8] ;nextnode->verx
  274.             mov edx, dword[esp+16]
  275.             mov edx, dword[edx+4] ;nextnode->pravo
  276.             mov dword[eax], edx
  277.             mov eax, dword[esp+16]
  278.             mov eax, dword[eax+4] ;nextnode->pravo
  279.             mov edx, dword[esp+16]
  280.             mov edx, dword[edx+8] ;nextnode->verx
  281.             mov dword[eax+8], edx
  282.             jmp L30
  283.            
  284.         L28:
  285.             ;else
  286.             mov eax, dword[esp+16]
  287.             mov eax, dword[eax+8] ;nextnode->verx
  288.             mov edx, dword[esp+20] ;deleting
  289.             cmp eax, edx
  290.             jne L31
  291.                 ;if (nextnode->verx == deleting)
  292.                 mov dword[edx+4], 0
  293.                 jmp L30
  294.             L31:
  295.                 ;else
  296.                 mov dword[eax], 0
  297.                 jmp L30
  298.                
  299.     L30:
  300.     mov eax, dword[esp+16]
  301.     mov dword[esp], eax
  302.     call free
  303.     mov eax, dword[ebp+8]
  304.     mov esp, ebp
  305.     pop ebp
  306.     ret
  307.     L27:
  308.     mov eax, dword[esp+20] ;deleting
  309.     cmp dword[eax+4], 0
  310.     je L32
  311.     ; if (deleting->pravo)
  312.     cmp dword[eax+8], 0
  313.         ;if (deleting->verx)
  314.         je L33
  315.             mov eax, dword[eax+8]
  316.             mov eax, dword[eax+4]
  317.             cmp eax, dword[esp+20]
  318.             jne L34
  319.             ;if (deleting->verx->pravo == deleting)
  320.             ;deleting->verx->pravo = deleting->pravo;
  321.             mov eax, dword[esp+20]
  322.             mov edx, eax
  323.             mov eax, dword[eax+8]
  324.             mov edx, dword[edx+4]
  325.             mov dword[eax+4], edx
  326.             jmp L35
  327.             L34:
  328.             ;else
  329.             ;deleting->verx->levo = deleting->pravo;
  330.             mov eax, dword[esp+20]
  331.             mov edx, dword[eax+4]
  332.             mov eax, dword[eax+8]
  333.             mov dword[eax], edx
  334.             jmp L35
  335.            
  336.         L33:
  337.         ;else
  338.         ;derevo = derevo->pravo;
  339.         mov eax, dword[ebp+8]
  340.         mov eax, dword[eax+4]
  341.         mov dword[ebp+8], eax ; хакерство какоето получилось
  342.         mov eax, dword[ebp+8]
  343.         mov dword[eax+8], 0
  344.         jmp L36
  345.     L32:
  346.     ;if (deleting->verx)
  347.     mov eax, dword[esp+20]
  348.     cmp dword[eax+8], 0
  349.     je L39
  350.         ;if (deleting->verx->pravo == deleting)
  351.         mov edx, dword[eax+8]
  352.         mov edx, dword[edx+4]
  353.         cmp eax, edx
  354.         jne L37
  355.             ;deleting->verx->pravo = deleting->levo;
  356.             mov eax, dword[esp+20]
  357.             mov edx, dword[eax]
  358.             mov eax, dword[eax+8]
  359.             mov dword[eax+4], edx
  360.         jmp L38
  361.         L37:
  362.         ;else
  363.             ;deleting->verx->levo = deleting->levo;
  364.             mov eax, dword[esp+20]
  365.             mov edx, dword[eax]
  366.             mov eax, dword[eax+8]
  367.             mov dword[eax], edx
  368.         L38:
  369.         ;deleting->levo->verx = deleting->verx;
  370.         mov eax, dword[esp+20]
  371.         mov edx, dword[eax+8]
  372.         mov eax, dword[eax]
  373.         mov dword[eax+8], edx
  374.         jmp L36
  375.     L39:
  376.     ;else
  377.     ;derevo = derevo->levo;
  378.     mov eax, dword[ebp+8]
  379.     mov eax, dword[eax]
  380.     mov dword[ebp+8], eax
  381.     mov eax, dword[ebp+8]
  382.     mov dword[eax+8], 0
  383.     jmp L36
  384.     L35:
  385.     mov eax, dword[esp+20]
  386.     mov edx, dword[eax+4] ;deleting->pravo
  387.     mov ecx, dword[eax+8] ;deleting->verx
  388.     mov dword[edx+8], ecx ;deleting->pravo->verx = deleting->verx;
  389.     L36:
  390.     mov eax, dword[esp+20]
  391.     mov dword[esp], eax
  392.     call free
  393.     mov eax, dword[ebp+8]
  394.     mov esp, ebp
  395.     pop ebp
  396.     ret
  397.    
  398. global CMAIN
  399. CMAIN:
  400.     mov ebp, esp; for correct debugging
  401.     pushad
  402.     mov ebp, esp
  403.     add esp, 16
  404.     and esp, -16
  405.     ;
  406.     L1:
  407.     sub esp, 16
  408.     mov dword[esp+4], c
  409.     mov dword[esp], T3
  410.     call scanf
  411.     add esp, 16
  412.     cmp byte[c], 70 ;F
  413.     je L2
  414.     cmp byte[c], 65 ;A
  415.     jne L3
  416.         sub esp, 16
  417.         mov dword[esp], T2
  418.         mov dword[esp+4], k
  419.         mov dword[esp+8], v
  420.         call scanf
  421.         mov eax, dword[derevo]
  422.         mov dword[esp], eax
  423.         mov eax, dword[k]
  424.         mov dword[esp+4], eax
  425.         mov eax, dword[v]
  426.         mov dword[esp+8], eax
  427.         call addnode
  428.         add esp, 16
  429.         mov dword[derevo], eax
  430.     jmp L1
  431.     L3:
  432.     cmp byte[c], 68 ;D
  433.     jne L4
  434.         sub esp, 16
  435.         mov dword[esp], T1
  436.         mov dword[esp+4], k
  437.         call scanf
  438.         mov eax, dword[derevo]
  439.         mov dword[esp], eax
  440.         mov eax, dword[k]
  441.         mov dword[esp+4], eax
  442.         call delnode
  443.         add esp, 16
  444.         mov dword[derevo], eax
  445.     jmp L1
  446.     L4:
  447.     cmp byte[c], 83 ;S
  448.     jne L1
  449.         sub esp, 16
  450.         mov dword[esp], T1
  451.         mov dword[esp+4], k
  452.         call scanf
  453.         mov eax, dword[derevo]
  454.         mov dword[esp], eax
  455.         mov eax, dword[k]
  456.         mov dword[esp+4], eax
  457.         call searchnode
  458.         cmp eax, 0
  459.         je L1
  460.         mov edx, dword[eax+16]
  461.         mov dword[esp+8], edx
  462.         mov edx, dword[eax+12]
  463.         mov dword[esp+4], edx
  464.         mov dword[esp], T4
  465.         call printf
  466.         add esp, 16
  467.     jmp L1
  468.     L2:
  469.     sub esp, 16
  470.     mov eax, dword[derevo]
  471.     mov dword[esp], eax
  472.     call cleanderevo
  473.     add esp, 16
  474.     ;
  475.     mov esp, ebp
  476.     popad
  477.     xor eax, eax
  478.     ret
Advertisement
Add Comment
Please, Sign In to add comment