. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->综合研究
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  综合研究:研究实验5 实现一个printf(%c %d)  [待解决] 回复[ 4次 ]   点击[ 507次 ]  
chichangjing
[帖 主]   [ 发表时间:2012-08-27 13:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-08-27 13:18
typedef char * va_list;
#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap)      ( ap = (va_list)0 )
void myputchar(char c);
void number_to_char_printf(int num);
void myprintf(char *,...);   
main()   
{   char c='a';
        int b=100;
        myprintf("this is my test %c %d",c,b);
}   
void myprintf(char * format,...)   
{   
        va_list ap;
        char c;
        va_start(ap,format);

        while(c=*format++){
                switch(c){
                        case '%': {
                                switch(*format++){

                                        /*可以添加%c的格式打印,你懂的,自己实现吧*/
                                        case 'c':{
                                                char ch = va_arg(ap , int);
                                                myputchar (ch);
                                                break;
                                        }
                                        /*可以添加%d的格式打印,你懂的,自己实现吧*/
                                        case 'd':{
                                                int num= va_arg(ap,int);
                                                number_to_char_printf(num);
                                                break;
                                        }
                                        /*如果不是%d和%c的格式,直接打印%字符*/
                                        default:{
                                                myputchar (c);
                                                break;
                                        }
                                        }
                                break;
                                        
                        }
                                                
                        default:myputchar(c);
                }
                
        }
        va_end(ap);
}

/******************************************************************
number_to_char_printf:
        把一个整型类型的数转化成字符类型,储存
        在numchar数组里,然后把numchar数组里的
        字符串打印到终端。
输入:
        num 一个int型变量
输出:
        没有 
返回值类型:
        无返回值

*******************************************************************/

void number_to_char_printf(int num)
{
        char numchar[5];
        int temp=num,n=0;
        while(temp){
                numchar[n++]=temp%10+'0';
                temp=temp/10;
        }
        n--;
        do{
        myputchar(numchar[n--]);
        }while(n+1);
}

/******************************************************************
myputchar:
        把字符打印到终端。
输入:
        c 一个char型变量
输出:
        没有 
返回值类型:
                        无返回值

*******************************************************************/

void myputchar(char c)
{
        static int position=0;
        while(1){
         *(char far *)(0xb8000000+160*10+80+2*position)=c;
         position++;
         break;
        }
}
chichangjing
[第1楼]   [ 回复时间:2012-08-27 13:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-08-27 13:18
自己实现了一下和大家分享一下吧,编的不太好
chichangjing
[第2楼]   [ 回复时间:2012-08-27 15:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-08-27 13:18
/******************************************************************
                                                        类型定义
*******************************************************************/

typedef char * va_list;

/******************************************************************
                                                        可变参数的宏定义
*******************************************************************/

#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap)      ( ap = (va_list)0 )


/*****************************************************************
                                                        函数声明
*******************************************************************/

void myputchar(char c);
void number_to_char_printf(int num);
void myprintf(char *,...); 
int location(int arow,int row) ; 

/*****************************************************************
                                                        全局变量
******************************************************************/
int arow=10,row=80;/*定位从arow行row列开始打印,基地址从0xb8000000开始*/
int position=0;/*记录目前打印到终端的个数,*/


/*****************************************************************
                                                        主程序main人口
*******************************************************************/

main()   
{   char c='?',a[6]="test";
        int b=100;
        myprintf("%%%**** this is my %s %c number is %d %%%",a,c,b);
}  
 
void myprintf(char * format,...)   
{   
        va_list ap;
        char c;
        va_start(ap,format);

        while(c=*format++){
                switch(c){
                /*可以添加%的格式打印*/
                        case '%': {
                        
                                        switch(*format){

                                                /*可以添加%c的格式打印*/
                                                case 'c':{
                                                        
                                                        char ch = va_arg(ap , int);
                                                        myputchar (ch);
                                                        format++;
                                                        break;
                                                }
                                                
                                                /*可以添加%d的格式打印*/
                                                case 'd':{
                                                        
                                                        int num= va_arg(ap,int);
                                                        number_to_char_printf(num);
                                                        format++;
                                                        break;
                                                }
                                                
                                                /*可以添加%s的格式打印,*/
                                                case 's':{
                                                
                                                        char * ch= va_arg(ap,int);
                                                        myputs(ch);
                                                        format++;
                                                        break;
                                                }
                                                
                                                /*可以添加%f的格式打印,你懂的,自己实现吧*/
                                                case 'f':{
                                                }
                                                
                                                /*如果不是匹配格式,直接打印%字符*/
                                                default:{
                                                        myputchar (c);
                                                        break;
                                                }
                                                
                                                }
                                        break;
                                                
                                }
                        /*是不是制表符*/
                        case '\t': {
                        }
                        /*是不是回车,你懂的,自己实现吧*/
                        case '\n': {
                        }
                                                
                        default:myputchar(c);
                }
                
        }
        va_end(ap);
}

/******************************************************************
number_to_char_printf:
        把一个整型类型的数转化成字符类型,储存
        在numchar数组里,然后把numchar数组里的
        字符串打印到终端。
输入:
        num 一个int型变量
输出:
        没有 
返回值类型:
        无返回值

*******************************************************************/

void number_to_char_printf(int num)
{
        char numchar[5];
        int temp=num,n=0;
        while(temp){
                numchar[n++]=temp%10+'0';
                temp=temp/10;
        }
        n--;
        do{
        myputchar(numchar[n--]);
        }while(n+1);
}
/******************************************************************
myputchar:
        打印一个字符串,把字符打印到终端。
输入:
        c 一个char *型变量
输出:
        没有 
返回值:
                返回字符串的个数n

*******************************************************************/

int myputs(char * c)
{
        int n=0;
        for(;*c!=0;c++){
                myputchar(*c);
                n++;
        }
        return n;
}




/******************************************************************
myputchar:
        打印一个字符,把字符打印到终端。
输入:
        c 一个char型变量
输出:
        没有 
返回值类型:
                        无返回值

*******************************************************************/

void myputchar(char c)
{
        int pos=location(arow,row);
        while(1){
         *(char far *)(0xb8000000+pos+2*position)=c;
         position++;
         break;
        }
}
/******************************************************************
location:
        定位要把字符打印到终端的行与列。
输入:
        arow 行号
        row 列号
输出:
        没有 
返回值类型:
                        无返回值

*******************************************************************/
int location(int arow,int row)
{
        return 160*arow+row;
}
chichangjing
[第3楼]   [ 回复时间:2012-08-27 16:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-08-27 13:18
重新整理了一下
chichangjing
[第4楼]   [ 回复时间:2012-08-27 16:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-08-27 13:18
可变参数的参考资料:http://wenku.baidu.com/view/b3d5bb63ddccda38376bafff.html
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved