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楼。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
hzpyl
1楼-- · 2020-01-21 14:10
本帖最后由 hzpyl 于 2015-2-10 14:32 编辑

#define        rlcx(X)        ACC=(X),CY=(bit)((X)&0x80),(X)=ACC     //产生 RLC X 指令,MOV A,X; RLC A; MOV X,A

//==================================================================
void YK_Data_in_bit(bit b_c)
{
        bit        CY;

        CY = b_c;
        rlcx(YK_Data[0]);
        rlcx(YK_Data[1]);
        rlcx(YK_Data[2]);
        rlcx(YK_Data[3]);

============================================================

  38: void YK_Data_in_bit(bit b_c)
    39: {
    40:         bit     CY;
    41:  
    42:         CY = b_c;
C:0x180B    A210     MOV      C,0x22.0
C:0x180D    9211     MOV      0x22.1,C
    43:         rlcx(YK_Data[0]);
C:0x180F    E523     MOV      A,YK_Data(0x23)
C:0x1811    33       RLC      A
C:0x1812    9211     MOV      0x22.1,C
C:0x1814    F523     MOV      YK_Data(0x23),A
    44:         rlcx(YK_Data[1]);
C:0x1816    E524     MOV      A,0x24
C:0x1818    33       RLC      A
C:0x1819    9211     MOV      0x22.1,C
C:0x181B    F524     MOV      0x24,A
    45:         rlcx(YK_Data[2]);
C:0x181D    E525     MOV      A,0x25
C:0x181F    33       RLC      A
C:0x1820    9211     MOV      0x22.1,C
C:0x1822    F525     MOV      0x25,A
    46:         rlcx(YK_Data[3]);
C:0x1824    E526     MOV      A,0x26
C:0x1826    33       RLC      A
C:0x1827    9211     MOV      0x22.1,C
C:0x1829    F526     MOV      0x26,A

程序可以。
但每句多了一个MOV      0x22.1,C
funnybow
2楼-- · 2020-01-21 19:08
4字节带C左移
modbus
3楼-- · 2020-01-21 22:14
使用联合并把变量定义在BDATA区,先32位左移,然后再把CY送给最低字节的最低位
BXAK
4楼-- · 2020-01-22 02:31
hzpyl 发表于 2015-2-10 14:30
#define        rlcx(X)        ACC=(X),CY=(bit)((X)&0x80),(X)=ACC     //产生 RLC X 指令,MOV A,X; RLC A; MOV X,A

/ ...

CY是51自身的进位标志位,不要另定义bit CY(不然会多出你上面的代码)
hzpyl
5楼-- · 2020-01-22 02:57
 精彩回答 2  元偷偷看……
wangyu_2011
6楼-- · 2020-01-22 05:53
汇编都知道怎么写了,就直接嵌汇编不就完事了。_asm

一周热门 更多>