aboutsummaryrefslogtreecommitdiff
path: root/bfc.S
diff options
context:
space:
mode:
Diffstat (limited to 'bfc.S')
-rw-r--r--bfc.S158
1 files changed, 113 insertions, 45 deletions
diff --git a/bfc.S b/bfc.S
index 52c23e3..04c3b39 100644
--- a/bfc.S
+++ b/bfc.S
@@ -8,6 +8,53 @@
.set F_CREATE_AND_WRITE, 0x41
.set F_MODE_EXECUTABLE, 0744
+.section translations, "a"
+
+t_init:
+ mov $0x3001b0, %rbx
+t_init_end:
+
+t_exit:
+ mov $60, %rax
+ syscall
+t_exit_end:
+
+t_move_head_right:
+ inc %rbx
+t_move_head_right_end:
+
+t_move_head_left:
+ dec %rbx
+t_move_head_left_end:
+
+t_increase_cell:
+ mov (%rbx), %al
+ inc %al
+ mov %al, (%rbx)
+t_increase_cell_end:
+
+t_decrease_cell:
+ mov (%rbx), %al
+ dec %al
+ mov %al, (%rbx)
+t_decrease_cell_end:
+
+t_write_cell:
+ mov $1, %rax
+ mov $1, %rdi
+ mov %rbx, %rsi
+ mov $1, %rdx
+ syscall
+t_write_cell_end:
+
+t_read_cell:
+ mov $0, %rax
+ mov $0, %rdi
+ mov %rbx, %rsi
+ mov $1, %rdx
+ syscall
+t_read_cell_end:
+
.section constants, "a"
c_elf_header:
@@ -133,66 +180,55 @@ _start:
call f_open_files
call f_init_buffer
+ mov $t_init, %rdi
+ mov $t_init_end, %rsi
+ call f_write_to_buffer
+
l_read_loop:
call f_read_next_character
cmp $0, %rax
je l_read_loop_end
mov $v_input_char, %rbx
- mov (%rbx), %rax
- cmp $'<', %rax
+ mov (%rbx), %al
+ cmp $'<', %al
je l_compile_move_left
- cmp $'>', %rax
+ cmp $'>', %al
je l_compile_move_right
- cmp $'+', %rax
+ cmp $'+', %al
je l_compile_inc
- cmp $'-', %rax
+ cmp $'-', %al
je l_compile_dec
- cmp $'[', %rax
+ cmp $'[', %al
je l_compile_loop_start
- cmp $']', %rax
+ cmp $']', %al
je l_compile_loop_end
- cmp $'.', %rax
+ cmp $'.', %al
je l_compile_write
- cmp $',', %rax
+ cmp $',', %al
je l_compile_read
jmp l_read_loop
l_compile_move_left:
- # TODO: fix buffer overflows
- mov $v_buffer_cursor, %rbx
- mov (%rbx), %rsi
- add $3, %rsi
- call f_check_buffer
-
- mov $v_buffer_cursor, %rbx
- mov (%rbx), %rax
- movl $0xc0ff48, (%rax)
- add $3, %rax
- mov %rax, (%rbx)
-
+ mov $t_move_head_left, %rdi
+ mov $t_move_head_left_end, %rsi
+ call f_write_to_buffer
jmp l_read_loop
-
l_compile_move_right:
- # TODO: fix buffer overflows
- mov $v_buffer_cursor, %rbx
- mov (%rbx), %rsi
- add $3, %rsi
- call f_check_buffer
-
- mov $v_buffer_cursor, %rbx
- mov (%rbx), %rax
- movl $0xc8ff48, (%rax)
- add $3, %rax
- mov %rax, (%rbx)
+ mov $t_move_head_right, %rdi
+ mov $t_move_head_right_end, %rsi
+ call f_write_to_buffer
jmp l_read_loop
-
l_compile_inc:
+ mov $t_increase_cell, %rdi
+ mov $t_increase_cell_end, %rsi
+ call f_write_to_buffer
jmp l_read_loop
-
l_compile_dec:
+ mov $t_decrease_cell, %rdi
+ mov $t_decrease_cell_end, %rsi
+ call f_write_to_buffer
jmp l_read_loop
-
l_compile_loop_start:
jmp l_read_loop
@@ -200,19 +236,19 @@ l_compile_loop_end:
jmp l_read_loop
l_compile_write:
+ mov $t_write_cell, %rdi
+ mov $t_write_cell_end, %rsi
+ call f_write_to_buffer
jmp l_read_loop
-
l_compile_read:
+ mov $t_read_cell, %rdi
+ mov $t_read_cell_end, %rsi
+ call f_write_to_buffer
jmp l_read_loop
-
l_read_loop_end:
- mov $v_buffer_cursor, %rbx
- mov (%rbx), %rax
- movl $0x3cc0c748, (%rax)
- add $7, %rax
- movl $0x050f, (%rax)
- add $2, %rax
- mov %rax, (%rbx)
+ mov $t_exit, %rdi
+ mov $t_exit_end, %rsi
+ call f_write_to_buffer
mov $v_buffer_cursor, %rbx
@@ -276,12 +312,43 @@ f_exit:
mov $SYS_EXIT, %rax
syscall
+
/* rsi = buffer, %rdx = len */
f_write_to_output:
mov $SYS_WRITE, %rax
mov $v_output_fd, %rbx
mov (%rbx), %rdi
syscall
+ ret
+
+
+/* rdi = buffer, %rsi = buffer end */
+f_write_to_buffer:
+ sub %rdi, %rsi
+ mov %rsi, %r12
+ mov %rdi, %r13
+ mov $v_buffer_cursor, %rbx
+ mov (%rbx), %rax
+ add %rax, %rsi
+ call f_check_buffer
+
+ mov $v_buffer_cursor, %rbx
+ mov (%rbx), %rax
+
+l_write_loop_start:
+ cmp $0, %r12
+ je l_write_loop_end
+
+ mov (%r13), %sil
+ mov %sil, (%rax)
+
+ inc %r13
+ inc %rax
+ dec %r12
+ jmp l_write_loop_start
+l_write_loop_end:
+ mov %rax, (%rbx)
+ ret
f_check_args:
@@ -342,6 +409,7 @@ f_init_buffer:
mov %rax, (%rbx)
mov $v_buffer_cursor, %rbx
mov %rax, (%rbx)
+ jmp f_resize_buffer
/*
* We directly skip to f_resize_buffer
* since we want to resize it to a usable amount