打印

三字节无符号数除法程序,用得上就拿走。

[复制链接]
1955|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ztzer|  楼主 | 2009-5-1 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov, vi, AN, ISO, hm
刚写的三字节除法程序,程序是调通了,但觉得自己算法太差。希望 高人指导下。


;--------------------------------三字节除法
Divisor_AND_Residue_H    EQU 30H        ;被除数和余数
Divisor_AND_Residue_M    EQU 31H
Divisor_AND_Residue_L    EQU 32H         

Dividend_DATA_H    EQU 33H                  ;除数寄存器
Dividend_DATA_M    EQU 34H
Dividend_DATA_L    EQU 35H

Quotient_DATA_H    EQU 36H                ;商数
Quotient_DATA_M    EQU 36H
Quotient_DATA_L    EQU 37H

DIV_FLAG        BIT 21H.0             ;除法结束标志位

    ORG  0000H
    AJMP MAIN
    ORG  0300H
MAIN:

    MOV        SP,#70H
    MOV     Divisor_AND_Residue_H,#0F0H
    MOV        Divisor_AND_Residue_M,#0F3H
    MOV        Divisor_AND_Residue_L,#067H

    MOV     Dividend_DATA_H,#05h
    MOV     Dividend_DATA_M,#023h
    MOV     Dividend_DATA_L,#22h

    MOV     Quotient_DATA_H,#00H
    MOV     Quotient_DATA_M,#00H
    MOV     Quotient_DATA_L,#00H

    CLR     DIV_FLAG

    LCALL      DIV33
    MOV        R1,Quotient_DATA_H
    MOV        R2,Quotient_DATA_M
    MOV        R3,Quotient_DATA_L

    MOV        R4,Divisor_AND_Residue_H  
    MOV        R5,Divisor_AND_Residue_M 
    MOV        R6,Divisor_AND_Residue_L
    AJMP   $

DIV33:                       ;三字节除法程序
 
SUBB_LOOP:                   ;循环做减法
    CALL     SUBB_Judge ;比较被减数是否大于减数
    JB    DIV_FLAG,DIV_OVER
    CLR     C
    INC    Quotient_DATA_L    
    MOV     A,Quotient_DATA_M
    ADDC    A,#00H
    MOV     Quotient_DATA_M,A
    MOV     A,Quotient_DATA_H
    ADDC    A,#00H
    AJMP     SUBB_LOOP
DIV_OVER:
    RET

SUBB_Judge:
    CLR     C    
    MOV     A,Divisor_AND_Residue_H
    SUBB    A,Dividend_DATA_H
    JC        SUBB_STOP
    JNZ        SUBB33
    CLR     C
    MOV     A,Divisor_AND_Residue_M        
    SUBB    A,Dividend_DATA_M
    JC        SUBB_STOP
    JNZ        SUBB33
    CLR        C
    MOV     A,Divisor_AND_Residue_L
    SUBB     A,Dividend_DATA_L
    JC        SUBB_STOP

SUBB33:                                       ;三字节减法
    MOV     A,Divisor_AND_Residue_L
    CLR    C
    SUBB     A,Dividend_DATA_L
    MOV     Divisor_AND_Residue_L,A
    MOV    A,Divisor_AND_Residue_M    
    SUBB    A,Dividend_DATA_M
    MOV     Divisor_AND_Residue_M,A
    MOV     A,Divisor_AND_Residue_H
    SUBB    A,Dividend_DATA_H
    MOV     Divisor_AND_Residue_H,A
    RET

SUBB_STOP:

    SETB     DIV_FLAG
    RET

    END

相关帖子

沙发
lsqdesign| | 2009-5-1 17:02 | 只看该作者

如果是51还不如直接用除法指令

这么实现除法速度太慢了

使用特权

评论回复
板凳
ztzer|  楼主 | 2009-5-1 19:27 | 只看该作者

回复二楼

除法指令如果实现多个字节的呀?

使用特权

评论回复
地板
ayb_ice| | 2009-5-2 10:10 | 只看该作者

怎么不用寄存器返回数据

再说这年头还有谁用这东西,直接用C了

使用特权

评论回复
5
zhf0964| | 2009-5-2 11:40 | 只看该作者

楼主在程序中最好加上判除数为零的部分。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

94

帖子

1

粉丝