Browse Source

Old version without ELF support

Yann Weber 5 years ago
parent
commit
73be7b9b04
1 changed files with 16 additions and 262 deletions
  1. 16
    262
      bfc.asm

+ 16
- 262
bfc.asm View File

@@ -36,10 +36,6 @@ ALIGNMODE k8
36 36
 
37 37
 section .data
38 38
 
39
-	bf_start_head:
40
-		push 0x00400085
41
-		;dw 0x6885004000
42
-	bf_start_head_sz: equ $ - bf_start_head
43 39
 	bf_start:
44 40
 		jmp .start
45 41
 		.mremap: ; rbx is resize size
@@ -187,7 +183,6 @@ section .data
187 183
 
188 184
 	bf_loopstart:
189 185
 		mov rbx, strict qword 0x1
190
-		add rbx, [rsp]
191 186
 		xor rdx, rdx
192 187
 		mov dl, [rsi]
193 188
 		cmp dl, 0
@@ -198,7 +193,6 @@ section .data
198 193
 
199 194
 	bf_loopend:
200 195
 		mov rbx, strict qword 0x1
201
-		add rbx, [rsp]
202 196
 		xor rdx, rdx
203 197
 		mov dl, [rsi]
204 198
 		cmp dl, 0
@@ -213,184 +207,41 @@ section .data
213 207
 		syscall
214 208
 	bf_exit_sz: equ $ - bf_exit
215 209
 
216
-	elf_head: dw 0x457f, 0x464c, 0x0102, 0x0001,
217
-	times 4 dw 0x0
218
-	; 0x10
219
-	dw 0x0002, 0x003e, 0x0001, 0x0000
220
-	dw 0x080, 0x040, 0x0, 0x0
221
-	; 0x20
222
-	dw 0x0040
223
-	times 3 dw 0x0 
224
-	elf_section_head_offset : times 8 db  0xFF ; 0x28
225
-	; 0x30
226
-	dw 0x0, 0x0, 0x40, 0x38, 0x1, 0x40, 0x3, 0x2
227
-	; 0x40 section header
228
-	dw 0x1, 0x0, 0x5 ; load in memory with RX perm
229
-	times 5 dw 0x0
230
-	; 0x50
231
-	dw 0x0, 0x40, 0, 0, 0, 0x40, 0, 0 ; load at 0x40000
232
-	; 0x60
233
-	elf_prog_sz: times 16 db 0xFF ; 0x60 & 0x 68
234
-	; 0x70
235
-	dw 0x0, 0x20
236
-	times 6 dw 0x0
237
-	elf_head_sz: equ $ - elf_head
238
-
239
-	elf_shstrtab: db ".shstrtab", 0x0, ".text", 0x0
240
-	align 8
241
-	elf_shstrtab_sz: equ $ - elf_shstrtab
242
-
243
-	elf_section_headers: times 8 dq 0x0 ; head0
244
-	; head 1
245
-	dw 0xb, 0, 0x1, 0, 0x6, 0, 0, 0
246
-	dw 0x80, 0x40, 0, 0, 0x80, 0, 0, 0
247
-	elf_section_text_sz: times 8 db 0xFF
248
-	dq 0x0
249
-	dw 0x10
250
-	times 7 dw 0x0
251
-	; head2
252
-	dw 0x1, 0, 0x3 , 0, 0, 0, 0, 0
253
-	dq 0x0
254
-	elf_section_strtab_off: times 8 db 0xFF
255
-	dw 0x11
256
-	times 7 dw 0x0
257
-	dw 0x1
258
-	times 7 dw 0x0
259
-	elf_section_headers_sz: equ $ - elf_section_headers
260
-
261
-	default_output: db "a.out", 0x0
262
-
263 210
 	miss_open: db "Missing opening '[' matching closing ']'"
264 211
 	miss_open_sz: equ $ - miss_open
265
-	chr_list : db ": ", 0xA, 0x0
212
+	chr_list : db ": ", 0xA
266 213
 	read_error: db "Error reading file "
267 214
 	read_error_sz: equ $ - read_error
268
-	usage_err: db "Usage : [-e [-o a.out]] FILE.BF"
215
+	usage_err: db "Usage : FILE.BF"
269 216
 	usage_err_sz: equ $ - usage_err
270 217
 	open_err: db "Error opening file", 0xa
271 218
 	open_err_sz: equ $ - open_err
272 219
 
220
+section .bss
221
+	read_buff: resb 128
222
+
273 223
 section .text
274 224
 global _start
275 225
 _start:
276
-; using heap to store arguments
277
-%define bf_source [r13]
278
-%define elf_file [r13+0x8]
279
-%define elf_out [r13+0x11]
280
-%define heap_size 0x12
281
-	
282
-	mov rax, 0xc
283
-	xor rdi, rdi
284
-	syscall
285
-	mov rdi, rax
286
-	mov r13, rax ; heap start
287
-	add rdi, heap_size
288
-	mov rax, 0xc
289
-	syscall
290
-
291
-	;argument parsing
292 226
 	mov rcx, [rsp] ; argc
293 227
 	cmp rcx, 2
294
-	jl .badarg
295
-	je .init_1arg
296
-	cmp rcx, 5
297
-	jg .badarg
298
-
299
-	mov rsi, rsp
300
-	add rsi, 8 ; argv[0]
301
-	dec rcx
302
-	.argloop:
303
-		add rsi, 8
304
-		mov rdi, [rsi]
305
-		mov al, [rdi]
306
-		cmp al, 0x2d ; '-'
307
-		jne .filearg
308
-		mov al, [rdi+2]
309
-		test al, al
310
-		jnz .filearg
311
-		; arg is '-X' testing X
312
-		mov al, [rdi+1]
313
-		cmp al, 0x68 ; '-h'
314
-		je .badarg
315
-		cmp al, 0x65 ; '-e'
316
-		je .elfout_arg
317
-		cmp al, 0x6f ; '-o'
318
-		jne .badarg
319
-
320
-		; -o storing file
321
-		test rcx, rcx
322
-		jz .badarg ; no more args
323
-		dec rcx
324
-		add rsi, 8
325
-		mov rdi, [rsi]
326
-		mov elf_file, rdi
327
-		loop .argloop
328
-		jmp .init
329
-
330
-		.elfout_arg:
331
-			mov al, 0x1
332
-			mov elf_out, al
333
-			mov rax, elf_file
334
-			test rax, rax
335
-			jz .default_out
336
-			.elfout_arg_end:
337
-			loop .argloop
338
-			jmp .init
339
-			.default_out:
340
-				mov rax, default_output
341
-				mov elf_file, rax
342
-				jmp .elfout_arg_end
343
-
344
-		.filearg:
345
-			mov rax, bf_source
346
-			cmp rax, 0
347
-			.br3:
348
-			jnz .badarg ; file allready given
349
-			mov bf_source, rdi
350
-			loop .argloop
351
-			jmp .init
352
-
353
-	.init_1arg:
354
-		mov rax, [rsp+16]
355
-		mov bf_source, rax
356
-	.init:
357
-	; code map init
228
+	jne .badarg
229
+
230
+	; JIT code map init
358 231
 	; rsi map size
359 232
 	mov rsi, 0x10
360 233
 	call initmap
361 234
 
362 235
 	mov rax, 0x2 ; open
363
-	mov rdi, bf_source ; from heap
364
-	test rdi, rdi
365
-	jz .badarg
366
-	xor rsi, rsi ; O_RDONLY
367
-	xor rdx, rdx ; no mode
236
+	mov rdi, [rsp+16] ; argv[1]
237
+	xor rsi, rsi ; no flags
238
+	xor rdx, rdx ; O_RDONLY
368 239
 	syscall
369 240
 	cmp rax, 0
370 241
 	jl .err_open
371
-	push rax ; fd
372
-	push r13 ; heap
373 242
 
374 243
 	call compile_bf
375 244
 
376
-	pop r13 ; heap
377
-	pop rdi ; fd
378
-	sub rax, r15
379
-	push rax ; map len
380
-
381
-	mov rax, 0x3 ; close
382
-	syscall
383
-
384
-	mov al, elf_out
385
-	test al, al
386
-	jnz .write_elf
387
-
388
-	
389
-	.code_jmp:
390
-	; restore heap
391
-	mov rax, 0xc
392
-	mov rdi, r13
393
-	syscall
394 245
 	; set code map perm
395 246
 	mov rax, 0xA ; mprotect
396 247
 	mov rdi, r15
@@ -399,91 +250,7 @@ _start:
399 250
 	syscall
400 251
 
401 252
 	push r15
402
-	jmp r15 ; end... jumping in bf code map
403
-
404
-	.write_elf: ; writing elf file
405
-	mov rax, [rsp] ; map len
406
-	add rax, bf_start_head_sz
407
-	mov [elf_section_text_sz], rax
408
-	add rax, elf_head_sz ; elf head + map_ptr
409
-	mov [elf_head + 0x60], rax
410
-	mov [elf_head + 0x68], rax
411
-	mov [elf_section_strtab_off], rax
412
-	add rax, elf_shstrtab_sz ; section head offset
413
-	xor r14, r14 ; store align padding for section header
414
-	xor rbx, rbx
415
-	mov bl, al
416
-	and bl, 0x0F
417
-	test bl, bl
418
-	jz .aligned_section
419
-	mov r14, 0x10
420
-	sub r14, rbx
421
-	and al, 0xF0
422
-	add rax, 0x10
423
-	.aligned_section:
424
-	mov [elf_head + 0x28], rax
425
-
426
-	mov rax, 0x2
427
-	mov rdi, elf_file
428
-	mov rsi, 0x40 | 0x200 | 0x1 ; O_CREAT | O_TRUNC | O_WRONLY
429
-	mov rdx, 755o ; perm
430
-	syscall
431
-	cmp rax, 0
432
-	jl .err_open
433
-
434
-	push rax ; fd
435
-
436
-	mov rax, 1
437
-	mov rdi, [rsp]
438
-	mov rsi, elf_head
439
-	mov rdx, elf_head_sz
440
-	syscall
441
-
442
-	mov rax, 1
443
-	mov rdi, [rsp]
444
-	mov rsi, bf_start_head
445
-	mov rdx, bf_start_head_sz
446
-	syscall
447
-
448
-	mov rax, 1
449
-	mov rdi, [rsp]
450
-	mov rsi, r15 ; map_addr
451
-	mov rdx, [rsp+8] ; map len
452
-	syscall
453
-
454
-	mov rax, 1
455
-	mov rdi, [rsp]
456
-	mov rsi, elf_shstrtab
457
-	mov rdx, elf_shstrtab_sz
458
-	syscall
459
-
460
-	.padloop:
461
-		test r14, r14
462
-		jz .end_padloop
463
-		mov rax, 1
464
-		mov rdi, [rsp]
465
-		mov rsi, elf_section_headers ; 0x0
466
-		mov rdx, 1
467
-		syscall
468
-		dec r14
469
-		jmp .padloop
470
-	.end_padloop:
471
-
472
-	mov rax, 1
473
-	mov rdi, [rsp]
474
-	mov rsi, elf_section_headers
475
-	mov rdx, elf_section_headers_sz
476
-	syscall
477
-
478
-	pop rdi ; fd
479
-	mov rax, 0x3 ; close
480
-	syscall
481
-	pop rax ; map_len
482
-
483
-	mov rax, 0x3c ; exit
484
-	xor rdi, rdi
485
-	syscall
486
-
253
+	jmp r15
487 254
 
488 255
 	.err_open:
489 256
 		mov rax, 1 ; write
@@ -528,9 +295,6 @@ _start:
528 295
 		mov rax, 0x3c ; exit
529 296
 		mov rdi, 1
530 297
 		syscall
531
-%undef heap_size
532
-%undef elf_file
533
-%undef bf_source
534 298
 
535 299
 ; Init a writable memory map
536 300
 ; len in rsi
@@ -585,9 +349,7 @@ mremap:
585 349
 ;	r14 map size
586 350
 ;	r15 map addr
587 351
 ; ret :
588
-;	rax map ptr
589
-;	r15 map addr
590
-;	r14 map size
352
+;	rax map addr
591 353
 compile_bf:
592 354
 	; Allocating growing heap to store various datas
593 355
 	; heap start will be stored in r13
@@ -753,10 +515,7 @@ compile_bf:
753 515
 			push rdx
754 516
 			jmp .callcpy
755 517
 		.loopstart:
756
-			mov rbx, map_ptr
757
-			sub rbx, r15
758
-			push rbx ; loop offset from map start
759
-			;push qword map_ptr ; ret addr
518
+			push qword map_ptr ; ret addr
760 519
 			mov rsi, bf_loopstart
761 520
 			mov rdx, bf_loopstart_sz
762 521
 			push rdx
@@ -768,15 +527,13 @@ compile_bf:
768 527
 			mov rdx, bf_loopend_sz
769 528
 			push rdx
770 529
 			call code_cpy
771
-			mov map_ptr, rax ; rax is map_ptr
530
+			mov map_ptr, rax
772 531
 			pop rdx
773 532
 			sub rax, rdx
774 533
 			add rax, 2 ;arg addr in code map
775
-			pop rbx ; loop_start code offset
534
+			pop rbx ; loop_start code addr
776 535
 			mov [rax], rbx ; loop end jump to start
777 536
 			mov rax, map_ptr
778
-			sub rax, r15 ; loop end offset in map
779
-			add rbx, r15 ; loop start addr
780 537
 			mov [rbx+2], rax ; start jump to end
781 538
 			jmp .nxtinstr
782 539
 
@@ -850,18 +607,15 @@ compile_bf:
850 607
 	mov rsi, bf_exit
851 608
 	mov rdx, bf_exit_sz
852 609
 	call code_cpy
853
-	mov map_ptr, rax
854 610
 
855 611
 	; restoring stack
856 612
 	mov rsp, base_rsp
857
-	push qword map_ptr
858 613
 
859 614
 	; restore heap
860 615
 	mov rax, 0xc ; brk
861 616
 	mov rdi, r13
862 617
 	syscall
863 618
 
864
-	pop rax ; return map_ptr
865 619
 	ret
866 620
 
867 621
 %undef fd

Loading…
Cancel
Save