?? 無符號數除法子程序16×16.asm
字號:
LIST p=16f877
INCLUDE p16f877.inc
ACCALO EQU 20 ;存放除數低8位
ACCAHI EQU 21 ;存放除數高8位
ACCBLO EQU 22 ;存放被除數和商的低8位
ACCBHI EQU 23 ;存放被除數和商的高8位
ACCCLO EQU 24 ;;存放余數低8位
ACCCHI EQU 25 ;存放余數高8位
ACCDLO EQU 26 ;臨時寄存器
ACCDHI EQU 27 ;臨時寄存器
TEMP EQU 28 ;臨時寄存器
SIGN EQU 29 ;存放商的符號
STATUS EQU 3
ORG 0X0000
START
GOTO MAIN
;***16×16位數除法子程序,入口地址ACCB /ACCA,出口地址ACCB ***
ORG 0X0100
D_div
CALL SETUP ;初始化TEMP,將被除數移至ACCD,
;(SETUP子程序請參見16×16位定點數
;乘法子程序SETUP)
INCF TEMP
CLRF ACCCHI ;清余數寄存器
CLRF ACCCLO
DLOOP BCF STATUS,0 ;清進位位
RLF ACCDLO ;被除數、余數左移1位
RLF ACCDHI
RLF ACCCLO
RLF ACCCHI
MOVF ACCAHI,0 ;ACCCHI-ACCAHI
SUBWF ACCCHI,0
BTFSS STATUS,2 ;ACCCHI=ACCAHI?
GOTO NOCHK
MOVF ACCALO,0 ;是,ACCCLO-ACCALO
SUBWF ACCCLO,0
NOCHK BTFSS STATUS,C ;ACCC>ACCA?
GOTO NOGO
MOVF ACCALO,0 ;是,余數減除數
SUBWF ACCCLO
BTFSS STATUS,0
DECF ACCCHI
MOVF ACCAHI,0
SUBWF ACCCHI
BSF STATUS,C ;置進位位
NOGO RLF ACCBLO ;商左移1位
RLF ACCBHI
DECFSZ TEMP ;循環完畢?
GOTO DLOOP
BTFSS SIGN,7 ;是,確定商的符號
GOTO DIVOVER ;為正,除法結束,跳轉到結束行
COMF ACCCLO ;為負,商和余數分別取補
INCF ACCCLO
BTFSC STATUS,Z
DECF ACCCHI
COMF ACCCHI
CALL NEG_B ;見乘法程序中間NEG_B
DIVOVER RETURN ;子程序返回
NEG_A COMF ACCALO ; ACCALO取反加1
INCF ACCALO
BTFSC STATUS,2 ; 低8位有進位嗎?
DECF ACCAHI ;有,ACCAHI減1,再取反
COMF ACCAHI ;否則ACCAHI直接取反
RETURN ;子程序返回
;********* ACCB取補子程序*************
NEG_B DECF ACCBLO ;;ACCBLO取反加1
COMF ACCBLO
BTFSC STATUS,2 ;低8位有進位嗎?
DECF ACCBHI ;有,ACCBHI減1,再取反
COMF ACCBHI ;否,ACCBHI直接取反
RETLW 0
;****************************************
SETUP MOVLW .15 ;初始化TEMP寄存器
MOVWF TEMP
MOVF ACCBHI,0 ;ACCB送ACCD
MOVWF ACCDHI
MOVF ACCBLO,0
MOVWF ACCDLO
CLRF ACCBHI ;清ACCB
CLRF ACCBLO
RETURN ;子程序返回
MAIN MOVLW 0X60 ;被除數0301H送ACCB
MOVWF ACCBLO
MOVLW 0XFF
MOVWF ACCBHI
MOVLW 0XBD ;除數0F10H送ACCA
MOVWF ACCALO
MOVLW 0X00
MOVWF ACCAHI
CALL D_div ;調用雙字節除法子程序,求商
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -