搜索
bottom↓
回复: 5

菜鸟弱问:10个16位输相加再除以10的运算(汇编)给个思路。因AVR没有除法运算指令

[复制链接]

出0入0汤圆

发表于 2006-10-24 12:21:23 | 显示全部楼层 |阅读模式
右移只能除以2、4、8、16.....

以前看到过讨论AVR没有除法运算指令的贴子,翻了好久没找着(这样的弱问题分类查找里肯定是不会有这一类的)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2006-10-24 18:05:37 | 显示全部楼层
用C写个程序,然后看汇编。

-----此内容被mxxdd_muc于2006-10-24,18:06:05编辑过



-----此内容被mxxdd_muc于2006-10-24,18:07:01编辑过


-----此内容被mxxdd_muc于2006-10-24,18:10:41编辑过

出0入0汤圆

发表于 2013-9-29 15:20:42 | 显示全部楼层
;===================乘法宏定义
;32BIT 乘法  Multiplicaton
;功能:  32BIT*32BIT=64bit
;入口: 被乘数 = NUM_A1,NUM_A0,
;                                乘数          = NUM_B1,NUM_B0,
;出口: 积     = NUM_D1,NUM_D0,NUM_C1,NUM_C0
;16bit                                 
MUL_RRC:;page3
        BANK_2
        CLR                        COUNT_JSQ
        BS                        COUNT_JSQ,0X04                ;16       
        ALLCLR        NUM_D1,NUM_D0,NUM_C1,NUM_C0
MUL_32_32_LP:
        ALLRRC        NUM_B1,NUM_B0                                                ;乘数带C
        JBS                        R3,C                                                                    ;C=0,跳
        JMP                        MUL_32_32_LP1
        MOV                        A,NUM_A0
        ADD                        NUM_D0,A
        ADDC                NUM_D1,NUM_A1
MUL_32_32_LP1:
        ALLRRC        NUM_D1,NUM_D0
        ALLRRC        NUM_C1,NUM_C0
        DJZ                        COUNT_JSQ
        JMP                        MUL_32_32_LP
        RET                       
;====================除法宏定义
;入口:
;         被除数  =  NUM_A3,NUM_A2,NUM_A1,NUM_A0
;  除数          =  NUM_B3,NUM_B2,NUM_B1,NUM_B0         
;出口:
;                商     =  NUM_C3,NUM_C2,NUM_C1,NUM_C0               
;         余数   =  NUM_D3,NUM_D2,NUM_D1,NUM_D0               
DIV_RLC:;page3
        BANK_2
        CLR                        COUNT_JSQ
        BS                        COUNT_JSQ,0X05                                ;32
        MOV                        NUM_B3,NUM_B3
        JBS                        R3,Z
        JMP                        DIV_RLC_0
        MOV                        NUM_B2,NUM_B2
        JBS                        R3,Z
        JMP                        DIV_RLC_0
        MOV                        NUM_B1,NUM_B1
        JBS                        R3,Z
        JMP                        DIV_RLC_0
        MOV                        NUM_B0,NUM_B0
        JBS                        R3,Z
        JMP                        DIV_RLC_0
        JMP                        DIV_ERR
DIV_RLC_0:       
        ALLCLR        NUM_C3,NUM_C2,NUM_C1,NUM_C0
        ALLCLR        NUM_D3,NUM_D2,NUM_D1,NUM_D0                       
;======除数不为0
DIV_32_32_LP:               
        ALLRLC        NUM_A3,NUM_A2,NUM_A1,NUM_A0
        ALLRLC        NUM_D3,NUM_D2,NUM_D1,NUM_D0       
;==试商
        JBC                        R3,C
        JMP                        DIV_32_32_LP1
        SIZE_COMP                NUM_D3,NUM_D2,NUM_D1,NUM_D0,NUM_B3,NUM_B2,NUM_B1,NUM_B0
        JBS                        R3,C
        JMP                        DIV_32_32_LP2
;        BC                        R3,C
DIV_32_32_LP1:
        MOV                        A,NUM_B0
        SUB                        NUM_D0,A
        SUBC                NUM_D1,NUM_B1
        SUBC                NUM_D2,NUM_B2
        SUBC                NUM_D3,NUM_B3
        BS                        R3,C       
