自己動手從零寫一個printf函數


 

從零寫一個用於裸機程序調試的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 )





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM