diff options
| -rw-r--r-- | bfc.S | 158 |
1 files changed, 113 insertions, 45 deletions
@@ -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 |