.386
.MODEL FLAT, STDCALL
.DATA
.CODE
;--------------------------------------------------
;((X+73)*(Y+3)-Y*X*5)/(Y*5 >> 2)
;--------------------------------------------------
;//-----------------------------------------------------
FuncAsm PROC X:SDWORD, Y:SDWORD
LOCAL X_mul_Y_plus_1:SDWORD, X_mul_X_plus_Y:SDWORD
;//-----------------------------------------------------
PUSH ESI
PUSH EDI
PUSH EBX
MOV EAX,[X] ;запись параметров в регистры
MOV EDX,[Y]
MOV [X_mul_Y_plus_1],EAX ;запись параметров в лок. переменные
MOV [X_mul_X_plus_Y],EDX
ADD X_mul_Y_plus_1, 73 ;X+73
ADD [X_mul_X_plus_Y], 3 ;Y+3
MOV EAX, [X_mul_Y_plus_1] ;X+73 в регистр EAX
MUL [X_mul_X_plus_Y] ;умножение EAX на Y+3
MOV [X_mul_Y_plus_1], EAX ;запись результата (X+73)(Y+3) в лок. переменую
MOV EAX, [Y] ;Y в регистр
MOV [X_mul_X_plus_Y], EAX ;регистр в лок.переменную
MUL [X] ;умножение EAX на X
MOV ESI, EAX ;умножение на 5 с помощью команды LEA
LEA EDX,[ESI+ESI*4]
MOV [X_mul_X_plus_Y], EDX ;Y*X*5 в лок. переменную
MOV EAX, [X_mul_Y_plus_1] ;(X+73)(Y+3) в регистр EAX
SUB EAX, [X_mul_X_plus_Y] ;EAX = EAX - Y*X*5
MOV [X_mul_Y_plus_1], EAX ;EAX в лок. переменную
MOV EAX, [Y] ;Y в EAX
MOV ESI, EAX ;умножение на 5 с помощью команды LEA
LEA EDX,[ESI+ESI*4]
MOV [X_mul_X_plus_Y], EDX ;Y*X*5 в лок. переменную
MOV EAX, [X_mul_X_plus_Y] ;Y*5 из лок. переменной в EAX
SAR EAX, 2 ;сдвиг вправо на 2
MOV [X_mul_X_plus_Y], EAX ;результат Y*5 >> 2
MOV EAX, [X_mul_Y_plus_1] ;(X+73)(Y+3) - Y*X*5 в EAX
CWD ;расширение EAX до DX:AX
DIV [X_mul_X_plus_Y] ;деление (X+73)(Y+3)-Y*X*5)/(Y*5 >> 2)
POP EBX
POP EDI
POP ESI
RET
FuncAsm ENDP
;//-----------------------------------------------------
FuncArrayAsm PROC STDCALL X: PTR SDWORD, Y: PTR SDWORD, Dst: PTR SDWORD, Arrlen: DWORD
LOCAL SAVEEBX: DWORD , X_mul_Y_plus_1:SDWORD, X_mul_X_plus_Y:SDWORD
;//-----------------------------------------------------
PUSH ESI
PUSH EDI
MOV [SAVEEBX], EBX
MOV ECX, [Arrlen]
JECXZ Quit ; Если счётчик нулевой, то выходим
MOV ESI, [X]
MOV EDI, [Y]
MOV EBX, [Dst]
.REPEAT
PUSH ECX
PUSH EBX
;--------------------------------------------------
MOV EAX, [ESI]
MOV EDX, [EDI]
MOV [X_mul_Y_plus_1],EAX ;запись параметров в лок. переменные
MOV [X_mul_X_plus_Y],EDX
ADD X_mul_Y_plus_1, 73 ;X+73
ADD [X_mul_X_plus_Y], 3 ;Y+3
MOV EAX, [X_mul_Y_plus_1] ;X+73 в регистр EAX
MUL [X_mul_X_plus_Y] ;умножение EAX на Y+3
MOV [X_mul_Y_plus_1], EAX ;запись результата (X+73)(Y+3) в лок. переменую
MOV EAX, [Y] ;Y в регистр
MOV [X_mul_X_plus_Y], EAX ;регистр в лок.переменную
MUL [X] ;умножение EAX на X
MOV ESI, EAX ;умножение на 5 с помощью команды LEA
LEA EDX,[ESI+ESI*4]
MOV [X_mul_X_plus_Y], EDX ;Y*X*5 в лок. переменную
MOV EAX, [X_mul_Y_plus_1] ;(X+73)(Y+3) в регистр EAX
SUB EAX, [X_mul_X_plus_Y] ;EAX = EAX - Y*X*5
MOV [X_mul_Y_plus_1], EAX ;EAX в лок. переменную
MOV EAX, [Y] ;Y в EAX
MOV ESI, EAX ;умножение на 5 с помощью команды LEA
LEA EDX,[ESI+ESI*4]
MOV [X_mul_X_plus_Y], EDX ;Y*X*5 в лок. переменную
MOV EAX, [X_mul_X_plus_Y] ;Y*5 из лок. переменной в EAX
SAR EAX, 2 ;сдвиг вправо на 2
MOV [X_mul_X_plus_Y], EAX ;результат Y*5 >> 2
MOV EAX, [X_mul_Y_plus_1] ;(X+73)(Y+3) - Y*X*5 в EAX
CWD ;расширение EAX до DX:AX
DIV [X_mul_X_plus_Y] ;деление ((X+73)(Y+3)-Y*X*5)/(Y*5 >> 2)
;--------------------------------------------------
POP EBX
MOV [EBX], EAX
POP ECX
DEC ECX
LEA ESI, [ESI+4]
LEA EDI, [EDI+4]
LEA EBX, [EBX+4]
.UNTIL ZERO?
Quit:
MOV EBX, [SAVEEBX]
POP EDI
POP ESI
RET
FuncArrayAsm ENDP
;//-----------------------------------------------------
FuncArrayAsm_4 PROC STDCALL X: PTR SDWORD, Y: PTR SDWORD, Dst: PTR SDWORD, Arrlen: DWORD
LOCAL X_mul_Y_plus_1:SDWORD, X_mul_X_plus_Y:SDWORD, SAVEEBX: DWORD
;//-----------------------------------------------------
PUSH ESI
PUSH EDI
MOV [SAVEEBX], EBX
MOV ESI, [X]
MOV EDI, [Y]
MOV EBX, [Dst]
MOV ECX, [Arrlen]
SHR ECX,2
JZ Cycle
Cycle4:
PUSH ECX
REPEAT 4
PUSH EBX
;--------------------------------------------------
MOV EAX, [ESI]
MOV EDX, [EDI]
MOV [X_mul_Y_plus_1],EAX ;запись параметров в лок. переменные
MOV [X_mul_X_plus_Y],EDX
ADD X_mul_Y_plus_1, 73 ;X+73
ADD [X_mul_X_plus_Y], 3 ;Y+3
MOV EAX, [X_mul_Y_plus_1] ;X+73 в регистр EAX
MUL [X_mul_X_plus_Y] ;умножение EAX на Y+3
MOV [X_mul_Y_plus_1], EAX ;запись результата (X+73)(Y+3) в лок. переменую
MOV EAX, [Y] ;Y в регистр
MOV [X_mul_X_plus_Y], EAX ;регистр в лок.переменную
MUL [X] ;умножение EAX на X
MOV ESI, EAX ;умножение на 5 с помощью команды LEA
LEA EDX,[ESI+ESI*4]
MOV [X_mul_X_plus_Y], EDX ;Y*X*5 в лок. переменную
MOV EAX, [X_mul_Y_plus_1] ;(X+73)(Y+3) в регистр EAX
SUB EAX, [X_mul_X_plus_Y] ;EAX = EAX - Y*X*5
MOV [X_mul_Y_plus_1], EAX ;EAX в лок. переменную
MOV EAX, [Y] ;Y в EAX
MOV ESI, EAX ;умножение на 5 с помощью команды LEA
LEA EDX,[ESI+ESI*4]
MOV [X_mul_X_plus_Y], EDX ;Y*X*5 в лок. переменную
MOV EAX, [X_mul_X_plus_Y] ;Y*5 из лок. переменной в EAX
SAR EAX, 2 ;сдвиг вправо на 2
MOV [X_mul_X_plus_Y], EAX ;результат Y*5 >> 2
MOV EAX, [X_mul_Y_plus_1] ;(X+73)(Y+3) - Y*X*5 в EAX
CWD ;расширение EAX до DX:AX
DIV [X_mul_X_plus_Y] ;деление (X+73)(Y+3)-Y*X*5)/(Y*5 >> 2)
;--------------------------------------------------
POP EBX
MOV [EBX], EAX
DEC ECX
LEA ESI, [ESI+4]
LEA EDI, [EDI+4]
LEA EBX, [EBX+4]
ENDM
POP ECX
DEC ECX
JNZ Cycle4
Cycle:
MOV CL,BYTE PTR [Arrlen]
AND CL,3
JZ Quit
.REPEAT
PUSH ECX
PUSH EBX
;--------------------------------------------------
MOV EAX, [ESI]
MOV EDX, [EDI]
MOV [X_mul_Y_plus_1],EAX ;запись параметров в лок. переменные
MOV [X_mul_X_plus_Y],EDX
ADD X_mul_Y_plus_1, 73 ;X+73
ADD [X_mul_X_plus_Y], 3 ;Y+3
MOV EAX, [X_mul_Y_plus_1] ;X+73 в регистр EAX
MUL [X_mul_X_plus_Y] ;умножение EAX на Y+3
MOV [X_mul_Y_plus_1], EAX ;запись результата (X+73)(Y+3) в лок. переменую
MOV EAX, [Y] ;Y в регистр
MOV [X_mul_X_plus_Y], EAX ;регистр в лок.переменную
MUL [X] ;умножение EAX на X
MOV ESI, EAX ;умножение на 5 с помощью команды LEA
LEA EDX,[ESI+ESI*4]
MOV [X_mul_X_plus_Y], EDX ;Y*X*5 в лок. переменную
MOV EAX, [X_mul_Y_plus_1] ;(X+73)(Y+3) в регистр EAX
SUB EAX, [X_mul_X_plus_Y] ;EAX = EAX - Y*X*5
MOV [X_mul_Y_plus_1], EAX ;EAX в лок. переменную
MOV EAX, [Y] ;Y в EAX
MOV ESI, EAX ;умножение на 5 с помощью команды LEA
LEA EDX,[ESI+ESI*4]
MOV [X_mul_X_plus_Y], EDX ;Y*X*5 в лок. переменную
MOV EAX, [X_mul_X_plus_Y] ;Y*5 из лок. переменной в EAX
SAR EAX, 2 ;сдвиг вправо на 2
MOV [X_mul_X_plus_Y], EAX ;результат Y*5 >> 2
MOV EAX, [X_mul_Y_plus_1] ;(X+73)(Y+3) - Y*X*5 в EAX
CWD ;расширение EAX до DX:AX
DIV [X_mul_X_plus_Y] ;деление (X+73)(Y+3)-Y*X*5)/(Y*5 >> 2)
;--------------------------------------------------
POP EBX
MOV [EBX], EAX
POP ECX
DEC ECX
LEA ESI, [ESI+4]
LEA EDI, [EDI+4]
LEA EBX, [EBX+4]
.UNTIL ZERO?
Quit:
MOV EBX, [SAVEEBX]
POP EDI
POP ESI
RET
FuncArrayAsm_4 ENDP
END