我正在为引导加载程序创建自己的prinf()我正在处理类分配,这意味着我必须使用BCC编译器,并且我不能使用系统库因为它们不存在。我有能力使用在汇编中设计的putc()函数,并且字符串库函数strcmp等可以根据需要帮助我。Linux C创建无头文件库的自定义printf函数
我似乎遇到了逻辑问题。
如果我在Linux(CC)编译测试文件定义该:
int a = 0;
int b = 1;
int i1 = 0;
int i2 = 1;
unsigned long x = 42949672;
printf("\nHI! :%d: :%d: :%d: :%d: :%d: :%d:\n", x,a,b,i1,i2,x);
我可以运行./a.out和我接收HI! :42949672: :0: :1: :0: :1: :42949672:
这是正确的。
我创建了自己的printf函数,当我看到打印的东西时,我看到HI! :23592: :655: :0: :1: :0: :1:
,这是不正确的。我试过仅用整数打印并且工作正常,但是当我尝试打印未签名的长整型时,我遇到了问题。
这里是我的代码:
void prints(s) char *s;
{
int i;
for(i=0; i<strlen(s); i++)
putc(s[i]);
}
void gets(s) char *s;
{
//LEC9.pdf
while((*s=getc()) != '\r')
{
putc(*s++);
}
*s = '\0';
}
//EXAMPLE CODE
char *ctable = "ABCDEF";
int rpi(x, BASE) unsigned long x; int BASE;
{
char c;
if (x)
{
c = ctable[x % BASE];
rpi(x/BASE, BASE);
putc(c);
}
return 0;
}
void printc(ip) unsigned long;
{
putc(ip);
}
int printd(ip) unsigned long;
{
if(ip < 0)
{
putc('-');
ip = -ip;
}
if(ip == 0)
{
putc('0');
return 0;
}
rpi(ip, 10);
}
void printx(ip) unsigned long;
{
prints("0x"); //PUT OR OUTPUT LOOK LIKE INT
rpi(ip, 16);
}
int printl(ip) unsigned long;
{
if(ip == 0)
{
putc('0');
return 0;
}
rpi(ip, 10);
putc('L');
}
void printf(fmt) char *fmt;
{
char *cp; //POINTER TO LOOP THROUGH
unsigned long *ip; //POINTER FOR
cp = fmt; //SET POINTER TO START POINTER {FMT}
ip = &fmt+1; //Board says &fmt:but will not work without +1
while(*cp)
{
//IF C != %
if(*cp != '%')
{
printf("%c", *cp);
if(*cp == '\n')
{
//putc('\n'); //implied
putc('\r');
}
cp++;
continue; //NEXT CHAR
}
else
{
//MOVE ONE CHARACTER (%{x}) SO WE CAN GET x
cp++;
switch(*cp)
{
case 'c':
printc(*ip);
break;
case 's':
prints(*ip);
break;
case 'd':
printd(*ip);
break;
case 'x':
printx(*ip);
break;
case 'l':
printl(*ip);
break;
default:
break;
} }
cp++;
ip++;
}
}
任何人有任何建议,因为我一直在坚持,需要一些帮助。
EDIT(下午2点06分):我已经改变了我所有的U16 /无符号短为unsigned long,情况发生了改变印刷HI! :L: :0: :0: :: :: :1:
不要编写没有原型的代码! `printc(ip)`后面的'unsigned short;`什么也不做; `ip`仍然是一个`int`。 – 2011-01-30 22:01:53
行int rpi(x,BASE)无符号32 x; int BASE;`不会在正统C编译器下编译。 – 2011-01-30 22:05:48
我使用bcc编译器,因为这个程序是我们OS开发类的一部分,我们使用ext2图像来缓慢构建我们自己的操作系统。它编译使用bcc -c main.c,as86 -o main.o main.s,ld86 -s main.o /usr/lib/bcc/libc.a -o u.out – user591162 2011-01-30 22:09:03