|
|
|
|
@ -31,7 +31,7 @@ bf_tape: resb TAPE_SIZE |
|
|
|
|
section .text: |
|
|
|
|
|
|
|
|
|
; Podczas interpretacji programu znaczenia rejestrów są następujące: |
|
|
|
|
; - rsi jest wskaźnikiem programu |
|
|
|
|
; - rdi jest wskaźnikiem programu |
|
|
|
|
; - rbx jest wskaźnikiem na aktualne pole na taśmie |
|
|
|
|
|
|
|
|
|
; Tablica 8-bajtowych kawałków kodu, w której na miejscu 8*i znajduje się kod zakończony |
|
|
|
|
@ -45,7 +45,7 @@ bf_instructions: |
|
|
|
|
align 8 |
|
|
|
|
times 8*('+'-1) ret |
|
|
|
|
bf_increment: ; '+' ascii 43 |
|
|
|
|
inc byte [rsi] |
|
|
|
|
inc byte [rdi] |
|
|
|
|
inc rbx |
|
|
|
|
ret |
|
|
|
|
align 8 |
|
|
|
|
@ -53,7 +53,7 @@ bf_instructions: |
|
|
|
|
jmp bf_in |
|
|
|
|
align 8 |
|
|
|
|
bf_decr: ; '-' ascii 45 |
|
|
|
|
dec byte [rsi] |
|
|
|
|
dec byte [rdi] |
|
|
|
|
inc rbx |
|
|
|
|
ret |
|
|
|
|
align 8 |
|
|
|
|
@ -63,13 +63,13 @@ bf_instructions: |
|
|
|
|
align 8 |
|
|
|
|
times 8*('<'-'.'-1) ret |
|
|
|
|
bf_left: ; '<' ascii 60 |
|
|
|
|
dec rsi |
|
|
|
|
dec rdi |
|
|
|
|
inc rbx |
|
|
|
|
ret |
|
|
|
|
align 8 |
|
|
|
|
times 8*('>'-'<'-1) ret |
|
|
|
|
bf_right: ; '>' ascii 62 |
|
|
|
|
inc rsi |
|
|
|
|
inc rdi |
|
|
|
|
inc rbx |
|
|
|
|
ret |
|
|
|
|
align 8 |
|
|
|
|
@ -83,7 +83,7 @@ bf_instructions: |
|
|
|
|
align 8 |
|
|
|
|
|
|
|
|
|
bf_forward: |
|
|
|
|
cmp byte [rsi], 0 |
|
|
|
|
cmp byte [rdi], 0 |
|
|
|
|
jne bf_forward_end |
|
|
|
|
jmp bf_jump |
|
|
|
|
bf_forward_end: |
|
|
|
|
@ -91,7 +91,7 @@ bf_instructions: |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
bf_backward: |
|
|
|
|
cmp byte [rsi], 0 |
|
|
|
|
cmp byte [rdi], 0 |
|
|
|
|
je bf_backward_end |
|
|
|
|
jmp bf_jump |
|
|
|
|
bf_backward_end: |
|
|
|
|
@ -105,20 +105,24 @@ bf_instructions: |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
bf_out: |
|
|
|
|
movzx rdi, byte [rsi] |
|
|
|
|
push rdi |
|
|
|
|
push rsi |
|
|
|
|
movzx rdi, byte [rdi] |
|
|
|
|
call putchar |
|
|
|
|
xor rdi, rdi |
|
|
|
|
call fflush |
|
|
|
|
pop rsi |
|
|
|
|
pop rdi |
|
|
|
|
inc rbx |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
bf_in: |
|
|
|
|
push rdi |
|
|
|
|
push rsi |
|
|
|
|
call getchar |
|
|
|
|
pop rsi |
|
|
|
|
mov byte [rsi], al |
|
|
|
|
pop rdi |
|
|
|
|
mov byte [rdi], al |
|
|
|
|
inc rbx |
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
@ -154,7 +158,7 @@ _jump_loop: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lea rbx, [bf_program] |
|
|
|
|
lea rsi, [bf_tape] |
|
|
|
|
lea rdi, [bf_tape] |
|
|
|
|
_program_loop: |
|
|
|
|
movzx rax, byte [rbx] |
|
|
|
|
lea rax, [bf_instructions + 8*rax] |
|
|
|
|
|