jz2440学习笔记——自己动手写printf函数

这部分是和jz2440的uart串口通信想关联的一个实验。看完视屏、结合网上的博客,总结以下知识点。
1.printf函数原型:int printf(const char format, …);
const char
format 是个静态字符串常量,…是可变参数。可变参数不限个数、类型。
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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值