📄 procedure1.asm
字号:
;********************************************************************
; 在运算除法时,被减数与减数个数不相等时函数
;********************************************************************
NoEqualNumbers PROC NEAR32
push ebp
pushad
lea edi , Median2
add edi , 21
lea esi , nobcd2
add esi , count
mov bl , 2h
call mulUnp1
mov ecx , count
inc ecx
lea edi , Median1
add edi , ecx
lea esi , Median2
add esi , 21
call ifNegative
cmp al , 0
je toJudge5
dec bl
call OutMedian1
jmp exit3
toJudge5: ;Divisor Mulipic 0 to 9 , made result <= Dividend and Dividend-result< Divisor
lea esi , nobcd2
add esi , count
lea edi , Median2
add edi , 21
inc bl
cmp bl , 9h
je Nowhile1
call mulUnp1
lea esi , Median2
add esi , 21
lea edi , Median1
mov ecx , count
inc ecx
add edi , ecx
call ifNegative
mov dl , al
mov ecx , count
inc ecx
lea esi , Median1
add esi , ecx
lea edi , Median2
add edi , 21
loopFor15:
dec edi
dec esi
mov al , [esi]
cmp BYTE PTR[edi] , al
jne Nowhile2
loop loopFor15
jmp Nowhile1
Nowhile2:
cmp dl , 0
je toJudge5
dec bl
Nowhile1:
cmp bl , 9
jne Equal9
lea esi , nobcd2
add esi , count
lea edi , Median2
add edi , 21
call mulUnp1
mov ecx , count
inc ecx
lea esi , Median1
lea edi , Median2
add edi , 21
sub edi , ecx
loopFor16:
mov al , [esi]
cmp al , BYTE PTR[edi]
jl Less9
inc edi
inc esi
loop loopFor16
jmp Equal9
Less9:
dec esi
dec edi
mov al , [esi]
cmp al , BYTE PTR[edi]
jg Equal9
dec bl
Equal9: call OutMedian1 ; do Quotient and Remainder
exit3:
popad
pop ebp
ret
NoEqualNumbers ENDP
;********************************************************************
; 在运算除法时,被减数与减数个数不相等时,处理余数为下次做除法做准备
;********************************************************************
OutMedian1 PROC NEAR32
push ebp
push edi
push esi
push edx
push ebx
mov Quotient1 , bl ; take Quotient
lea esi , nobcd2
add esi , count
lea edi , Median2
add edi , 21
call mulUnp1
lea edi , Median1
mov ecx , count
inc ecx
add edi , ecx
lea esi , Median2
add esi , 21
call subUnp
lea esi , Median1
mov ecx , 0h
mov edx , count
inc count
Nowhile3:
cmp BYTE PTR [esi] , 0h
jne Nowhile2
inc ecx
inc esi
cmp ecx , count
je Nowhile2
jmp Nowhile3
Nowhile2:
mov count3 , 0h
sub count , ecx
mov ebx , count
mov count3 , ebx
mov count , edx
cmp count3 , 0
je Nowhile4
mov ebx , ecx
mov edx , 0
mov ecx , count
inc ecx
loopFor12: ;take Remainder into Divisend
lea esi , Median1
add esi , ebx
mov al, [esi]
lea esi , Median1
add esi ,edx
mov [esi], al
inc ebx
inc edx
loop loopFor12
Nowhile4:
pop ebx
pop edx
pop esi
pop edi
pop ebp
ret
OutMedian1 ENDP
;********************************************************************
; 在运算除法时,被减数与减数个数相等时,处理余数为下次做除法做准备
;********************************************************************
OutMedian2 PROC NEAR32
push ebp
push edi
push esi
push edx
push ebx
mov Quotient1 , bl ; take Quotient
lea esi , nobcd2
add esi , count
lea edi , Median2
add edi , 21
call mulUnp1
lea edi , Median1
add edi , count
lea esi , Median2
add esi , 21
mov ecx , count
call subUnp
lea esi , Median1
mov ecx , 0h
mov edx , count
Nowhile3:
cmp BYTE PTR [esi] , 0h
jne Nowhile2
inc ecx
inc esi
cmp ecx , count
je Nowhile2
jmp Nowhile3
Nowhile2:
mov count3 , 0h
sub count , ecx
mov ebx , count
mov count3 , ebx
mov count , edx
cmp count3 , 0h
je Nowhile4
mov ebx , ecx
mov edx , 0
mov ecx , count
loopFor9: ;take Remainder into Divisend
lea esi , Median1
add esi , ebx
mov al, [esi]
lea esi , Median1
add esi ,edx
mov [esi], al
inc ebx
inc edx
loop loopFor9
Nowhile4:
pop ebx
pop edx
pop esi
pop edi
pop ebp
ret
OutMedian2 ENDP
;********************************************************************
; 在运算除法时,通过被除数与除数个数来决定循环次数
;********************************************************************
Cycle PROC NEAR32
push ebp
pushad
mov al , [esi] ;take Divisend into Remainder
lea edi , Median1
add edi , count3
mov edx , esi
mov [edi], al
inc edi
lea esi , nobcd2
add esi , count
mov ebx , count3
inc ebx
cmp ebx , count
jl toJudge12
cmp ebx , count
jg toJudge7
call ifNegative1
cmp al , 0
je toJudge10
mov esi , edx
inc count3
lea edi , Quotient
add edi , count2
mov BYTE PTR [edi], 0h
inc count2
jmp toJudge11
toJudge7:
inc count3
call NoEqualNumbers ;if number of Divisend not equal number of Divisor
mov bl , Quotient1
lea edi , Quotient
add edi , count2
mov BYTE PTR [edi] , bl
inc count2
jmp toJudge11
toJudge10:
inc count3
call EqualNumbers ;;if number of Divisend equal number of Diviso
mov bl , Quotient1
lea edi , Quotient
add edi , count2
mov BYTE PTR[edi], bl
inc count2
jmp toJudge11
toJudge12:
mov bl , 0h
lea edi , Quotient
add edi , count2
mov BYTE PTR[edi], bl
inc count3
inc count2
toJudge11:
popad
pop ebp
ret
Cycle ENDP
;********************************************************************
; 判断两数大小函数,如果大于等于al=0 , 否则al=-1
;********************************************************************
ifNegative1 PROC NEAR32
push ebp
push esi
push edi
clc ; clear carry flag
mov ecx, ebx ; count of bytes to process
forSub: dec edi ; point at operand bytes to left
dec esi
mov al, [edi] ; get one operand byte
sbb al, [esi] ; add other operand byte
aas ; adjust to unpacked BCD
loop forSub ; repeat for all 8 bytes
jnc Positive
mov al , 01h
jmp exit1
Positive:
mov al , 0h
exit1:
pop edi
pop esi
pop ebp
ret
ifNegative1 ENDP
;********************************************************************
; 对加、减运算结果输出处理函数
;********************************************************************
OutResult PROC NEAR32
push ebp
mov ecx , 0h
lea esi , result
inc esi
CountZero:
cmp BYTE PTR[esi] , 30h
jne initia
inc ecx
inc esi
cmp ecx , 18
je initia
jmp CountZero
initia:
mov edx , ecx
mov count1 , ecx
mov count , 18
sub count , ecx
cmp count , 0
je ResultZero
mov ecx , count
mov ebx , 0
RemoveZero: ;remove head of result zero and take behind of zero digit move head
lea esi , result
inc esi
add esi , edx
mov al , BYTE PTR[esi]
lea esi , result
inc esi
add esi , ebx
mov [esi] , al
inc ebx
inc edx
loop RemoveZero
lea esi , result
inc esi
add esi , count
mov ecx , count1
jmp ClearZero
ResultZero:
lea esi , result
inc esi
add esi , 1
mov ecx , 17
ClearZero:
mov BYTE PTR[esi] , 0h
inc esi
loop ClearZero
pop ebp
ret
OutResult ENDP
;********************************************************************
; 对乘法运算结果输出处理函数
;********************************************************************
OutMulResult PROC NEAR32
push ebp
mov ecx , 0h
lea esi , result
CountZero:
cmp BYTE PTR[esi] , 30h
jne initia
inc ecx
inc esi
cmp ecx , 21
je initia
jmp CountZero
initia:
mov edx , ecx
mov count1 , ecx
mov count , 21
sub count , ecx
cmp count , 0
je ResultZero
mov ecx , count
mov ebx , 0
RemoveZero: ;remove head of result zero and take behind of zero digit move head
lea esi , result
add esi , edx
mov al , BYTE PTR[esi]
lea esi , result
add esi , ebx
mov [esi] , al
inc ebx
inc edx
loop RemoveZero
lea esi , result
add esi , count
mov ecx , count1
jmp ClearZero
ResultZero:
lea esi , result
add esi , 1
mov ecx , 20
ClearZero:
mov BYTE PTR[esi] , 0h
inc esi
loop ClearZero
pop ebp
ret
OutMulResult ENDP
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -