我上个月写的,给你吧
要用TC才能运行
/*只实现了a~z的字符,和该字符数值的打印,数字的打印*/
void myPrintf(char *,...);
main()
{
clrscr();
myPrintf("%c,%d",'a','b'); /*第二个参数位应该是_BP+6*/
}
void myPrintf(char *p,...)
{
int i,j,temp,count,arr[10]; /*数组用于存放1位以上的数字*/
int pOffset=0; /*用于显存的偏移*/
int stackOffset=6; /*用于访问栈中的偏移*/
for(i=0;p[i]!='\0';++i)
{
if(p[i]=='%')
{
if(p[i+1]=='c')
{
j = *(int *)(_BP+stackOffset);
}
else if(p[i+1]=='d')
{
j=(int)*(int *)(_BP+stackOffset);
{
count = 0;
while(j>0)
{
arr[count] = j % 10;
++count;
j = j/10;
}
for(j=count-1;j>=0;--j)
{
*(char far *)(0xb8000000+160*12+80+pOffset+pOffset)=arr[j]+0x30;
*(char far *)(0xb8000000+160*12+81+pOffset+pOffset)=2;
pOffset += 1; /*显存的偏移*/
}
stackOffset += 2;
++i;
continue; /*因上面已执行输出,所以下面不再执行*/
}/*if*/
}
stackOffset += 2; /*读取了栈中一个元素,需要移向下一元素*/
++i; /*为格式字符时,i需要再向前移*/
}
else /*打印字符串中的其它字符*/
{
j=p[i];
/*pOffset += 1;*/
}
*(char far *)(0xb8000000+160*12+80+pOffset+pOffset)=j;
*(char far *)(0xb8000000+160*12+81+pOffset+pOffset)=2;
pOffset += 1; /*显存的偏移*/
}
}