Advertisement
filashkov

Untitled

May 12th, 2020
549
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %include "io.inc"
  2.  
  3. CEXTERN malloc
  4. CEXTERN printf
  5. CEXTERN scanf
  6. CEXTERN free
  7.  
  8. section .rodata
  9.     io_ db `%d `, 0
  10.     io db `%d`, 0
  11.     ion db `\n`, 0
  12.     lo db `%lld\n`, 0
  13.    
  14. section .data
  15.     answer_matrix dd 0
  16.     answer_size dd 0
  17.     answer_trace dq 0
  18.     n dd 0
  19.     current_matrix dd 0
  20.     current_size dd 0
  21.     current_trace dq 0
  22.     temp dd 0
  23.  
  24. section .text
  25. global CMAIN
  26. CMAIN:
  27.     mov ebp, esp
  28.     and esp, 0xfffffff0
  29.    
  30.     ;PRINT_DEC 4, esp
  31.    
  32.     ;PRINT_DEC 4, [answer_trace]
  33.     ;PRINT_DEC 4, [answer_trace + 4]
  34.     ;NEWLINE
  35.    
  36.     sub esp, 8
  37.     push n       ; второй аргумент
  38.     push io      ; первый аргумент
  39.     call scanf   ; Ввод количества матриц
  40.     add esp, 16
  41.    
  42.     sub esp, 8
  43.     push answer_size      ; второй аргумент
  44.     push io               ; первый аргумент
  45.     call scanf            ; ввод размера первой матрицы
  46.     add esp, 16
  47.    
  48.     mov edx, [answer_size]     ; выделение памяим для answer_matrix
  49.     imul edx, edx
  50.     imul edx, 4
  51.     sub esp, 12
  52.     push edx
  53.     call malloc
  54.     add esp, 16
  55.    
  56.     mov [answer_matrix], eax
  57.     mov [current_matrix], eax
  58.  
  59.  
  60.     mov ebx, 0        
  61. .for_i_first:
  62.     cmp ebx, [answer_size]
  63.         jz .stop_for_i_first
  64.                
  65.             mov ecx, 0
  66.         .for_j_first:
  67.             cmp ecx, [answer_size]
  68.                 jz .stop_for_j_first
  69.                  
  70.                     sub esp, 12
  71.                     push ecx
  72.                    
  73.                     mov edx, [answer_size]
  74.                     imul edx, ebx
  75.                     add edx, ecx
  76.                     shl edx, 2
  77.                    
  78.                     ;PRINT_STRING `Смещение: `
  79.                     ;PRINT_DEC 4, edx
  80.                     ;NEWLINE
  81.                    
  82.                     mov esi, answer_matrix
  83.                     mov esi, [esi]
  84.                     add esi, edx
  85.                    
  86.                     sub esp, 8
  87.                     push esi      ; второй аргумент
  88.                     push io       ; первый аргумент
  89.                     call scanf
  90.                     add esp, 16
  91.                    
  92.                     mov eax, [esi]
  93.                    
  94.                     ;PRINT_DEC 4, eax
  95.                     ;NEWLINE
  96.                    
  97.                     pop ecx
  98.                     add esp, 12
  99.                    
  100.                     cmp ebx, ecx
  101.                         jnz .not_equal_first
  102.                    
  103.                     push ecx
  104.                    
  105.                     mov ecx, eax
  106.                     sar ecx, 31
  107.                    
  108.                     mov edi, [answer_trace]
  109.                     mov esi, [answer_trace + 4]
  110.                     add edi, eax
  111.                     adc esi, ecx
  112.                     mov [answer_trace], edi
  113.                     mov [answer_trace + 4], esi
  114.                    
  115.                     pop ecx
  116.                        
  117.                 .not_equal_first:        
  118.              inc ecx
  119.          jmp .for_j_first
  120.     .stop_for_j_first:
  121.                
  122.          inc ebx
  123.      jmp .for_i_first
  124. .stop_for_i_first:
  125.    
  126.     ;push dword [answer_trace + 4]
  127. ;    push dword [answer_trace]     ; второй аргумент
  128. ;    push lo                       ; первый аргумент
  129. ;    call printf
  130. ;    add esp, 12
  131.    
  132.     mov esi, 1
  133. .for:
  134.     cmp esi, [n]
  135.         jz .stop_for
  136.        
  137.             ;lea eax, [current_matrix]  ; lea
  138. ;            sub esp, 12
  139. ;            push eax
  140. ;            call free
  141. ;            add esp, 16
  142.            
  143.             mov dword [current_trace], 0
  144.             mov dword [current_trace + 4], 0
  145.            
  146.             sub esp, 8
  147.             push current_size     ; второй аргумент
  148.             push io               ; первый аргумент
  149.             call scanf
  150.             add esp, 16
  151.            
  152.             mov edi, [current_size]
  153.             mov edx, 0
  154.             imul edi, edi
  155.             imul edi, 4
  156.            
  157.             sub esp, 12
  158.             push edi
  159.             call malloc
  160.             add esp, 16
  161.            
  162.             mov [current_matrix], eax
  163.            
  164.             mov ebx, 0
  165.         .for_i:
  166.             cmp ebx, [current_size]
  167.                 jz .stop_for_i
  168.                
  169.                     mov ecx, 0
  170.                 .for_j:
  171.                     cmp ecx, [current_size]
  172.                         jz .stop_for_j
  173.                        
  174.                             push esi
  175.                             push ecx
  176.                    
  177.                             mov edx, [current_size]
  178.                             imul edx, ebx
  179.                             add edx, ecx
  180.                             shl edx, 2
  181.                    
  182.                             ;PRINT_STRING `Смещение: `
  183.                             ;PRINT_DEC 4, edx
  184.                             ;NEWLINE
  185.                    
  186.                             mov esi, current_matrix
  187.                             mov esi, [esi]
  188.                             add esi, edx
  189.                    
  190.                             push esi      ; второй аргумент
  191.                             push io       ; первый аргумент
  192.                             call scanf
  193.                             add esp, 8
  194.                    
  195.                             mov eax, [esi]
  196.                    
  197.                             ;PRINT_DEC 4, eax
  198.                             ;NEWLINE
  199.                    
  200.                             pop ecx
  201.                    
  202.                             cmp ebx, ecx
  203.                                 jnz .not_equal
  204.                    
  205.                             push ecx
  206.                    
  207.                             mov ecx, eax
  208.                             sar ecx, 31
  209.                    
  210.                             mov edi, [current_trace]
  211.                             mov esi, [current_trace + 4]
  212.                             add edi, eax
  213.                             adc esi, ecx
  214.                             mov [current_trace], edi
  215.                             mov [current_trace + 4], esi
  216.                    
  217.                             pop ecx
  218.                            
  219.                         .not_equal:
  220.                             pop esi
  221.                        
  222.                         inc ecx
  223.                     jmp .for_j
  224.                 .stop_for_j:
  225.                
  226.                 inc ebx
  227.             jmp .for_i
  228.         .stop_for_i:
  229.        
  230.          ;PRINT_STRING `CURRENT_TRACE = `
  231.          ;PRINT_DEC 4, [current_trace]
  232.          ;NEWLINE
  233.          ;PRINT_STRING `ANSWER_TRACE = `
  234.          ;PRINT_DEC 4, [answer_trace]
  235.          ;NEWLINE
  236.          mov ecx, [current_trace + 4] ; старшие (левые) разряды
  237.          cmp ecx, [answer_trace + 4]  ; старшие (левые) разряды равны?
  238.              jg .replace              ; если старшие разряды current_trace больше, чем старшие разряды answer_trace => заменить
  239.          cmp ecx, [answer_trace  + 4] ; если равны => проверить младшие
  240.             jz .check_little
  241.          jmp .end_of_replacement
  242.     .check_little:
  243.          ;PRINT_UDEC 4, [current_trace]
  244.          ;NEWLINE
  245.          ;PRINT_UDEC 4, [answer_trace]
  246.          ;NEWLINE
  247.          mov ecx, [current_trace]
  248.          cmp ecx, [answer_trace]
  249.             ja .replace
  250.          jmp .end_of_replacement
  251.     .replace:
  252.        
  253.          ;PRINT_STRING `current_ESI = `
  254.          ;PRINT_DEC 4, esi
  255.          ;NEWLINE
  256.          
  257.          mov ecx, [current_trace]
  258.          mov [answer_trace], ecx
  259.          mov ecx, [current_trace + 4]
  260.          mov [answer_trace + 4], ecx
  261.          mov ecx, [current_matrix]   ; lea
  262.          mov [answer_matrix], ecx
  263.          mov ecx, [current_size]
  264.          mov [answer_size], ecx
  265.     .end_of_replacement:
  266.        
  267.         inc esi
  268.     jmp .for
  269. .stop_for:
  270.  
  271.     ;push dword [answer_trace + 4]
  272. ;    push dword [answer_trace]     ; второй аргумент
  273. ;    push lo                       ; первый аргумент
  274. ;    call printf
  275. ;    add esp, 12
  276.    
  277.     mov edi, [n]
  278.     mov esi, 1
  279.    
  280.     mov ebx, 0
  281. .print_for:
  282.     cmp ebx, [answer_size]
  283.         jz .stop_print_for
  284.        
  285.             mov ecx, 0
  286.            
  287.         .inner_print_for:
  288.             cmp ecx, [answer_size]
  289.                 jz .stop_inner_print_for
  290.                
  291.                     mov edx, [answer_size]
  292.                     imul edx, ebx
  293.                     add edx, ecx
  294.                     shl edx, 2
  295.                    
  296.                     ;PRINT_STRING `Смещение: `
  297.                     ;PRINT_DEC 4, edx
  298.                     ;NEWLINE
  299.                    
  300.                     mov esi, answer_matrix
  301.                     mov esi, [esi]
  302.                     add esi, edx
  303.                    
  304.                     push ecx
  305.                    
  306.                     sub esp, 4
  307.                     push dword [esi]       ; второй аргумент
  308.                     push io_               ; первый аргумент
  309.                     call printf
  310.                     add esp, 12
  311.                    
  312.                     pop ecx
  313.                
  314.                 inc ecx
  315.             jmp .inner_print_for
  316.         .stop_inner_print_for:
  317.            
  318.             sub esp, 12
  319.             push ion    ; первый аргумент
  320.             call printf
  321.             add esp, 16
  322.        
  323.         inc ebx
  324.     jmp .print_for
  325. .stop_print_for:
  326.    
  327.     ;lea eax, [answer_matrix]  ; lea
  328. ;    and esp, 0xfffffff0
  329. ;    sub esp, 12
  330. ;    push eax
  331. ;    call free
  332. ;    add esp, 16
  333.    
  334.     mov esp, ebp
  335.     xor eax, eax
  336.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement