Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .386
- _TEXT SEGMENT PAGE PUBLIC 'CODE' FLAT
- ;(X+10) - (Y<<2) * ((X - Y) / (X + 2*Y))
- ; A1 A2 EAX A4
- ;------------------------------------------
- FuncAsm PROC STDCALL X:SDWORD, Y:SDWORD
- ;------------------------------------------
- LOCAL A1,A2,A4:SDWORD
- PUSH ESI
- PUSH EDI
- MOV ESI,[X]
- MOV EDI,[Y]
- MOV EAX,ESI
- ADD EAX,10
- MOV A1,EAX
- MOV EAX,EDI
- SAL EAX,2
- MOV A2,EAX
- LEA EAX,[ESI+2*EDI]
- MOV A4,EAX
- MOV EAX,ESI
- SUB EAX,EDI
- CDQ
- IDIV A4
- IMUL EAX,A2
- NEG EAX
- ADD EAX,A1
- POP EDI
- POP ESI
- RET
- FuncAsm ENDP
- ;------------------------------------------
- ;------------------------------------------
- FuncArrayAsm PROC STDCALL X: PTR SDWORD, Y: PTR SDWORD, Dst: PTR SDWORD, Arrlen :DWORD
- ;------------------------------------------
- LOCAL Xi,Yi,Ri:SDWORD, A1,A2,A4:SDWORD
- MOV ECX, Arrlen
- PUSH ESI
- PUSH EDI
- PUSH EBX
- MOV ESI,[X]
- MOV EDI,[Y]
- MOV EBX,[Dst]
- SUB EDI,ESI
- SUB EBX,ESI
- .REPEAT
- MOV EAX,[ESI] ; Первый массив
- MOV Xi,EAX
- MOV EAX,[ESI+EDI] ; Второй массив
- MOV Yi,EAX
- ;---------------------------------------
- PUSH EBX
- PUSH ESI
- PUSH EDI
- MOV ESI,Xi
- MOV EDI,Yi
- MOV EAX,ESI
- ADD EAX,10
- MOV A1,EAX
- MOV EAX,EDI
- SAL EAX,2
- MOV A2,EAX
- LEA EAX,[ESI+2*EDI]
- MOV A4,EAX
- MOV EAX,ESI
- SUB EAX,EDI
- CDQ
- IDIV A4
- IMUL EAX,A2
- NEG EAX
- ADD EAX,A1
- POP EDI
- POP ESI
- POP EBX
- ;---------------------------------------
- MOV [ESI+EBX],EAX ; Третий массив
- LEA ESI,[ESI+4]
- DEC ECX
- .UNTIL ZERO?
- POP EBX
- POP EDI
- POP ESI
- RET
- FuncArrayAsm ENDP
- ;------------------------------------------
- ;------------------------------------------
- FuncArrayAsm_4 PROC STDCALL X: PTR SDWORD, Y: PTR SDWORD, Dst: PTR SDWORD, Arrlen :DWORD
- ;------------------------------------------
- LOCAL Xi,Yi,Ri:SDWORD, A1,A2,A4:SDWORD
- MOV ECX, Arrlen
- PUSH ESI
- PUSH EDI
- PUSH EBX
- MOV ESI,[X]
- MOV EDI,[Y]
- MOV EBX,[Dst]
- SUB EDI,ESI
- SUB EBX,ESI
- .REPEAT
- CMP ECX,4
- JB Low_4_elements
- REPT 4
- MOV EAX,[ESI] ; Первый массив
- MOV Xi,EAX
- MOV EAX,[ESI+EDI] ; Второй массив
- MOV Yi,EAX
- ;---------------------------------------
- PUSH EBX
- PUSH ESI
- PUSH EDI
- MOV ESI,Xi
- MOV EDI,Yi
- MOV EAX,ESI
- ADD EAX,10
- MOV A1,EAX
- MOV EAX,EDI
- SAL EAX,2
- MOV A2,EAX
- LEA EAX,[ESI+2*EDI]
- MOV A4,EAX
- MOV EAX,ESI
- SUB EAX,EDI
- CDQ
- IDIV A4
- IMUL EAX,A2
- NEG EAX
- ADD EAX,A1
- POP EDI
- POP ESI
- POP EBX
- ;---------------------------------------
- MOV [ESI+EBX],EAX ; Третий массив
- LEA ESI,[ESI+4]
- DEC ECX
- ENDM
- .UNTIL ZERO?
- jmp quit
- Low_4_elements:
- .REPEAT
- MOV EAX,[ESI] ; Первый массив
- MOV Xi,EAX
- MOV EAX,[ESI+EDI] ; Второй массив
- MOV Yi,EAX
- ;---------------------------------------
- PUSH EBX
- PUSH ESI
- PUSH EDI
- MOV ESI,Xi
- MOV EDI,Yi
- MOV EAX,ESI
- ADD EAX,10
- MOV A1,EAX
- MOV EAX,EDI
- SAL EAX,2
- MOV A2,EAX
- LEA EAX,[ESI+2*EDI]
- MOV A4,EAX
- MOV EAX,ESI
- SUB EAX,EDI
- CDQ
- IDIV A4
- IMUL EAX,A2
- NEG EAX
- ADD EAX,A1
- POP EDI
- POP ESI
- POP EBX
- ;---------------------------------------
- MOV [ESI+EBX],EAX ; Третий массив
- LEA ESI,[ESI+4]
- DEC ECX
- .UNTIL ZERO?
- quit:
- POP EBX
- POP EDI
- POP ESI
- RET
- FuncArrayAsm_4 ENDP
- ;------------------------------------------
- ;------------------------------------------
- FuncCycleCallArrayAsm PROC STDCALL X:PTR SDWORD, Y:PTR SDWORD, Dst:PTR SDWORD, Arrlen:SDWORD
- ;------------------------------------------
- MOV ECX,Arrlen
- JECXZ NotElement
- PUSH ESI
- PUSH EDI
- PUSH EBX
- MOV ESI,[X]
- MOV EDI,[Y]
- MOV EBX,[Dst]
- SUB EDI,ESI
- SUB EBX,ESI
- .REPEAT
- MOV EAX,[ESI] ; Первый массив
- MOV EDX,[ESI+EDI] ; Второй массив
- invoke FuncAsm,EAX,EDX
- MOV [ESI+EBX],EAX ; Третий массив
- LEA ESI,[ESI+4]
- DEC ECX
- .UNTIL ZERO?
- POP EBX
- POP EDI
- POP ESI
- NotElement:
- RET
- FuncCycleCallArrayAsm ENDP
- ;------------------------------------------
- _TEXT ENDS
- END
Add Comment
Please, Sign In to add comment