My Project
Loading...
Searching...
No Matches
kernel_asm.h
Go to the documentation of this file.
1#pragma once
2#ifndef KERNEL_ASM_H
3#define KERNEL_ASM_H
4
5#include <stdio.h>
6#include <stdlib.h>
7#include <setjmp.h>
8#include <memory.h>
9
10// 컴파일러에 따른 분기 설정
11#if defined(__clang__) // Clang용 설정
12#if defined(__x86_64__) || defined(__ppc64__)
13#define SYSTEM_BIT 64 // 64비트 시스템
14#else
15#define SYSTEM_BIT 32 // 32비트 시스템
16#endif
17#elif defined(__GNUC__) // GCC용 설정
18#if defined(__x86_64__) || defined(__ppc64__)
19#define SYSTEM_BIT 64 // 64비트 시스템
20#else
21#define SYSTEM_BIT 32 // 32비트 시스템
22#endif
23#else
24#error "Unsupported compiler"
25#endif
26
27typedef const char *STRING; // STRING 타입을 const char*로 정의
28typedef unsigned char BYTE; // BYTE 타입을 unsigned char로 정의
29typedef unsigned short WORD; // WORD 타입을 unsigned short로 정의
30typedef unsigned long DWORD; // DWORD 타입을 unsigned long으로 정의
31typedef unsigned long long QWORD; // QWORD 타입을 unsigned long long으로 정의
32
33#if SYSTEM_BIT == 32
34typedef DWORD INT; // 32비트 시스템에서는 INT를 DWORD로 정의
35#else
36typedef QWORD INT; // 64비트 시스템에서는 INT를 QWORD로 정의
37#endif
38
39// 프로시저 선언을 위한 매크로
40#define PROTO(proc) static INT proc(); // 내부 프로시저 선언
41#define EXTERN(proc) INT proc(); // 외부 프로시저 선언
42
43// 프로시저 관련 함수 선언
44static INT proc_init(); // 프로시저 초기화 함수
45static INT proc_retn(); // 프로시저 반환 함수
46static INT print_int(); // 콘솔에 정수를 출력하는 함수
47static INT print_str(); // 콘솔에 문자열을 출력하는 함수
48
49#define MAX_MEMORY_LEN 100 // 최대 메모리 길이
50
51static BYTE m[MAX_MEMORY_LEN]; // 메모리 배열 선언
52static INT a, b, c, d; // INT 타입 변수 선언
53static INT sp = MAX_MEMORY_LEN, bp = MAX_MEMORY_LEN; // 스택 포인터와 베이스 포인터 초기화
54static INT flag = 0; // 플래그 변수 초기화
55
56static INT ip = 0; // 명령 포인터 초기화
57static jmp_buf _ipArray[10]; // 점프 버퍼 배열 선언
58
59static jmp_buf _ip; // 점프 버퍼 선언
60
61enum FLAG
62{
63 FLAG_SIGNED = 1, // 부호 플래그
64 FLAG_ZERO = 1 << 2 // 제로 플래그
65};
66
67// 프로시저 시작을 정의하는 매크로
68#define PROC(proc_name) \
69 static int proc_name##DTCASE() \
70 { \
71 proc_init();
72
73#define ENDP \
74 _end_proc: \
75 proc_retn(); \
76 return 0; \
77 }
78
79// PUSH 명령어를 정의하는 매크로
80#define PUSH(param) \
81 { \
82 INT *p; \
83 sp -= sizeof(INT); \
84 p = (INT *)(m + sp); \
85 *p = (INT)(param); \
86 }
87// POP 명령어를 정의하는 매크로
88#define POP(param) \
89 { \
90 INT *p; \
91 p = (INT *)(m + sp); \
92 sp += sizeof(INT); \
93 (param) = *p; \
94 }
95
96// MOVL 명령어를 정의하는 매크로
97#define MOVL(dst, src) \
98 { \
99 (dst) = (INT)(src); \
100 }
101// ADD 명령어를 정의하는 매크로
102#define ADD(dst, src) \
103 { \
104 (dst) += (INT)(src); \
105 }
106// SUB 명령어를 정의하는 매크로
107#define SUB(dst, src) \
108 { \
109 (dst) -= (INT)(src); \
110 }
111// MUL 명령어를 정의하는 매크로
112#define MUL(dst, src) \
113 { \
114 (dst) *= (INT)(src); \
115 }
116// DIV 명령어를 정의하는 매크로
117#define DIV(dst, src) \
118 { \
119 (dst) /= (INT)(src); \
120 }
121
122// JMP 명령어를 정의하는 매크로
123#define JMP(lbl) \
124 { \
125 goto lbl; \
126 }
127
128// CMP 명령어를 정의하는 매크로
129#define CMP(p1, p2) \
130 { \
131 flag = ((p1) == (p2)) ? FLAG_ZERO : 0; \
132 }
133// JZ 명령어를 정의하는 매크로
134#define JZ(lbl) \
135 if (flag & FLAG_ZERO) \
136 { \
137 goto lbl; \
138 }
139// JNZ 명령어를 정의하는 매크로
140#define JNZ(lbl) \
141 if (!(flag & FLAG_ZERO)) \
142 { \
143 goto lbl; \
144 }
145
146// INC 명령어를 정의하는 매크로
147#define INC(param) \
148 { \
149 ++(param); \
150 }
151// DEC 명령어를 정의하는 매크로
152#define DEC(param) \
153 { \
154 --(param); \
155 }
156
157// LEA 명령어를 정의하는 매크로
158#define LEA(dst, src) \
159 { \
160 (dst) = (void *)(src); \
161 }
162// SETL 명령어를 정의하는 매크로
163#define SETL(dst, src) \
164 { \
165 *(INT *)(dst) = (src); \
166 }
167// GETL 명령어를 정의하는 매크로
168#define GETL(dst, src) \
169 { \
170 (dst) = *(INT *)(src); \
171 }
172
173// CALL 명령어를 정의하는 매크로
174#define CALL(proc) \
175 { \
176 static INT ip; \
177 static jmp_buf _ip; \
178 static jmp_buf _ipArray[10]; \
179 if (setjmp(_ip) == 0) \
180 { \
181 memcpy(_ipArray[ip++], &_ip, sizeof(jmp_buf)); \
182 PUSH(ip); \
183 proc(); \
184 } \
185 }
186// INVOKE 명령어를 정의하는 매크로
187#define INVOKE(proc) \
188 { \
189 static INT n; \
190 CALL(proc); \
191 POP(n); \
192 }
193// RETURN 명령어를 정의하는 매크로
194#define RETURN() \
195 { \
196 goto _end_proc; \
197 }
198// RET 명령어를 정의하는 매크로
199#define RET() \
200 { \
201 static INT ip; \
202 static jmp_buf _ip; \
203 static jmp_buf _ipArray[]; \
204 POP(ip); \
205 memcpy(&_ip, _ipArray[ip - 1], sizeof(jmp_buf)); \
206 longjmp(_ip, a); \
207 }
208
209// LOOP 명령어를 정의하는 매크로
210#define LOOP(index, start, end) \
211 MOVL(index, start); \
212 while (index < end) \
213 {
214
215// ENDLOOP 명령어를 정의하는 매크로
216#define ENDLOOP(index) \
217 INC(index); \
218 }
219// 프로그램 종료 명령어를 정의하는 매크로
220#define EXIT() \
221 { \
222 exit(a); \
223 }
224
225// 프로시저를 정의하는 매크로 (엔트리 포인트 없음)
226#define PROC_NAKED(proc_name) \
227 static INT proc_name() \
228 {
229// 프로시저 종료를 정의하는 매크로 (엔트리 포인트 없음)
230#define ENDP_NAKED \
231 _end_proc: \
232 return 0; \
233 }
234
235static INT n; // 전역 변수 n 선언
236
237// 프로시저 초기화 함수
238static INT proc_init()
239{
240 PUSH(bp); // 현재 베이스 포인터를 스택에 저장
241 MOVL(bp, sp); // 베이스 포인터를 현재 스택 포인터로 설정
242 return 0;
243}
244// 프로시저 반환 함수
245static INT proc_retn()
246{
247 MOVL(sp, bp); // 스택 포인터를 베이스 포인터로 설정
248 POP(bp); // 이전 베이스 포인터를 스택에서 복원
249 return 0;
250}
251
252// 콘솔에 정수를 출력하는 함수
253static INT print_int()
254{
255 INT num = *(INT *)(m + sizeof(INT) + sp); // 스택에서 정수 값 가져오기
256 return printf("%d", (int)num); // 정수 값 출력
257}
258// 콘솔에 문자열을 출력하는 함수
259static INT print_str()
260{
261 INT val = *(INT *)(m + sizeof(INT) + sp); // 스택에서 문자열 주소 가져오기
262 return printf("%s", (const char *)val); // 문자열 출력
263}
264
265#endif
unsigned short WORD
Definition kernel_asm.h:29
const char * STRING
Definition kernel_asm.h:27
unsigned char BYTE
Definition kernel_asm.h:28
unsigned long long QWORD
Definition kernel_asm.h:31
#define MAX_MEMORY_LEN
Definition kernel_asm.h:49
QWORD INT
Definition kernel_asm.h:36
#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
unsigned long DWORD
Definition kernel_asm.h:30
FLAG
Definition kernel_asm.h:62
@ FLAG_ZERO
Definition kernel_asm.h:64
@ FLAG_SIGNED
Definition kernel_asm.h:63