打印
[STC单片机]

51单片机汇编语言计算的问题

[复制链接]
841|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小小子他爹|  楼主 | 2017-1-6 18:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
A51汇编运算 2000H/2,或除以4结果都正确;2000H/3、2000H/6和 2000H/8结果不正确,
2000H/6H=1310(十进制)正确答案应该是1365
2000H/8H =9472                               1024
2000H/3H=2621                                 2730

什么原因?

相关帖子

沙发
资深技术| | 2017-1-6 22:16 | 只看该作者
只有一个可能,语句有误

使用特权

评论回复
板凳
ningling_21| | 2017-1-7 09:17 | 只看该作者
要看程序怎么写
X/8 相当于右移3位

使用特权

评论回复
地板
linqing171| | 2017-1-7 21:44 | 只看该作者
贴代码吧,高位和低位都有计算不正确的。
附keil的除法库。

C?UIDIV:                               
                CJNE        R4,#0x00,UIDIV_U8_16       
                CJNE        R6,#0x00,UIDIV_U16_16       
                MOV        A,R7       
                MOV        B,R5       
                DIV        AB       
                MOV        R7,A       
                MOV        R5,B       
                RET               
        UIDIV_U8_16:                       
                CLR        A       
                XCH        A,R4       
                MOV        R0,A       
                MOV        B,#0x08       
        UIDIV_U8_16_loop:                       
                MOV        A,R7        ;R6R7保存被除数和结果,逐位左移。
                ADD        A,R7       
                MOV        R7,A       
                MOV        A,R6       
                RLC        A       
                MOV        R6,A       
                MOV        A,R4       
                RLC        A       
                MOV        R4,A       
                MOV        A,R6       
                SUBB        A,R5       
                MOV        A,R4       
                SUBB        A,R0       
                JC        UIDIV_U8_16_NotAddOne       
                MOV        R4,A       
                MOV        A,R6       
                SUBB        A,R5       
                MOV        R6,A       
                INC        R7       
        UIDIV_U8_16_NotAddOne:                       
                DJNZ        B,UIDIV_U8_16_loop       
                CLR        A       
                XCH        A,R6       
                MOV        R5,A       
                RET               
        UIDIV_U16_16:                       
                MOV        A,R5       
                MOV        R0,A       
                MOV        B,A       
                MOV        A,R6       
                DIV        AB       
                JB        OV,UIDIV_U16_16_End       
                MOV        R6,A       
                MOV        R5,B       
                MOV        B,#0x08       
        UIDIV_U16_16_Loop:                       
                MOV        A,R7       
                ADD        A,R7       
                MOV        R7,A       
                MOV        A,R5       
                RLC        A       
                MOV        R5,A       
                JC        UIDIV_U16_16_Big1       
                SUBB        A,R0       
                JNC        UIDIV_U16_16_Big2       
                DJNZ        B,UIDIV_U16_16_Loop       
                RET               
        UIDIV_U16_16_Big1:                       
                CLR        C       
                SUBB        A,R0       
        UIDIV_U16_16_Big2:                       
                MOV        R5,A       
                INC        R7       
                DJNZ        B,UIDIV_U16_16_Loop       
        UIDIV_U16_16_End:                       
                RET               

使用特权

评论回复
5
xxdcq| | 2017-1-8 11:59 | 只看该作者
本帖最后由 xxdcq 于 2017-1-8 12:02 编辑

你那个又臭又长!
给你一个,经常用到的,绝对正确
;被除数在r2,r3,r4,r5中,除数在r6,r7中,三字节商在r3,r4,r5中,余数在r1,r2
divq:
                mov        b,#24
                mov        r1,#00h
divq1:
                clr        c
                mov        a,r5
                rlc        a
                mov        r5,a
                mov        a,r4
                rlc        a
                mov        r4,a
                mov        a,r3
                rlc        a
                mov        r3,a
                mov        a,r2
                rlc        a
                mov        r2,a
                mov        a,r1
                rlc        a
                mov        r1,a
                mov        f0,c                                ;保存溢出位
                mov        a,r2
                clr        c
                subb        a,r7
                mov        r0,a
                mov        a,r1
                subb        a,r6
                anl        c,/f0                                ;结果判断
                jc        divq2
                mov        r1,a                                ;够减,存放新的余数
                mov        a,r0
                mov        r2,a
                inc        r5
divq2:
                djnz        b,divq1                                ;计算完24位商
                ret

使用特权

评论回复
6
NE5532| | 2017-1-9 11:02 | 只看该作者
汇编尽量不要去除任意数,除2的倍数比较好,移位就做了。实在要除的,想办法把数据丢给上位机去做。

使用特权

评论回复
7
ayb_ice| | 2017-1-9 11:08 | 只看该作者
估计是参数没传递正确

使用特权

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

本版积分规则

22

主题

53

帖子

0

粉丝