我正在使用BCC编写自己的操作系统,我想从头开始编写printf,没有可变参数arg宏。我有什么理由不这样做吗?我有一个好的开始,但我不能在字符串后面得到第一个参数。
void print_f(char *fmt, ...) {
char *str = fmt;
uint16_t *arg = (uint16_t *)&fmt + 1;
uint32_t *long_arg;
while (*fmt != '\0') {
if (*fmt == '%') {
switch(*++fmt) {
case 'c':
putchar((uint8_t)*arg);
arg++;
break;
default:
print_f("Malformed printf");
break;
}
} else {
putchar(*fmt);
}
fmt++;
}
return;
}
我想我想把指针增加一个地址空间并从那里开始,但它只是返回垃圾。
答案 0 :(得分:4)
增加第一个参数的地址以访问后续的可变参数可能适用于一些较旧的体系结构,但它一般不起作用,当然不适用于x86-64,假设这是你的目标:
一些其他可移植的C程序依赖于参数传递方案, 隐式假设所有参数都在栈和参数上传递 在堆栈上以递增顺序出现。做出这些假设的程序 从来没有可移植,但他们已经在许多实现上工作。然而, 它们不适用于AMD64架构,因为有些论点是 通过登记册。便携式C程序必须使用头文件
<stdarg.h>
为了处理变量参数列表。AMD64 ABI, 3.5.7变量参数列表
如果您有兴趣在x86-64上重新实现<stdarg.h>
,那么上面的参考资料中有足够的详细信息,包括va_arg
算法。