-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnaskfunc.nas
216 lines (193 loc) · 3.34 KB
/
naskfunc.nas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
; naskfunc
[FORMAT "WCOFF"] ; objファイルを作るモードを指定
[INSTRSET "i486p"] ; 486の命令を使うために記述
[BITS 32] ; 32ビットモード用の機械語を作ると知らせる
; objファイルの情報
[FILE "naskfunc.nas"]
GLOBAL _io_hlt, _write_mem8
GLOBAL _io_cli, _io_sti, _io_stihlt
GLOBAL _io_in8
GLOBAL _io_out8
GLOBAL _io_load_eflags, _io_store_eflags
GLOBAL _load_gdtr, _load_idtr
GLOBAL _load_cr0, _store_cr0
GLOBAL _load_tr
GLOBAL _asm_inthandler20, _asm_inthandler21
GLOBAL _asm_inthandler27, _asm_inthandler2c
GLOBAL _memtest_sub
GLOBAL _farjmp
EXTERN _inthandler20, _inthandler21
EXTERN _inthandler27, _inthandler2c
; 関数の実態
[SECTION .text] ; objファイルを書くときの約束事
; 待ち
_io_hlt: ; void io_hlt(void);
HLT
RET
; メモリ書き込み
_write_mem8: ; void write_mem8(int addr, int data);
MOV ECX,[ESP+4] ; [ESP+4]はaddrの値が入っている
MOV AL,[ESP+8] ; [ESP+8]はdataの値が入っている
MOV [ECX],AL
RET
; 割り込み禁止
_io_cli: ; void io_cli(void);
CLI
RET
; 割り込み許可
_io_sti: ; void io_sti(void);
STI
RET
; 割り込み許可後待ち
_io_stihlt: ; void io_stihlt(void);
STI
HLT
RET
; デバイスからの入力
_io_in8: ; int io_in8(int port);
MOV EDX,[ESP+4]
MOV EAX,0
IN AL,DX
RET
; デバイスへの出力
_io_out8: ; void io_out8(int port, int data);
MOV EDX,[ESP+4]
MOV AL,[ESP+8]
OUT DX,AL
RET
; EFLAGSの取得
_io_load_eflags: ; int io_load_eflags(void);
PUSHFD ; PUSH EFLAGSの意
POP EAX
RET
; EFLAGSの設定
_io_store_eflags: ; void io_store_eflags(int eflags);
MOV EAX,[ESP+4]
PUSH EAX
POPFD ; POP EFLAGSの意
RET
;
_load_gdtr: ; void load_gdtr(int limit, int addr);
MOV AX,[ESP+4]
MOV [ESP+6],AX
LGDT [ESP+6]
RET
;
_load_idtr: ; void load_idtr(int limit, int addr)
MOV AX,[ESP+4]
MOV [ESP+6],AX
LIDT [ESP+6]
RET
;
_load_cr0: ; int load_cr0(void);
MOV EAX,CR0
RET
;
_store_cr0: ; void store_cr0(int cr0);
MOV EAX,[ESP+4]
MOV CR0,EAX
RET
;
_asm_inthandler20:
PUSH ES
PUSH DS
PUSHAD
MOV EAX,ESP
PUSH EAX
MOV AX,SS
MOV DS,AX
MOV ES,AX
CALL _inthandler20
POP EAX
POPAD
POP DS
POP ES
IRETD
;
_load_tr: ; void load_tr(int tr);
LTR [ESP+4]
RET
;
_asm_inthandler21:
PUSH ES
PUSH DS
PUSHAD
MOV EAX,ESP
PUSH EAX
MOV AX,SS
MOV DS,AX
MOV ES,AX
CALL _inthandler21
POP EAX
POPAD
POP DS
POP ES
IRETD
;
_asm_inthandler27:
PUSH ES
PUSH DS
PUSHAD
MOV EAX,ESP
PUSH EAX
MOV AX,SS
MOV DS,AX
MOV ES,AX
CALL _inthandler27
POP EAX
POPAD
POP DS
POP ES
IRETD
;
_asm_inthandler2c:
PUSH ES
PUSH DS
PUSHAD
MOV EAX,ESP
PUSH EAX
MOV AX,SS
MOV DS,AX
MOV ES,AX
CALL _inthandler2c
POP EAX
POPAD
POP DS
POP ES
IRETD
;
_memtest_sub: ; unsigned int memtest_sub(unsigned int start, unsigned int end);
PUSH EDI
PUSH ESI
PUSH EBX
MOV ESI,0xaa55aa55
MOV EDI,0x55aa55aa
MOV EAX,[ESP+12+4]
mts_loop:
MOV EBX,EAX
ADD EBX,0xffc
MOV EDX,[EBX]
MOV [EBX],ESI
XOR DWORD [EBX],0xffffffff
CMP EDI,[EBX]
JNE mts_fin
XOR DWORD [EBX],0xffffffff
CMP ESI,[EBX]
JNE mts_fin
MOV [EBX],EDX
ADD EAX,0x1000
CMP EAX,[ESP+12+8]
JBE mts_loop
POP EBX
POP ESI
POP EDI
RET
mts_fin:
MOV [EBX],EDX
POP EBX
POP ESI
POP EDI
RET
_farjmp: ; void farjmp(int eip, int cs);
JMP FAR [ESP+4]
RET