aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfc.S50
1 files changed, 42 insertions, 8 deletions
diff --git a/bfc.S b/bfc.S
index 04c3b39..134d2d1 100644
--- a/bfc.S
+++ b/bfc.S
@@ -28,15 +28,11 @@ t_move_head_left:
t_move_head_left_end:
t_increase_cell:
- mov (%rbx), %al
- inc %al
- mov %al, (%rbx)
+ incb (%rbx)
t_increase_cell_end:
t_decrease_cell:
- mov (%rbx), %al
- dec %al
- mov %al, (%rbx)
+ decb (%rbx)
t_decrease_cell_end:
t_write_cell:
@@ -55,6 +51,18 @@ t_read_cell:
syscall
t_read_cell_end:
+t_check_zero:
+ mov (%rbx), %rax
+ cmp $0, %rax
+ .byte 0xf, 0x84 # `je` instruction
+ .int 0x0 # relative offset
+t_check_zero_end:
+
+t_jump_back:
+ .byte 0xe9 # `jmp` instruction
+ .int 0x0 # absolute offset
+t_jump_back_end:
+
.section constants, "a"
c_elf_header:
@@ -230,11 +238,31 @@ l_compile_dec:
call f_write_to_buffer
jmp l_read_loop
l_compile_loop_start:
- jmp l_read_loop
+ mov $v_buffer_cursor, %rbx
+ push (%rbx)
-l_compile_loop_end:
+ mov $t_check_zero, %rdi
+ mov $t_check_zero_end, %rsi
+ call f_write_to_buffer
jmp l_read_loop
+l_compile_loop_end:
+ pop %r15
+ mov $t_jump_back, %rdi
+ mov $t_jump_back_end, %rsi
+ call f_write_to_buffer
+
+ mov $v_buffer_cursor, %rbx
+ mov (%rbx), %rax
+
+ mov %r15, %rbx
+ sub %rax, %r15
+ mov %r15d, -4(%rax)
+ neg %r15
+ sub $13, %r15
+ mov %r15d, 9(%rbx)
+
+ jmp l_read_loop
l_compile_write:
mov $t_write_cell, %rdi
mov $t_write_cell_end, %rsi
@@ -385,6 +413,12 @@ f_open_files:
syscall
mov $v_output_fd, %rbx
mov %eax, (%rbx)
+
+ mov %eax, %edi
+ mov $0, %rsi
+ mov $77, %rax
+ syscall
+
ret