zoukankan      html  css  js  c++  java
  • 自己动手从零写一个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 )




    版权声明:本文为博主原创文章,转载请注明文章来源,有需要帮忙可加QQ:871263854
  • 相关阅读:
    运算符
    java--有关前台展示图片流的用法
    TortoiseSVN--Subversion客户端使用详解及问题解决
    SVN 文件的解锁方法
    JDBC中获取数据表的信息
    tomcat配置文件解决乱码问题
    正则表达式常用匹配
    Java:如何选择最为合适的Web开发框架
    键盘enter事件 兼容FF和IE和Opera
    PayPal 支付接口详解
  • 原文地址:https://www.cnblogs.com/Dream998/p/8540605.html
Copyright © 2011-2022 走看看