Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Template for console application
- .586
- .MODEL flat, stdcall
- OPTION CASEMAP:NONE
- Include kernel32.inc
- Include masm32.inc
- IncludeLib kernel32.lib
- IncludeLib masm32.lib
- .CONST
- MsgExit DB 13, 10, "Press Enter to Exit", 0
- endl DB 13, 10, 0
- space BYTE " ", 0
- n DWord 5
- m Dword 5
- .DATA
- COMMENT /
- Matrix SDWORD 10, 13, 5, 6, 5,
- 5, 7, -2, 0, -10,
- 3, 13, 9, -1, 0,
- 1, 1, 1, 1, 1,
- -1, -1, -1, 1, 0
- /
- .DATA?
- inbuf DB 100 DUP (?)
- resstr DB 16 DUP (?)
- buffer DB 100 DUP (?)
- Matrix DWORD 5 DUP (?,?,?,?,?)
- .CODE
- out_matr proc near
- mov ECX, n
- out_loop1:
- push ECX
- mov ECX, m
- out_loop2:
- XOR ESI, ESI
- XOR EDI, EDI
- XOR EBX, EBX
- ; ESI = j, EBX = i
- ; j -> ESI
- mov ESI, m ; ESI = m, ECX = (m-j)
- sub ESI, ECX ; ESI = j, ECX = (m-j)
- ; i -> EBX
- pop EDI ; EDI = (n-i)
- mov EBX, n ; EBX = n, EDI = (n-i)
- sub EBX, EDI ; EBX = i, EDI = (n-i)
- jmp output
- output_end:
- push EDI
- loop out_loop2
- Invoke StdOut, ADDR endl ; cout << endl;
- XOR ECX, ECX
- pop ECX
- loop out_loop1
- Invoke StdOut, ADDR endl ; cout << endl;
- ret
- output:
- push ECX
- push EAX
- push EBX
- mov EAX, EBX
- mov EBX, 4
- mul EBX
- mul n
- mov EBX, EAX
- XOR EAX, EAX
- ; matr[i*4*n][j*4] <=> matr[i][j]
- Invoke dwtoa,Matrix[EBX][ESI*4],ADDR resstr ; result number to string ;ESI,ADDR resstr
- ;Invoke StdOut, ADDR str_res ; result text
- Invoke StdOut,ADDR resstr ; result output
- Invoke StdOut, ADDR space
- pop EBX
- pop EAX
- pop ECX
- jmp output_end
- out_matr endp
- in_matr proc near
- mov ECX, n
- out_loop1:
- push ECX
- mov ECX, m
- out_loop2:
- XOR ESI, ESI
- XOR EDI, EDI
- XOR EBX, EBX
- ; ESI = j, EBX = i
- ; j -> ESI
- mov ESI, m ; ESI = m, ECX = (m-j)
- sub ESI, ECX ; ESI = j, ECX = (m-j)
- ; i -> EBX
- pop EDI ; EDI = (n-i)
- mov EBX, n ; EBX = n, EDI = (n-i)
- sub EBX, EDI ; EBX = i, EDI = (n-i)
- jmp input
- input_end:
- push EDI
- loop out_loop2
- ;Invoke StdOut, ADDR endl ; cout << endl;
- XOR ECX, ECX
- pop ECX
- loop out_loop1
- Invoke ClearScreen
- ret
- input:
- push ECX
- push EAX
- push EBX
- mov EAX, EBX
- mov EBX, 4
- mul EBX
- mul n
- mov EBX, EAX
- XOR EAX, EAX
- COMMENT /
- ; matr[i*4*n][j*4] <=> matr[i][j]
- Invoke dwtoa,Matrix[EBX][ESI*4],ADDR resstr ; result number to string ;ESI,ADDR resstr
- ;Invoke StdOut, ADDR str_res ; result text
- Invoke StdOut,ADDR resstr ; result output
- Invoke StdOut, ADDR space
- /
- push EBX
- Invoke StdIn, ADDR buffer, LengthOf buffer ; a input
- Invoke StripLF, ADDR buffer ; "1337\n" -> "13370"
- Invoke atol, ADDR buffer ; "13770" -> 1337
- pop EBX
- mov Matrix[EBX][ESI*4], EAX
- pop EBX
- pop EAX
- pop ECX
- jmp input_end
- in_matr endp
- Start:
- call in_matr
- call out_matr
- XOR ECX, ECX
- mov ECX, n
- Cycle1:
- push ECX
- mov ECX, m
- XOR EAX, EAX
- Cycle2:
- ; Matrix[i][j], sum -> Matr[i][i]
- ; i*m + j
- XOR ESI, ESI
- XOR EDI, EDI
- XOR EBX, EBX
- ; ESI = j, EBX = i
- ; j -> ESI
- mov ESI, m ; ESI = m, ECX = (m-j)
- sub ESI, ECX ; ESI = j, ECX = (m-j)
- ; i -> EBX
- pop EDI ; EDI = (n-i)
- mov EBX, n ; EBX = n, EDI = (n-i)
- sub EBX, EDI ; EBX = i, EDI = (n-i)
- ; Matrix[i][j] <=> 0
- push EAX
- mov EAX, EBX
- mov EBX, 4
- mul EBX
- mul n
- mov EBX, EAX
- XOR EAX, EAX
- pop EAX
- ; sum if > 0
- cmp Matrix[EBX][ESI*4], 0 ; matr[i][j] == matr[i*4*n][j*4] // for DWORD
- jng continue
- add EAX, Matrix[EBX][ESI*4]
- continue:
- push EDI
- loop Cycle2
- jmp change_i
- change_i_end:
- mov Matrix[EBX][EDI], EAX
- XOR ECX, ECX
- pop ECX
- loop Cycle1
- call out_matr
- jmp prog_end
- change_i:
- push EAX
- XOR EAX, EAX
- XOR EDI, EDI
- mov EAX, EBX
- mov EDI, n
- div EDI
- XOR EDI, EDI
- mov EDI, EAX
- XOR EAX, EAX
- pop EAX
- jmp change_i_end
- prog_end:
- XOR EAX,EAX
- Invoke StdOut,ADDR MsgExit
- Invoke StdIn,ADDR inbuf,LengthOf inbuf
- Invoke ExitProcess,0
- End Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement