從零寫一個用於裸機程序調試的printf函數
自己寫c語言應用程序的時候,經常會使用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 )