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

📄 无符号数除法子程序16×16.asm

📁 PIC单片机无符号数运算子程序,可以直接调用!
💻 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 + -