View Single Post
Old 30-07-2007, 10:46 AM   #1
phamthanhkhuyen
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 25
:
Các module MPASM cần giúp đở

nhờ các bạn xem module sau : xem nó sai ở chổ nào cho ý kiến để nó trở thành module đúng :
đây là chương trình trừ 2 con số BCD nén 16 bit với nhau :
Code:
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;MODULE			:						BCD16_SUB

;CHU THICH		:				TRU 2 SO BCDnen16bit
;NGUOI THUC HIEN:				PHAM THANH KHUYEN

;KHAI BAO BIEN	:	NUM_H1   NUM_L1   NUM_H2    NUM_L2

;con so tru		: 	(NUM_H1 NUM_L1) co tri so tu 00 00 : 99 99
;con so bi tru	:	(NUM_H2 NUM_L2) co tri so tu 00 00 : 99 99
;HOAT DONG		:	REULT_L 	= (NUM_L2 - NUM_L1)
				;	RESULT_H	= (NUM_H2 - NUM_H1)	
				
;KET QUA 		:	RESULT_L	luu vao	NUM_L2
				;	RESULT_H	luu vao	NUM_H2
;co nho C 		:	duoc ngam qui dinh = NUM_H1
;co nho phu DC	:	duoc ngam qui dinh = NUM_L1

		;RESULT_H	>=0	AND		RESULT_L > 0			; 	NUM_H1 = 1	;  NUM_L1 = 1
		;RESULT_H	>0	AND		RESULT_L < 0			; 	NUM_H1 = 1	;  NUM_L1 = 0

;PHEP TOAN KHONG THUC HIEN TRONG CAC TRUONG HOP SAU:
		;NUM_H2 	=0	AND		RESULT_L < 0			; KET QUA	:	NUM_H2 = NUM_L2 = 0XFF
														;	NUM_H1 = 0	;  NUM_L1 = 0

		;RESULT_H	<0	AND		RESULT_L < 0			; KET QUA 	: 	NUM_H2 = NUM_L2 = 0XFF
														;	NUM_H1 = 0	;  NUM_L1 = 0

		;RESULT_H	<0	AND		RESULT_L > 0			; KET QUA 	: 	NUM_H2 = NUM_L2 = 0XFF
														;	NUM_H1 = 0	;  NUM_L1 = 1
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BCD16_SUB

					;XET RESULT_L= NUM_L2 - NUM_L1
					movf	NUM_L1, W
					subwf	NUM_L2, F
					movlw	B'00000010'
					movwf	NUM_L1
					andwf	STATUS, W
					movwf	NUM_L1			;LUU DC OF BYTE_L
					
					btfsc	STATUS, C
					goto	SUB_H0			;C(l)=1 NUM_L2 >= NUM_L1 ; RESULT_L >=0
;KHI RESUL_L <0
CHECK_NUM_H2				
					movf	NUM_H2, W		;NUM_H2=0 ?
					btfsc	STATUS, Z
					goto	NO_SUB			;Z=1 -->NUM_H2=0 RESULT<0
					decf	NUM_H2, F
					movf	NUM_H1, W
					subwf	NUM_H2, F
					btfsc	STATUS, C
					goto	SUB_H1			;C(h)=1	--> NUM_H2=NUM_H2 - 1 >= NUM_H1 & RESULT_L<0
NO_SUB
									;NEU KET QUA LA CON SO AM THI NUM_L1=NUM_H1=2
					clrf	NUM_L1
					clrf	NUM_H1	
					movlw	0XFF
					movwf	NUM_H2
					movlw	NUM_L2
							
EXIT_BCDSUB			return

;RESULT_H0 = NUM_H2 - NUM_H1 (VOI: RESUL_L >= 0)					
SUB_H0
					movf	NUM_H1, W
					subwf	NUM_H2, F

					btfss	sTATUS, C
					goto	NO_SUB1			;C=0 NUM_H2 < NUM_H1
					btfsc	STATUS, DC		;C=1 NUM_H2 >= NUM_H1 ; DC?
					goto	SUB_L0			;DC=1	RESULT_H = CON SO BCD
					movlw	0X06			;DC=0	RESULT_H KHONG PHAI LA BCD
					subwf	NUM_H2, F		;DOI SANG CON SO BCD
;RESULT_L = NUM_L2 - NUM_L1 >0 (VOI: C=1 DC NAM TRONG NUM_L1)
SUB_L0
					;XET CO DC
					btfsc	NUM_L1, 1
					goto	FINISH_1		;DAT NUM_L1 = 1 ROI THOAT
					movlw	0X06
					subwf	NUM_L2, F
FINISH_1			movlw	.1
					movwf	NUM_L1
					movwf	NUM_H1
					goto	EXIT_BCDSUB

;RESULT_H1= NUM_H2 - NUM_H1>0 (VOI: RESULT_L<0 ; C(h)=1)
SUB_H1					
					;XET CO DC(h)
					btfsc	STATUS, DC
					goto	SUB_L1			;DC=1 RESULT_H1 LA CON SO BCD
					movlw	0X06
					subwf	NUM_H2, F		;DC=0 DOI RESULT_H1 THANH CO SO BCD
;RESULT_L <0 ; C(l)=0 ; DC?
SUB_L1
					;XET DC(l)
					btfsc	NUM_L1, 1
					goto	FINISH_2		;DC(l)=1  DAT NUM_L1 = 1 ROI THOAT										
					movlw	0X66			;DC(L)=0	DOI RESUL_L SANG BCD
					subwf	NUM_L2, F
FINISH_2			clrf	NUM_L1
					movlw	.1
					movwf	NUM_H1


NO_SUB1				movlw	.1
					movwf	NUM_L1
					clrf	NUM_H1
					movlw	0XFF
					movwf	NUM_H2
					movwf	NUM_L2
phamthanhkhuyen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn