PDA

View Full Version : Các module MPASM cần giúp đở


phamthanhkhuyen
30-07-2007, 10:46 AM
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 :
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;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