C言語とアセンブリ言語を使用して、printf()関数を自作し、SPIM上でその動作を確認する応用プログラムを作成したいのですが、va_listやva_arg等のマクロを使用せずに作成する方法がわかりません。
自分でできたところまでのソースコードを記載します。
以下C言語のソースコードです。
void print_char(char c) {
char s[2];
s[0] = c;
s[1] = '\0';
print_string(s)
}
void myprintf(char *fmt, ...) {
int i, argc = 0;
char *s;
while (*fmt) {
if (*fmt == '%') {
fmt++;
argc++;
switch (*fmt){
case 'd':
// Process of %d
i = ((int) ((char *)&fmt + argc * sizeof(void *)) );
print_int(i);
break;
case 's':
// Process of %s
s = ((int) ((char *)&fmt + argc * sizeof(void *)) );
print_string(s);
break;
break;
}
}else {
// print a character as it is
print_char(*fmt);
}
fmt++;
}
}
int main() {
myprintf("I am %s, my age is %d", "○○", ○);
return 0;
}
以下アセンブリ言語のソースコードです。
.text
.align 2
_print_int:
subu $sp, $sp, 24
sw $ra, 20($sp)
li $v0, 1 # 1: print_int
syscall
lw $ra, 20($sp)
addu $sp, $sp, 24
j $ra
_print_string:
subu $sp, $sp, 24
sw $ra, 20($sp)
li $v0, 4 # 4: print_string
syscall
lw $ra, 20($sp)
addu $sp, $sp, 24
j $ra
このとき、case’u’や’o’であったり、printfの他のサブセットの実装の仕方がわかりません。
マクロを使わないのは、課題でそう指定されているからです。
同じ機能を果たすものを自分で作成するのは大丈夫です。
よろしくお願いいたします。