-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.asm
357 lines (304 loc) · 7.95 KB
/
main.asm
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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
MEMORY_SIZE equ 1000
STACK_SIZE equ 1000
CODE_SIZE equ 1000
section .data
var_str_title db 'BrainF**k VM Writern by Nasm x64', 0
var_str_0 db 'Hello! Welecome to bf_asm vm.', 10, 0
var_str_1 db 'Your bf code is: ', 0
var_str_2 db 10, '--------------start--------------', 0
var_str_3 db '--------------stop---------------', 0
var_str_4 db 'Finished!', 0
var_str_5 db 'Please input corret argvs.', 0
var_test db 'test.bf', 0
code db '++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.', 0
;code db '++++++[>+++++[>+++<-]<-]>>.', 0
;code resb CODE_SIZE
memory resb MEMORY_SIZE ;The vm memory
stack resd STACK_SIZE ;
code_index dd 0
mery_index dd 0
stck_index dd 0
file_point dd 0, 0
f_read_sign db 'r' , 0
printf_format_d db '%d'
printf_format_c db '%c'
printf_format_s db '%s'
printf_format_s_CR db '%s', 10
section .text
extern printf
extern puts
extern getchar
extern putchar
extern MessageBoxA
extern fopen
extern fgets
global main
main:
push rbp
mov rbp, rsp
sub rsp, 48 ; x64 shadow stack
cmp ecx, 1
je buqdsh
mov rcx, var_str_5
call puts
jmp main_sub_end
buqdsh:
; call init_code
call init_hello ; print_hello
call init_memory ; initilize memory
call init_stack ; initilize stack
call prase ; start prase
mov rcx, var_str_3 ; print_stop_divider
call puts
mov ecx, 0 ; show_messagebox
mov rdx, var_str_4
mov r8, var_str_title
mov r9d, 0
call MessageBoxA
main_sub_end:
add rsp, 48
pop rbp
mov rax, 10 ; return 10
ret
main_end:
init_hello:
push rbp
mov rbp, rsp
sub rsp, 48
push rcx
mov rcx, var_str_0 ; print_hello
call puts
mov rcx, var_str_1
call puts
mov rcx, code
call puts
mov rcx, var_str_2
call puts
pop rcx
add rsp, 48
pop rbp
ret
init_memory: ; initilize memory - fill memory with 0
push rax
mov DWORD eax, MEMORY_SIZE
dec eax
nbl5ze:
cmp eax, 0
je nbl5ze_end
mov BYTE [-1 + rax + memory], 0
dec eax
jmp nbl5ze
nbl5ze_end:
pop rax
ret
init_stack: ; initilize stack - fill stack with 0
push rax
mov DWORD eax, STACK_SIZE
dec eax
bot40v:
cmp eax, 0
je bot40v_end
mov BYTE [-1 + rax + stack], 40
dec eax
jmp bot40v
bot40v_end:
pop rax
ret
init_code:
;TODO
push rbp
mov rbp, rsp
sub rsp, 1056
push rax
push rcx
push rdx
mov rax, rdx
add rax, 8
mov QWORD rax, [rax] ; rax <- argv[1]
mov rax, var_test
mov rdi, rax
mov rsi, f_read_sign
call fopen
; mov rdx, f_read_sign
; mov rcx, rax
; call fopen ; rax <- fopen(rax, "r");
; mov rdx, rax
; mov r8, rdx
; mov rax, code
; mov edx, CODE_SIZE
; mov rcx, code
; call fgets
; mov rcx, code
; call puts
pop rdx
pop rcx
pop rax
add rsp, 1056
pop rbp
ret
prase:
push rbp
mov rbp, rsp
sub rsp, 48
push rax
push rbx
start_prase_loop:
mov DWORD eax, [code_index]
mov BYTE bl, [eax + code]
cmp bl, '+'
je uv5u1q
jmp uv5u1q_end
uv5u1q:
call incr
uv5u1q_end:
cmp bl, '-'
je fidnke
jmp fidnke_end
fidnke:
call decr
fidnke_end:
cmp bl, '<'
je s2oxau
jmp s2oxau_end
s2oxau:
call prev
s2oxau_end:
cmp bl, '>'
je yvsvfr
jmp yvsvfr_end
yvsvfr:
call next
yvsvfr_end:
cmp bl, ','
je ruekup
jmp ruekup_end
ruekup:
call read
ruekup_end:
cmp bl, 46
je mestpk
jmp mestpk_end
mestpk:
call print
mestpk_end:
cmp bl, '['
je notvpc
jmp notvpc_end
notvpc:
call sloop
notvpc_end:
cmp bl, ']'
je trxtyo
jmp trxtyo_end
trxtyo:
call eloop
trxtyo_end:
cmp bl, 0
je end_parse_loop
jmp start_prase_loop
end_parse_loop:
pop rbx
pop rax
add rsp, 48
pop rbp
ret
next: ; >
push rax
mov DWORD eax, [mery_index]
inc eax
mov DWORD [mery_index], eax
inc DWORD [code_index]
pop rax
ret
prev: ; <
push rax
mov DWORD eax, [mery_index]
dec eax
mov DWORD [mery_index], eax
inc DWORD [code_index]
pop rax
ret
incr: ; +
push rax
mov DWORD eax, [mery_index]
inc BYTE [eax + memory]
inc DWORD [code_index]
pop rax
ret
decr: ; -
push rax
mov DWORD eax, [mery_index]
dec BYTE [eax + memory]
inc DWORD [code_index]
pop rax
ret
read: ; ,
push rbp
mov rbp, rsp
sub rsp, 48
push rax
push rbx
mov DWORD ebx, [mery_index]
call getchar
mov BYTE [ebx + memory], al
inc DWORD [code_index]
pop rbx
pop rax
add rsp, 48
pop rbp
ret
print: ; .
push rbp
mov rbp, rsp
sub rsp, 48
push rax
push rcx
mov DWORD eax, [mery_index]
mov BYTE ecx, [eax + memory]
call putchar
inc DWORD [code_index]
pop rcx
pop rax
add rsp, 48
pop rbp
ret
sloop: ; [
push rax
push rbx
inc DWORD [code_index]
inc DWORD [stck_index]
inc DWORD [stck_index]
inc DWORD [stck_index]
inc DWORD [stck_index]
mov DWORD eax, [stck_index]
mov DWORD ebx, [code_index]
mov DWORD [eax + stack], ebx
pop rbx
pop rax
ret
eloop: ; ]
push rax
push rbx
mov DWORD eax, [mery_index]
mov BYTE bl, [eax + memory]
cmp bl, 0
je loop_stop
jmp loop_continue
loop_continue:
mov DWORD eax, [stck_index]
mov DWORD eax, [eax + stack]
mov DWORD [code_index], eax
jmp pjczyt
loop_stop:
inc DWORD [code_index]
dec DWORD [stck_index]
dec DWORD [stck_index]
dec DWORD [stck_index]
dec DWORD [stck_index]
jmp pjczyt
pjczyt:
pop rbx
pop rax
ret
section .drectve info
db '/defaultlib:user32.lib /defaultlib:msvcrt.lib /defaultlib:legacy_stdio_definitions.lib '