質問編集履歴

1

2020/01/10 08:49

投稿

mine___
mine___

スコア5

test CHANGED
File without changes
test CHANGED
@@ -1,5 +1,167 @@
1
1
  C言語とアセンブリ言語を使用して、printf()関数を自作し、SPIM上でその動作を確認する応用プログラムを作成したいのですが、va_listやva_arg等のマクロを使用せずに作成する方法がわかりません。
2
2
 
3
+
4
+
5
+ 自分でできたところまでのソースコードを記載します。
6
+
7
+
8
+
9
+ 以下C言語のソースコードです。
10
+
11
+
12
+
13
+ void print_char(char c) {
14
+
15
+ char s[2];
16
+
17
+
18
+
19
+ s[0] = c;
20
+
21
+ s[1] = '\0';
22
+
23
+
24
+
25
+ print_string(s)
26
+
27
+ }
28
+
29
+
30
+
31
+ void myprintf(char *fmt, ...) {
32
+
33
+
34
+
35
+ int i, argc = 0;
36
+
37
+ char *s;
38
+
39
+
40
+
41
+ while (*fmt) {
42
+
43
+ if (*fmt == '%') {
44
+
45
+ fmt++;
46
+
47
+ argc++;
48
+
49
+ switch (*fmt){
50
+
51
+ case 'd':
52
+
53
+ // Process of %d
54
+
55
+ i = *((int*) ((char *)&fmt + argc * sizeof(void *)) );
56
+
57
+ print_int(i);
58
+
59
+ break;
60
+
61
+ case 's':
62
+
63
+ // Process of %s
64
+
65
+ s = *((int*) ((char *)&fmt + argc * sizeof(void *)) );
66
+
67
+ print_string(s);
68
+
69
+ break;
70
+
71
+ break;
72
+
73
+ }
74
+
75
+ }else {
76
+
77
+ // print a character as it is
78
+
79
+ print_char(*fmt);
80
+
81
+ }
82
+
83
+ fmt++;
84
+
85
+ }
86
+
87
+ }
88
+
89
+
90
+
91
+
92
+
93
+ int main() {
94
+
95
+ myprintf("I am %s, my age is %d", "○○", ○);
96
+
97
+ return 0;
98
+
99
+ }
100
+
101
+
102
+
103
+ 以下アセンブリ言語のソースコードです。
104
+
105
+
106
+
107
+ .text
108
+
109
+ .align 2
110
+
111
+
112
+
113
+ _print_int:
114
+
115
+ subu $sp, $sp, 24
116
+
117
+ sw $ra, 20($sp)
118
+
119
+
120
+
121
+ li $v0, 1 # 1: print_int
122
+
123
+ syscall
124
+
125
+
126
+
127
+ lw $ra, 20($sp)
128
+
129
+ addu $sp, $sp, 24
130
+
131
+ j $ra
132
+
133
+
134
+
135
+
136
+
137
+ _print_string:
138
+
139
+ subu $sp, $sp, 24
140
+
141
+ sw $ra, 20($sp)
142
+
143
+
144
+
145
+ li $v0, 4 # 4: print_string
146
+
147
+ syscall
148
+
149
+
150
+
151
+ lw $ra, 20($sp)
152
+
153
+ addu $sp, $sp, 24
154
+
155
+ j $ra
156
+
157
+
158
+
159
+ このとき、case’u’や’o’であったり、printfの他のサブセットの実装の仕方がわかりません。
160
+
161
+ マクロを使わないのは、課題でそう指定されているからです。
162
+
3
- ソースコード貼って頂けとありがたいです。
163
+ 同じ機能を果たすのを自分で作成すのは大丈夫です。
164
+
165
+
4
166
 
5
167
  よろしくお願いいたします。