想用IAR的C语言来该问一下LONG型变量的4个Byte,版本是IAR720H的。
最初,按照最直观的写法,用这种方法来进行访问:
(unsigned char)(num)<br />
(unsigned char)(num>>8)<br />
(unsigned char)(num>>16)<br />
(unsigned char)(num>>24)
编译,查看lst文件。what??这是什么呀!!
居然出现了?UL_SHR。
你还真去右移了呢?
接下来,换用第二种方式:
((unsigned char *)&num)[0]<br />
((unsigned char *)&num)[1]<br />
((unsigned char *)&num)[2]<br />
((unsigned char *)&num)[3]
这下,问题更大了。
什么DPTR都来了。这个更夸张。
差点都想自己写汇编算了。
最后经过了许多实验,总算把方法试出来了。
可以定义以下的宏:
#define BYTE0(n) ((unsigned char)(n))<br />
#define BYTE1(n) ((unsigned char)((n)>>8))<br />
#define BYTE2(n) ((unsigned char)(((unsigned short)((n)>>8))>>8))<br />
#define BYTE3(n) ((unsigned char)(((unsigned short)((n)>>16))>>8))
以后就可以直接用BYTE0 ~ BYTE3来进行LONG型变量的按BYTE来访问了。
IAR嵌汇编真是有些危险,尤其是关于堆栈的操作,经常就被“优化”了。
案例一:多中断程序的入口处有压栈保护操作,结果被优化生子程序来进行调用;
案例二:出口的压出栈操作不一样的,也被优化到一起去了。
IAR中要嵌汇编,千万要把优先级调低!
在C51中,KeilC与IAR在函数参数的传递及返回值的处理上,有着较大的不同。本文主要小结不同,并稍稍发表Hanny个人对这些方式的优缺点的看法。
首先,我们对数据类型进行分类。根据数据类型的长度,我们可以将数据简单分为:bit, u8, u16, u32。其中,bit表示位变量;u8主要为char、signed char、unsigned char型变量;u16主要为short、usigned short、int、unsigned int、point型变量;u32主要为long、unsigned long、float型变量。
然后,先介绍一下函数参数的传入。
首先是bit,KeilC采用的是位寻址区的变量来进行bit型参数的传入。而IAR采用的是B寄存器来传入。
接着是u8,KeilC主要采用R7、R5、R3来进行参数的传入。也就是说:当函数的参数为一个时使用R7,两个时使用R7和R5,三个时就使用R7、R5及R3。同样的,IAR主要采用R1、R2、R3、R4、R5来进行u8型参数的传递。
紧接着是u16,KeilC主要采用R6:R7、R4:R5、R2:R3来进行传入,而IAR采用R3:R2、R5:R4来进行传入。
再接着就是u32,KeilC主要采用R4:R7来进行传入,IAR采用R5:R2来进行传入。
最后,KeilC还支持一种叫做通用数据指针的数据类型。主要采用R2:R1、R3来传入。其中,R2:R1存储指针地址,R3存储内存类型。
然后再说说返回值。
返回值为bit时,KeilC与IAR都用C来传出。
返回值为u8时,Keil采用R7,而IAR采用R1。
返回值为u16时,Keil采用R6:R7,而IAR采用R3:R2。
返回值为u32时,Keil采用R4:R7,而IAR采用R5:R2。
下面是Hanny的个人小结:
KeilC的函数传入传出都是秉承KeilC的大端思想,主要用到的寄存器为R7-R2;IAR的函数传入传出是秉承小端思想,主要用到的寄存器为R1-R5。
KeilC函数参数传递的优点是:在从u8向u16、u32扩展时,由于低位所处的寄存器位置不变,扩展时对代码的修改较小。
IAR的优点是:在传入的参数位数为u8时,更紧凑的方式能够传入更多的参数。
相比之下,Hanny更喜欢KeilC这种方式。
最近,Hanny使用了一段时间的IAR,很是郁闷。总结一下IAR的郁闷之旅吧。
首先,就是版本间的兼容问题了。我在机子上同时装了IAR720H和IAR750A,没想到工程却不能互相兼容,720H的工程一旦升级成750的工程后,就不能回来了。这不禁让我想起了VC6和VC.NET的关系。不过VC6和VC.NET还好我们可以建不同版本的工程,然后用不同的方式打开就行了。IAR却不行!我在IAR工程文件的打开方式中添加了两个版本的打开方式,可是每次是都被它自作聪明地改成了一个!唉,现在只能先运行不同版本的IDE,然后再分别打开工程了。烦!
阅读剩余部分...