本帖最后由 sjc_sugar 于 2012-8-1 18:40 编辑
一个学弟刚学习单片机,代码出现一点问题,帮他调试下,这一调试,变发现一个奇怪的现象,发表下,大家共同分析下:
#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code sz1[]="AT+CMGF=1\x0d\x0a";
uchar code sz2[]="AT+CMGS=\"15716591375\"\x0d\x0a";
uchar code sz3[]="Hello,nihao\x1a";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void fasong(uchar dat)
{
SBUF=dat;
while(!TI);
TI=0;
}
void main()
{
uchar i=0;
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
EA=1;
ES=0;
TR1=1;
while(sz1!='\0')
{
fasong(sz1);
i++;
delay(5);
}
delay(1000);
i=0;
while(sz2!='\0')
{
fasong(sz2);
i++;
delay(5);
}
delay(1000);
i=0;
while(sz3!='\0')
{
fasong(sz3);
i++;
delay(5);
}
delay(1000);
while(1);
}
调试发现,进入蓝色部分,程序不规则跳转,先跳到delay(5)但是不执行;然后跳到fasong()函数,然后跳到while(1),最后执行delay(5)延时;完了后发送第二个字符;更怪异的是,将uchar该为int类型,程序跳转正常,但生成的code多了50byte,大家一起分析下哈,看看反汇编是怎么跑的!
这是添加截图:希望大家可以帮忙分析下,共同进步!
8级优化,只将uchar改为int后的结果。 |