打印

请教C51高手

[复制链接]
2086|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ayb_ice|  楼主 | 2008-2-26 14:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C51, ov, vr, ce, rc

请教C51高手
下面程序在输出显示时经常使用到

void main(void)
{
    unsigned int a,b,x,y;

    x = 1000;
    y = 40;
    a = x/y;
    b = x%y;

    while(1);
}


被KEIL C51编译如下汇编代码
其中两次调用?C?UIDIV库函数进行除法运算分别获取商和余数,
这样浪费太多的CPU时间,
但其实只要调用一次就可以获取商和余数,请问有没有什么方法
只一次就可以的,用C怎么写...

; void main(void)

    RSEG  ?PR?main?MAIN
main:
    USING    0
            ; SOURCE LINE # 64
; {
            ; SOURCE LINE # 65
;     unsigned int a,b,x,y;

;     x = 1000;
            ; SOURCE LINE # 68
;---- Variable 'x?042' assigned to Register 'R2/R3' ----
;     y = 40;
            ; SOURCE LINE # 69
;---- Variable 'y?043' assigned to Register 'DPTR' ----
    MOV      DPTR,#028H
;     a = x/y;
            ; SOURCE LINE # 70
    MOV      R7,#0E8H
    MOV      R6,#03H
    MOV      R5,DPL
    MOV      R4,DPH
    LCALL    ?C?UIDIV
    MOV      a?040,R6
    MOV      a?040+01H,R7
;     b = x%y;
            ; SOURCE LINE # 71
    MOV      R6,DPH
    MOV      R7,DPL
    MOV      R4,#03H
    MOV      R5,#0E8H
    XCH      A,R7
    XCH      A,R5
    XCH      A,R7
    XCH      A,R6
    XCH      A,R4
    XCH      A,R6
    LCALL    ?C?UIDIV
    MOV      b?041,R4
    MOV      b?041+01H,R5
?C0001:

;     while(1);
            ; SOURCE LINE # 73
    SJMP     ?C0001
; END OF main

    END

相关帖子

沙发
sz_kd| | 2008-2-26 15:03 | 只看该作者

不知道,估计要试

使用特权

评论回复
板凳
mohanwei| | 2008-2-26 15:09 | 只看该作者

显示本身周期就比较长,没必要优化这点代码的。

把编译优化设置为9即可

使用特权

评论回复
地板
happystar| | 2008-2-26 19:00 | 只看该作者

我也想不出来,帮你顶顶吧

使用特权

评论回复
5
hotpower| | 2008-2-26 19:11 | 只看该作者

哈哈~~~俺是菜鸟...b=x-a*y;

使用特权

评论回复
6
dld2| | 2008-2-26 19:14 | 只看该作者

是喽,乘法比除法划算

使用特权

评论回复
7
happystar| | 2008-2-26 20:16 | 只看该作者

晕!hotpower强啊,我怎么没想到呢,佩服呀。

使用特权

评论回复
8
hotpower| | 2008-2-26 20:27 | 只看该作者

哈哈~~~俺是菜鸟~~~比DSP的优化差多了~~~

使用特权

评论回复
9
qjy_dali| | 2008-2-26 23:25 | 只看该作者

呵呵,看来有时候还是要把写法改改

使用特权

评论回复
10
ayb_ice|  楼主 | 2008-2-27 09:11 | 只看该作者

hotpower的方法有点创意

确实比求余要高效,但毕竟也要调用库函数,我这里只是个例子,实际可能是有符号32,64位数的求商,求余,这种方法效率还是比较低,应该有更高效的方法。。。

使用特权

评论回复
11
ljh2269| | 2008-2-27 09:36 | 只看该作者

用减法执行效率可能会更好

使用特权

评论回复
12
hotpower| | 2008-2-27 23:00 | 只看该作者

倒塌了~~~这本身是个小学题,只是优化是问题~~~

使用特权

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

本版积分规则

222

主题

15450

帖子

34

粉丝