Batisk_AFF

Lab4

Apr 18th, 2021
208
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Template for console application
  2.          .586
  3.          .MODEL  flat, stdcall
  4.          OPTION CASEMAP:NONE
  5.  
  6. Include kernel32.inc
  7. Include masm32.inc
  8.  
  9. IncludeLib kernel32.lib
  10. IncludeLib masm32.lib
  11.  
  12.          .CONST
  13. MsgExit  DB      13, 10, "Press Enter to Exit", 0
  14. endl     DB      13, 10, 0
  15. space    BYTE    " ", 0
  16. n        DWord   5
  17. m        Dword   5
  18.  
  19.          .DATA
  20. COMMENT /
  21. Matrix   SDWORD  10, 13, 5,  6,  5,
  22.                  5,  7, -2,  0, -10,
  23.                  3,  13, 9, -1,  0,
  24.                  1,  1,  1,  1,  1,
  25.                 -1, -1, -1,  1,  0
  26. /
  27.          .DATA?
  28. inbuf    DB    100 DUP (?)
  29. resstr   DB    16  DUP (?)
  30. buffer   DB    100 DUP (?)
  31. Matrix   DWORD 5   DUP (?,?,?,?,?)
  32.  
  33.          .CODE
  34.  
  35. out_matr proc near
  36.     mov ECX, n
  37.     out_loop1:
  38.         push ECX
  39.         mov ECX, m
  40.         out_loop2:
  41.             XOR ESI, ESI
  42.             XOR EDI, EDI
  43.             XOR EBX, EBX
  44.            
  45.             ; ESI = j, EBX = i
  46.            
  47.             ; j -> ESI
  48.             mov ESI, m ; ESI = m, ECX = (m-j)
  49.             sub ESI, ECX ; ESI = j, ECX = (m-j)
  50.            
  51.             ; i -> EBX
  52.             pop EDI ; EDI = (n-i)
  53.             mov EBX, n ; EBX = n, EDI = (n-i)
  54.             sub EBX, EDI ; EBX = i, EDI = (n-i)
  55.            
  56.             jmp output
  57.             output_end:
  58.             push EDI
  59.         loop out_loop2
  60.         Invoke StdOut, ADDR endl ; cout << endl;
  61.         XOR ECX, ECX
  62.         pop ECX
  63.     loop out_loop1
  64.     Invoke StdOut, ADDR endl ; cout << endl;
  65.     ret
  66.    
  67.     output:
  68.         push ECX
  69.         push EAX
  70.        
  71.         push EBX
  72.         mov EAX, EBX
  73.         mov EBX, 4
  74.         mul EBX
  75.         mul n
  76.         mov EBX, EAX
  77.         XOR EAX, EAX
  78.        
  79.         ; matr[i*4*n][j*4] <=> matr[i][j]
  80.         Invoke dwtoa,Matrix[EBX][ESI*4],ADDR resstr ; result number to string   ;ESI,ADDR resstr
  81.         ;Invoke StdOut, ADDR str_res ; result text
  82.         Invoke StdOut,ADDR resstr  ; result output
  83.         Invoke StdOut, ADDR space
  84.        
  85.         pop EBX
  86.         pop EAX
  87.         pop ECX
  88.         jmp output_end
  89.  
  90. out_matr endp
  91.  
  92. in_matr proc near
  93.     mov ECX, n
  94.     out_loop1:
  95.         push ECX
  96.         mov ECX, m
  97.         out_loop2:
  98.             XOR ESI, ESI
  99.             XOR EDI, EDI
  100.             XOR EBX, EBX
  101.            
  102.             ; ESI = j, EBX = i
  103.            
  104.             ; j -> ESI
  105.             mov ESI, m ; ESI = m, ECX = (m-j)
  106.             sub ESI, ECX ; ESI = j, ECX = (m-j)
  107.            
  108.             ; i -> EBX
  109.             pop EDI ; EDI = (n-i)
  110.             mov EBX, n ; EBX = n, EDI = (n-i)
  111.             sub EBX, EDI ; EBX = i, EDI = (n-i)
  112.            
  113.             jmp input
  114.             input_end:
  115.             push EDI
  116.         loop out_loop2
  117.         ;Invoke StdOut, ADDR endl ; cout << endl;
  118.         XOR ECX, ECX
  119.         pop ECX
  120.     loop out_loop1
  121.     Invoke ClearScreen
  122.     ret
  123.    
  124.     input:
  125.         push ECX
  126.         push EAX
  127.        
  128.         push EBX
  129.         mov EAX, EBX
  130.         mov EBX, 4
  131.         mul EBX
  132.         mul n
  133.         mov EBX, EAX
  134.         XOR EAX, EAX
  135.        
  136.         COMMENT /
  137.         ; matr[i*4*n][j*4] <=> matr[i][j]
  138.         Invoke dwtoa,Matrix[EBX][ESI*4],ADDR resstr ; result number to string   ;ESI,ADDR resstr
  139.         ;Invoke StdOut, ADDR str_res ; result text
  140.         Invoke StdOut,ADDR resstr  ; result output
  141.         Invoke StdOut, ADDR space
  142.         /
  143.         push EBX
  144.        
  145.         Invoke StdIn, ADDR buffer, LengthOf buffer ; a input
  146.         Invoke StripLF, ADDR buffer  ; "1337\n" -> "13370"
  147.         Invoke atol, ADDR buffer     ; "13770" -> 1337
  148.        
  149.         pop EBX
  150.         mov Matrix[EBX][ESI*4], EAX
  151.        
  152.         pop EBX
  153.         pop EAX
  154.         pop ECX
  155.         jmp input_end
  156.  
  157. in_matr endp
  158.  
  159. Start:
  160.  
  161. call in_matr
  162.  
  163. call out_matr
  164.  
  165. XOR ECX, ECX
  166. mov ECX, n
  167. Cycle1:    
  168.     push ECX
  169.     mov ECX, m
  170.     XOR EAX, EAX
  171.     Cycle2:
  172.         ; Matrix[i][j], sum -> Matr[i][i]
  173.         ; i*m + j
  174.         XOR ESI, ESI
  175.         XOR EDI, EDI
  176.         XOR EBX, EBX
  177.        
  178.         ; ESI = j, EBX = i
  179.        
  180.         ; j -> ESI
  181.         mov ESI, m ; ESI = m, ECX = (m-j)
  182.         sub ESI, ECX ; ESI = j, ECX = (m-j)
  183.        
  184.         ; i -> EBX
  185.         pop EDI ; EDI = (n-i)
  186.         mov EBX, n ; EBX = n, EDI = (n-i)
  187.         sub EBX, EDI ; EBX = i, EDI = (n-i)
  188.        
  189.         ; Matrix[i][j] <=> 0
  190.         push EAX
  191.        
  192.         mov EAX, EBX
  193.         mov EBX, 4
  194.         mul EBX
  195.         mul n
  196.         mov EBX, EAX
  197.        
  198.         XOR EAX, EAX
  199.         pop EAX
  200.         ; sum if > 0
  201.         cmp Matrix[EBX][ESI*4], 0   ; matr[i][j] == matr[i*4*n][j*4] // for DWORD
  202.         jng continue
  203.         add EAX, Matrix[EBX][ESI*4]
  204.        
  205.         continue:
  206.        
  207.         push EDI
  208.     loop Cycle2
  209.    
  210.     jmp change_i
  211.     change_i_end:
  212.     mov Matrix[EBX][EDI], EAX
  213.     XOR ECX, ECX
  214.     pop ECX
  215. loop Cycle1
  216.  
  217. call out_matr
  218.  
  219. jmp prog_end
  220.  
  221. change_i:
  222.     push EAX
  223.     XOR EAX, EAX
  224.     XOR EDI, EDI
  225.     mov EAX, EBX
  226.     mov EDI, n
  227.     div EDI
  228.     XOR EDI, EDI
  229.     mov EDI, EAX
  230.     XOR EAX, EAX
  231.     pop EAX
  232.     jmp change_i_end
  233.  
  234. prog_end:
  235.      XOR    EAX,EAX
  236.      Invoke StdOut,ADDR MsgExit
  237.      Invoke StdIn,ADDR inbuf,LengthOf inbuf    
  238.  
  239.      Invoke ExitProcess,0
  240.      End    Start
RAW Paste Data