DIV_32_32_LP2:
        ALLRLC        NUM_C3,NUM_C2,NUM_C1,NUM_C0
        DJZ                        COUNT_JSQ
        JMP                        DIV_32_32_LP
        BC                        R3,C
        JMP                        DIV_RLC_OUT
DIV_ERR:                                                        ;溢出(除数=0)处理
        MOV                A,@0XFF
        MOV                NUM_C3,A
        MOV                NUM_C2,A
        MOV                NUM_C1,A
        MOV                NUM_C0,A
       
        MOV                NUM_D3,A
        MOV                NUM_D2,A
        MOV                NUM_D1,A
        MOV                NUM_D0,A
        BS                R3,C
DIV_RLC_OUT:
        RET

出0入0汤圆

发表于 2013-9-29 15:21:22 | 显示全部楼层

;======ADDC
ADDC                        Macro                        NUM_D1,NUM_A1
        JBC                R3,C
        JMP                MUL_ADDC_0
        MOV                A,NUM_A1
        ADD                NUM_D1,A               
        JMP                MUL_ADDC_1
MUL_ADDC_0:
        MOV                A,NUM_A1
        ADD                NUM_D1,A       
        INC                NUM_D1       
MUL_ADDC_1:
        EndM
;=======SUBC       
SUBC                 Macro                NUM_D1,NUM_B1
        JBS                R3,C
        JMP                $+4
        MOV                A,NUM_B1
        SUB                NUM_D1,A
        JMP                $+5
        MOV                A,NUM_B1
        SUB                NUM_D1,A
        MOV                A,@0X01
        SUB                NUM_D1,A
        EndM
       
;======
ALLRRC                Macro                        NUM_D1,NUM_D0
        RRC                NUM_D1
        RRC                NUM_D0
        EndM
ALLRLC                Macro                  NUM_A3,NUM_A2,NUM_A1,NUM_A0
        RLC                NUM_A0
        RLC                NUM_A1       
        RLC                NUM_A2
        RLC                NUM_A3
        EndM       
ALLCLR                Macro                NUM_C3,NUM_C2,NUM_C1,NUM_C0
        CLR                NUM_C3
        CLR                NUM_C2
        CLR                NUM_C1
        CLR                NUM_C0
        EndM               


SIZE_COMP                Macro                NUM_D3,NUM_D2,NUM_D1,NUM_D0,NUM_B3,NUM_B2,NUM_B1,NUM_B0
        MOV                A,NUM_D3
        MOV                RTMP_MAC,A
        MOV                A,NUM_B3
        SUB                A,RTMP_MAC
        JBS                R3,C
        JMP                COMP_Small
        JBS                R3,Z
        JMP                COMP_LARGE
       
        MOV                A,NUM_D2
        MOV                RTMP_MAC,A
        MOV                A,NUM_B2
        SUB                A,RTMP_MAC
        JBS                R3,C
        JMP                COMP_Small
        JBS                R3,Z
        JMP                COMP_LARGE       
               
        MOV                A,NUM_D1
        MOV                RTMP_MAC,A
        MOV                A,NUM_B1
        SUB                A,RTMP_MAC
        JBS                R3,C
        JMP                COMP_Small
        JBS                R3,Z
        JMP                COMP_LARGE       
       
        MOV                A,NUM_D0
        MOV                RTMP_MAC,A
        MOV                A,NUM_B0
        SUB                A,RTMP_MAC
        JBS                R3,C
        JMP                COMP_Small
        JBS                R3,Z
        JMP                COMP_LARGE               
;        JMP                COMP_LARGE
COMP_LARGE:
        BS                R3,C
        JMP                SIZE_COMP_OUT
COMP_Small:
        BC                R3,C
        JMP                SIZE_COMP_OUT       
SIZE_COMP_OUT:
        EndM       

出0入0汤圆

发表于 2013-9-29 15:25:06 | 显示全部楼层
32 位乘除  义隆单片机

根据  匠人手记  里的算法 写的

出0入0汤圆

发表于 2013-9-29 15:40:43 | 显示全部楼层
挖得深。。。                                                                                                                                          
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表