本帖最后由 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楼。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#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
CY是51自身的进位标志位,不要另定义bit CY(不然会多出你上面的代码)
一周热门 更多>