打印

文不对题,谬之千里,**,贻笑大方

[复制链接]
20699|117
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
天雨粟|  楼主 | 2008-10-19 14:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, dc, ADDC, AN, ov
一个精巧的两字节除法子程序

条件:8个unsigned char型数据相加,高位在R2中,低位在R3中
出口:将此数除以8,余数四舍五入

MOV    A,R2        ;(R2,R3)/8
SWAP    A
RL    A
XCH    A,R3
SWAP    A
RL    A
ADD    A,#80H        ;四舍五入
ANL    A,#1FH
ADDC    A,R3
RET                    ;结果在A中

下面是具体分析:由于被操作数是8个无符号字符型数据相加,固其高位(R2)里D3位及其以上必为0。
现在将其分为三部分别想办法:R2的低四位,R3的高四位,R3的低四位。

将R2的低四位换到高四位,相当于把低四位乘以16,左移一位,又相当于乘以2,则原数被乘以了32。R2的真实意义是(R2)*256,现在我们将其看作一个普通的单字节数,则相当于将其除以了256。先乘以32再除以256,则等于将原数除以8。

将R3的高四位移到低四位,完成除以16,左移一位,相当于乘以2,最终完成除以8。

R3的低四位,其中的D3位,其权值正好为8,通过左移,移到新数的D0位(形成商加1——D3=1时;或不加——D3=0时)。R3的D2~D0位是余数,如为4~7时要五入;如为0~3时要四舍。分析可知,当D2为1时,余数为4~7;D2为0时,余数为0~3。在对R3进行左移操作时,D2已移到最高位,现对移位的结果加#80H,D2为1时,必置位CY,通过ADDC指令加进位形成五入,否则四舍。
ANL A,#1FH,因为R3/8,商的有效位为D4~D0,其它位在运算时要使用,但取结果时必须屏蔽掉。

相关帖子

沙发
hotpower| | 2008-10-19 17:12 | 只看该作者

不算“精巧”吧~~~俺这个要少3条语句~~~

;R2=00000YYY R3=xxxxxXXX
MOV  A,R3;xxxxxXXX
ADD  A,#4;XXX+4 四舍五入(CY)
ANL  A,#0F8H;xxxxx000
ADDC A,R2;xxxxxYYY+CY
SWAP A;xyyyxxxx
RL   A;yyyxxxxx
RET;结果在A中yyyxxxxx

使用特权

评论回复
板凳
天雨粟|  楼主 | 2008-10-19 19:20 | 只看该作者

回hotpower前辈

上程序也是一个前辈写的,我花了一个小时才读懂,自以为至矣尽矣,蔑以加矣,极想与大家分享,没想到还有更精巧的,容我下载下来拜读,感谢您的指导!

使用特权

评论回复
地板
天雨粟|  楼主 | 2008-10-19 20:48 | 只看该作者

以下是我的解读,不知解得对不对,烦前辈指点一二

MOV  A,R3;    
ADD  A,#4;    
;如果R3的D2位为1,相加后向D3有一个进位,D3的权为8
;在以后的处理中会向商的个位加1;
;进行四舍五入调整时形成的进位要加到高八位去
ANL  A,#0F8H;
    ;经上面处理后,就可放心地只取有意义的高五位
    ;低三位清零,高五位全是八的倍数
ADDC A,R2
    ;R2只低三位有意义,刚好拼成一个完整的字节
SWAP A;
RL   A;
    ;对R2的低三位,完成*16*2/256的操作
    ;对R3的高四位完成除以16再乘2的操作
    ;对R3的经过四舍五入后的D3位,移入到最后结果的个位
    ;其权为8,移入个位即形成除以8
RET;

使用特权

评论回复
5
hotpower| | 2008-10-19 22:21 | 只看该作者

只要动脑筋,一切都会“精巧”的~~~长写汇编都如此

在21ic邓苗同志的汇编最精巧~~~

使用特权

评论回复
6
jimoom| | 2008-10-20 11:01 | 只看该作者

汇编的乐趣就在这

使用特权

评论回复
7
天雨粟|  楼主 | 2008-10-20 18:58 | 只看该作者

受教了

汇编如同文言文,C如同白话文。
弄单片机,最高境界还是汇编。
现在弄汇编,基本上也算是复古了,然“文必秦汉,诗必盛唐”,夫岂不然!
现在**做的好的,其实都是文言的底子,
推电子工程师亦如此,C做的好的,汇编必精,汇编是C的底子。

还有多动脑筋学汇编!

使用特权

评论回复
8
hotpower| | 2008-10-20 20:04 | 只看该作者

哈哈~~~20年的功底还不丢人~~~

使用特权

评论回复
9
平常人| | 2008-10-20 21:57 | 只看该作者

LZ的题目太忽悠,这根本不是什么两字节除法子程序

充其量是特定除数的一个移位算法。

使用特权

评论回复
10
红心j| | 2008-10-21 13:45 | 只看该作者

愚认为9楼观点是对的

使用特权

评论回复
11
程序匠人| | 2008-10-21 18:20 | 只看该作者

不具有通用性,换一种汇编语言可能就不行了。

只可把玩,不可入魔。哈哈。

使用特权

评论回复
12
dengm| | 2008-10-21 21:41 | 只看该作者

给一个"等周期" 两字节除法子程序 给lz参考.

