⾃⼰动⼿从零写⼀个printf函数
从零写⼀个⽤于裸机程序调试的printf函数
⾃⼰写c语⾔应⽤程序的时候,经常会使⽤printf来打印。
printf在是⼀个标准库函数,功能是:打印(变量、字符串)等等。
函数printf问题:能不能依据printf的原理,写⼀个简易的⽤于裸机程序调试的my_printf函数呢?
好处:1)my_printf函数在单⽚机、嵌⼊式芯⽚裸机调试过程中⾮常⽅便。
2)my_printf函数可以帮你打印寄存器的值、变量的值、打印字符串等。
//====================================================
printf的声明
int printf(const char *format, ...);
format:固定参数
.
.. :可变参数(变参)
printf中的格式字符
//====================================================
可变参数
1)c语⾔指针的复习
2)代码:⼿⼯确定可变参数
3)代码:⾃动确定可变参数
#include <stdarg.h>
va_list p;
va_start(p,fmt );
va_arg( p, int);
va_end( p );
vc6.0中的stdarg.h
typedef char * va_list;
//当sizeof(n)=1/2/4时,_INTSIZEOF(n)等于4
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
/*
va_start(p, format ) ( p = (char *)&format + _INTSIZEOF(format) )
( p = (char *)&format + _INTSIZEOF(char *) )
( p = (char *)&format + 4 )
*/
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_arg(ap,t) (ap = ap + _INTSIZEOF(t), *(t *)(ap - _INTSIZEOF(t)))
#define va_arg(ap,t) (*(t *)(ap = ap + _INTSIZEOF(t), ap - _INTSIZEOF(t)))
/*
#define va_end(ap) ( ap = (char *)0 )
*/
#define va_end(ap) ( ap = (va_list)0 )