diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-12-27 13:44:52 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-12-27 13:44:52 +0100 |
| commit | b6f008da284871b73bcc3525ad9214ed09fc6121 (patch) | |
| tree | 656005cca466523a1ebb3498b44b531b5c0da03d /bfc.S | |
| parent | 337c7d7ec81540938af906e490a5aee9025febf0 (diff) | |
implement loop operators
Diffstat (limited to 'bfc.S')
| -rw-r--r-- | bfc.S | 50 |
1 files changed, 42 insertions, 8 deletions
@@ -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 |