;========================================================
; subroutine UDIV16   *** DengMiao 2008-10-21 GuangZhou****
; 16-Bit / 16-Bit to 16-Bit  Unsigned Divide
;
; input:    r1:r0 = Dividend X
;           DPH:DPL = Divisor Y
;
; output:   R5.A = quotient Q of division Q = X / Y
;           R7:R6 = remainder 
;
; alters:   acc, r4, flags
;=======================================================
UDIV16:       
       MOV R7, #0
       MOV R6, #0
       MOV A, R1
       ACALL UDIV16A
       MOV R5, A
       MOV A, R0
;---------------------
UDIV16A:
         MOV R4, #8
UDIV16B: ; R7:R6:A
          RLC A     ;16
          XCH A, R6 ;17
          RLC A     ;1
          XCH A, R7 ;2
          RLC A     ;3 A:R7:R6
          JNC UDIV16E  ;5
            XCH A, R7  ;6
            CLR C      ;7
            SUBB A, DPL;8
            XCH A, R7  ;9
            SUBB A, DPH;10
            CLR C      ;11
            XCH A, R7  ;12
            XCH A, R6  ;13
           DJNZ R4, UDIV16B ;15
           SJMP UDIV16J     ;17

UDIV16C:
          RLC A     ;1
          XCH A, R6 ;2
          RLC A     ;3
          XCH A, R7 ;4
          RLC A     ;5 A:R7:R6

UDIV16E:
          CJNE A, DPH, UDIV16G ;7
            XCH A, R7     ;8
            SUBB A, DPL   ;9
            JC UDIV16F    ;11
              MOV R7, #0  ;12
              SJMP UDIV16I;14
      
UDIV16F:
              ADD A, DPL;12
UDIF16F2:
              XCH A, R6 ;13
             DJNZ R4, UDIV16B ;15
             SJMP UDIV16J     ;17

UDIV16G: 
           XCH A, R7       ;8
           JNC UDIV16H     ;10
             SJMP UDIV16F2 ;12

UDIV16H:
             SUBB A, DPL;11
             XCH A, R7  ;12
             SUBB A, DPH;13
             XCH A, R7  ;14
UDIV16I:
             XCH A, R6  ;15
            DJNZ R4, UDIV16C ;17
UDIV16J:
            RLC A ;18
            CPL A ;19
            RET   ;21
;-----------------------------------------

使用特权

评论回复
13
hotpower| | 2008-10-21 21:44 | 只看该作者

俺总喜欢看邓苗同志的汇编---天书一样的浪漫~~~

使用特权

评论回复
14
hq_y| | 2008-10-21 22:05 | 只看该作者

那个田鼠好久不见了啊

使用特权

评论回复
15
天雨粟|  楼主 | 2008-10-22 00:02 | 只看该作者

谨此谢过!

多年不写**,难道不仅文笔疏松,而且也文不对题了?

看到了一个难解的程序,注释只有了了三条,读通后,自以为其有神鬼莫测之机,不禁手之舞之,足之蹈之,想与大家分享是实,至于忽悠的想法,断不敢存,耿耿此心,天日可鉴!

使用特权

评论回复
16
hotpower| | 2008-10-22 00:17 | 只看该作者

楼主不必介意~~~俺已挑战汇编十余年

在一产品中,93年第1版在4K左右,06年功能增加很多,但无数个版本都是4096

有时为1个字节我需要花费1天甚至几天~~~

实在很晕呀~~~

在21ic俺最敬佩邓苗同志的汇编~~~他一上来就要挑战~~~

估计俺这几行没人再挑战了~~~

;R2=00000YYY R3=xxxxxXXX
MOV  A,R3;xxxxxXXX
ADD  A,#4;XXX+4 四舍五入(CY)
ANL  A,#0F8H;xxxxx000
ADDC A,R2;xxxxxYYY+CY
SWAP A;xyyyxxxx
RL   A;yyyxxxxx
RET;结果在A中yyyxxxxx


不信去问问邓苗同志~~~

使用特权

评论回复
17
hotpower| | 2008-10-22 00:30 | 只看该作者

if (DengMiao==DengMao) printf("俺很惭愧 ");

~~~

使用特权

评论回复
18
linqing171| | 2008-10-22 00:59 | 只看该作者

一个产品能有13年的生命力,难啊。

在一产品中,93年第1版在4K左右,06年功能增加很多,但无数个版本都是4096


真不行就换个8192的单片机吧。

使用特权

评论回复
19
hotpower| | 2008-10-22 01:57 | 只看该作者

虽然芯片已陈旧但软件控制上依然业内领先~~~

这和俺多年的追求大有关系~~~不求最好,但求更好~~~

使用特权

评论回复
20
dengm| | 2008-10-22 11:15 | 只看该作者

hotpower 已登峰造极, 没法挑战!!

;R2=00000YYY R3=xxxxxXXX
MOV  A,R3;xxxxxXXX
ADD  A,#4;XXX+4 四舍五入(CY)
ANL  A,#0F8H;xxxxx000
ADDC A,R2;xxxxxYYY+CY
SWAP A;xyyyxxxx
RL   A;yyyxxxxx
RET;结果在A中yyyxxxxx

使用特权

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

本版积分规则

16

主题

168

帖子

0

粉丝