From b6f008da284871b73bcc3525ad9214ed09fc6121 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Fri, 27 Dec 2024 13:44:52 +0100 Subject: implement loop operators --- bfc.S | 50 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) (limited to 'bfc.S') 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 -- cgit v1.2.3-70-g09d2