KEIL C51中3个严重占程序空间的例子,请教解决办法。

2020-01-19 19:38发布

本帖最后由 hzpyl 于 2015-2-10 20:19 编辑

51单片机,总共8K程序,程序容量不够了,
看汇编能不能省程序,发现3个严重占程序空间的例子。
请教解决办法。


============================================================================
实现功能:New_Hour除以10,商给temp_H,余给temp_M

C程序:
        U8 temp_H,temp_M;

        temp_H = New_Hour/10;
        temp_M = New_Hour%10;
        ........


KEIL C51生产汇编:
        MOV        A,040
        MOV        0F0,#00A        ;0F0为B
        DIV        AB
        MOV        R7,A

        MOV        A,040
        MOV        0F0,#00A        ;0F0为B
        DIV        AB
        MOV        R5,0F0        ;0F0为B

最佳:
        MOV        A,040
        MOV        0F0,#00A        ;0F0为B
        DIV        AB
        MOV        R7,A

        MOV        R5,0F0        ;0F0为B
=========================================================================
实现功能:temp高4位与低4位交换,或后给LCD_Buffer[10]

C程序:
        LCD_Buffer[10] |= (temp << 4) | (temp >> 4); ;

KEIL C51生产汇编:
        MOV        R7,A

        SWAP
        ANL        A,#0F0
        MOV        R6,A

        MOV        A,R7
        SWAP
        ANL        A,#0F0

        ORL        A,R6
        ORL        036,A

最佳:
        SWAP
        ORL        036,A
============================================================================
实现功能:4字节带C左移

C程序:
        YK_Data[3] = YK_Data[3]<<1;               
        if( (YK_Data[2] & 0x80)!=0 )
        {
                YK_Data[3] ++;
        }

        YK_Data[2] = YK_Data[2]<<1;
        if( (YK_Data[1] & 0x80)!=0 )
        {
                YK_Data[2] ++;
        }

        YK_Data[1] = YK_Data[1]<<1;
        if( (YK_Data[0] & 0x80)!=0 )
        {
                YK_Data[1] ++;
        }

        YK_Data[0] = YK_Data[0]<<1;
        if( b_c ==1 )
        {
                YK_Data[0] ++;
        }

这个论坛上好像讨论过,不知道有没有好办法?

论坛真是卧虎藏龙。
莫老大:我愿意每个问题给30莫元,以表谢意。
        第1个问题给7楼。
        第2个问题继续。
        第3个问题给11楼。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
24条回答
takashiki
2020-01-20 15:35
最简单的办法自然是提高优化等级,比如11级优化,Code优先。找不到11级优化的,自己将每一个可以打钩的地方都试一遍。
其次是换单片机。
再次是调用汇编。
再次是嵌入汇编。为什么这是个比上一个次一些呢,是嵌入汇编有一定的局限性,有时很可恶。
再次是直接访问特殊寄存器,产生不可预知的后果做到自己心中有数。Keil C51的优化能力也就那样了,抱怨是没有用的。
第一个:
  1. U8 temp_H,temp_M;
  2.         temp_H = New_Hour/10;
  3.         temp_M = New_Hour%10;
复制代码修改成这个,你自己看看反汇编:
  1. U8 temp_H,temp_M;

  2.         temp_H = New_Hour/10;
  3.         temp_M = B;
复制代码

第二个:除了调用汇编外,没有好办法。

第三个:那么简单,你居然折腾的那么复杂……你觉得直接对unsigned long左移或循环左移不行吗

一周热门 更多>