diff --git a/brainfuck.asm b/brainfuck.asm index 0e0e706..c21ed8e 100644 --- a/brainfuck.asm +++ b/brainfuck.asm @@ -73,33 +73,26 @@ bf_instructions: jmp rbx align 8 times 8*('['-'>'-1) hlt - bf_forward_stub: ; '[' ascii 91 - jmp bf_forward - align 8 - times 8*(']'-'['-1) hlt - bf_backward_stub: ; ']' ascii 93 - jmp bf_backward - align 8 - - bf_forward: + + bf_forward: ; '[' ascii 91 + ; jest 16 bajtów miejsca cmp byte [rdi], 0 - je bf_jump - bf_forward_end: + jne .dont_jump + mov rsi, [8*rsi + r14] + .dont_jump: inc rsi jmp rbx - - bf_backward: + align 8 + + bf_backward: ; ']' ascii 93 + ; więcej niż 8 bajtów, ale jest miejsce cmp byte [rdi], 0 - jne bf_jump - bf_backward_end: + je .dont_jump + mov rsi, [8*rsi + r14] + .dont_jump: inc rsi jmp rbx - bf_jump: - sub rsi, bf_program - mov rsi, [8*rsi + bf_jumps] - inc rsi - jmp rbx bf_out: push rdi @@ -156,7 +149,13 @@ _jump_loop: lea rsi, [bf_program] lea rdi, [bf_tape] -lea rbx, [_program_loop] +lea rbx, [_program_loop] ; stała + +lea r13, [bf_program] +shl r13, 3 +lea r14, [bf_jumps] +sub r14, r13 ; stała do zamiany adresu programu na adres w bf_jumps + _program_loop: movzx rax, byte [rsi] lea rax, [bf_instructions + 8*rax]