这部分是和jz2440的uart串口通信想关联的一个实验。看完视屏、结合网上的博客,总结以下知识点。
1.printf函数原型:int printf(const char format, …);
const charformat 是个静态字符串常量,…是可变参数。可变参数不限个数、类型。
2.调用printf函数时,format及可变参数被顺序保存在栈中,因此在已知format变量的地址时,可以通过指针+偏移量来访问其他的参数,这也是printf函数实现的本质。
3.printf函数的参数在入栈时,是从右到左进行的,而且不论是x86平台还是arm平台,高地址默认为栈底,低地址默认为栈顶。可由下图代码说明。
当程序将test函数的参数入栈时,先执行了pirintf(“b\n”),后执行printf(“a\n”),即从右向左入栈。这样做是为了方便程序利用偏移量来访问内存,因为第一个变量format的地址是已知且确定的。
4.在x86平台下,用gcc编译器编译代码时,所有的变量都是以四字节对齐的,比如char虽然只用了一个字节,但实际分配的还是4字节。
5逗号表达式,(xxx,ooo),表达式会做xxx、ooo这两件事,并且返回ooo。这是用宏定义代替手动指定指针偏移时碰到的一个知识点。
6 char * p;
p++;
p+=sizeof(char*);
这里p++和p+=sizeof(char*)是不同的,前者等价于p+=sizeof(char)。