Keil C51编程实践
--版主 老古 http://www.laogu.com

(一)限制参数范围



两个子程序send_string ,send_string2 的功能都是向串口发送一个字符串,遇到字符0x00结束。
两个程序在编译之后的大小就不同了。

 

我们来看编译结果:


这是参数的传递过程,send_string传递了两个字节的参数到R6,R7

而send_string2传递了3个参数 R3,R2,R1
再看函数的执行过程:



这是send_string的执行过程,程序很短,只有不到10行的汇编代码。
但是send_string2就不同了:


还调用一个一个子函数C?CLDPTR:

子函数是一个指针加一的函数。

我们看到上面的结果,send_string比send_string2简短很多,为什么?

因为send_string的参数unsigned char code *string
而send_string2的参数unsigend char *string
关键字code起了很大的作用,而没有使用code定义的*string,说明指针是一般类型,可以指向代码空间,内部ram 空间或外部ram空间。
而用code定义的*string,限制指针的类型为指向代码空间。因此只对代码空间起作用。如果我们的程序只是指向代码空间,而没有指向其他空间,那么使用code来限制它。将使程序大为优化。

如果要指向外部ram空间可以这样定义:
void send_string(unsigned char xdata *string)
指向内部ram 空间,这样定义:
void send_string(unsigned char data *string)
程序代码都将会得到优化,执行的速度快和代码小。