⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 procedure1.asm

📁 用汇编语言实现四则运算,其中数值的范围是用32位长字节表示的范围
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;********************************************************************
; 在运算除法时,被减数与减数个数不相等时函数
;********************************************************************
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 + -