My Project
Loading...
Searching...
No Matches
kernel_asm.c
Go to the documentation of this file.
1#include "kernel_asm.h"
2#include "kernel_print.h"
3#include <time.h>
4
5#ifdef __cplusplus
6extern "C"
7{
8#endif
9
10/*
11 HelloWorld 출력
12*/
13#if DTCASE == 1
14 void main_1()
15 {
16 STRING msg = "Hello, World!";
17 PUSH(msg);
18 CALL(print_str);
19 POP(n);
20 kernel_printf("\n");
21 fflush(stdout);
22 }
23#endif
24
25/*
26 가산기 출력 (+, -, /, *)
27*/
28#if DTCASE == 2
29 void main_2()
30 {
31 MOVL(a, 10);
32 MOVL(b, 5);
33
34 ADD(a, b); // a = 10 + 5
35 PUSH(a);
36 CALL(print_int);
37 POP(n);
38 kernel_printf("\n");
39 fflush(stdout);
40
41 MOVL(a, 10);
42 MOVL(b, 5);
43
44 SUB(a, b); // a = 10 - 5
45 PUSH(a);
46 CALL(print_int);
47 POP(n);
48 kernel_printf("\n");
49 fflush(stdout);
50
51 MOVL(a, 10);
52 MOVL(b, 5);
53
54 MUL(a, b); // a = 10 * 5
55 PUSH(a);
56 CALL(print_int);
57 POP(n);
58 kernel_printf("\n");
59 fflush(stdout);
60
61 MOVL(a, 10);
62 MOVL(b, 5);
63
64 DIV(a, b); // a = 10 / 5
65 PUSH(a);
66 CALL(print_int);
67 POP(n);
68 kernel_printf("\n");
69 fflush(stdout);
70 }
71#endif
72
73/*
74 랜덤으로 선택하여 do-while문으로 가산기 출력, exit를 입력하면 종료
75*/
76#if DTCASE == 3
77 void main_3()
78 {
79 srand(time(0));
80 STRING input_msg = "This Program is Random Choice Calculator.\n";
81 PUSH(input_msg);
82 CALL(print_str);
83 POP(n);
84 kernel_printf("\n");
85 fflush(stdout);
86
87 STRING msg = "Enter 'exit' to quit.\n";
88 PUSH(msg);
89 CALL(print_str);
90 POP(n);
91 kernel_printf("\n");
92 fflush(stdout);
93
94 char input[10];
95 INT num1, num2;
96 do
97 {
98 kernel_printf("Enter two numbers (or 'exit' to quit):\n");
99 fflush(stdout);
100 if (scanf("%9s", input) != 1 || strcmp(input, "exit") == 0)
101 break;
102 num1 = atoi(input);
103
104 if (scanf("%9s", input) != 1 || strcmp(input, "exit") == 0)
105 break;
106 num2 = atoi(input);
107
108 MOVL(a, num1);
109 MOVL(b, num2);
110
111 int choice = rand() % 4;
112
113 switch (choice)
114 {
115 case 0:
116 ADD(a, b);
117 kernel_printf("Operation: ADD\n");
118 fflush(stdout);
119 break;
120 case 1:
121 SUB(a, b);
122 kernel_printf("Operation: SUB\n");
123 fflush(stdout);
124 break;
125 case 2:
126 MUL(a, b);
127 kernel_printf("Operation: MUL\n");
128 fflush(stdout);
129 break;
130 case 3:
131 DIV(a, b);
132 kernel_printf("Operation: DIV\n");
133 fflush(stdout);
134 break;
135 }
136
137 PUSH(a);
138 CALL(print_int);
139 POP(n);
140 kernel_printf("\n");
141 fflush(stdout);
142
143 // 스택 포인터를 초기 상태로 되돌림
144 sp = MAX_MEMORY_LEN;
145 } while (1);
146 }
147#endif
148
149/*
150 비재귀적 피보나치 수열 계산
151*/
152#if DTCASE == 4
153 void main_4()
154 {
155 MOVL(a, 10);
156 if (a == 0)
157 {
158 MOVL(b, 0);
159 }
160 else if (a == 1)
161 {
162 MOVL(b, 1);
163 }
164 else
165 {
166 INT fib1 = 0, fib2 = 1, temp, i;
167 LOOP(i, 2, a + 1)
168 MOVL(temp, fib1);
169 ADD(fib1, fib2);
170 MOVL(fib2, temp);
171 ENDLOOP(i)
172 MOVL(b, fib1);
173 }
174 PUSH(b);
175 CALL(print_int);
176 POP(n);
177 kernel_printf("\n");
178 fflush(stdout);
179 }
180#endif
181
182/*
183 for문으로 1부터 10까지의 덧셈 구하기
184*/
185#if DTCASE == 5
186 void main_5()
187 {
188 MOVL(a, 0);
189 INT i;
190 LOOP(i, 1, 11)
191 ADD(a, i);
192 ENDLOOP(i)
193
194 PUSH(a);
195 CALL(print_int);
196 POP(n);
197 kernel_printf("\n");
198 fflush(stdout);
199 }
200#endif
201
202/*
203 포인터 연산 어셈블리로 하기(주소 값 대입으로 변형)
204*/
205#if DTCASE == 6
206 void main_6()
207 {
208 INT x = 10;
209 INT *p;
210 LEA(p, &x);
211 SETL(p, 20);
212
213 PUSH(x);
214 CALL(print_int);
215 POP(n);
216 kernel_printf("\n");
217 fflush(stdout);
218 }
219#endif
220
221/*
222 게임 캐릭터 구조체를 만들어서 실제 게임하는 것처럼 연산해보기
223*/
224#if DTCASE == 7
225 typedef struct
226 {
227 INT hp;
228 INT attack;
229 INT defense;
230 } Character;
231
232 void main_7()
233 {
234 Character hero = {100, 20, 10};
235 Character monster = {80, 15, 5};
236
237 // Hero attacks monster
238 SUB(monster.hp, hero.attack);
239 MOVL(a, monster.hp);
240 PUSH(a);
241 CALL(print_int);
242 POP(n);
243 kernel_printf(" - Monster HP after attack\n");
244 fflush(stdout);
245
246 // Monster attacks hero
247 SUB(hero.hp, monster.attack);
248 MOVL(a, hero.hp);
249 PUSH(a);
250 CALL(print_int);
251 POP(n);
252 kernel_printf(" - Hero HP after attack\n");
253 fflush(stdout);
254 }
255#endif
256
257#ifdef __cplusplus
258}
259#endif
#define LOOP(index, start, end)
Definition kernel_asm.h:210
#define ENDLOOP(index)
Definition kernel_asm.h:216
#define MUL(dst, src)
Definition kernel_asm.h:112
const char * STRING
Definition kernel_asm.h:27
#define CALL(proc)
Definition kernel_asm.h:174
#define DIV(dst, src)
Definition kernel_asm.h:117
#define MAX_MEMORY_LEN
Definition kernel_asm.h:49
QWORD INT
Definition kernel_asm.h:36
#define LEA(dst, src)
Definition kernel_asm.h:158
#define PUSH(param)
Definition kernel_asm.h:80
#define POP(param)
Definition kernel_asm.h:88
#define MOVL(dst, src)
Definition kernel_asm.h:97
#define SUB(dst, src)
Definition kernel_asm.h:107
#define SETL(dst, src)
Definition kernel_asm.h:163
#define ADD(dst, src)
Definition kernel_asm.h:102
kernel_printf("5-4 = %d\n", 1)