|
|
|
@ -32,7 +32,7 @@ section .text: |
|
|
|
|
|
|
|
|
|
|
|
; Podczas interpretacji programu znaczenia rejestrów są następujące: |
|
|
|
; Podczas interpretacji programu znaczenia rejestrów są następujące: |
|
|
|
; - rdi jest wskaźnikiem programu |
|
|
|
; - rdi jest wskaźnikiem programu |
|
|
|
; - rbx jest wskaźnikiem na aktualne pole na taśmie |
|
|
|
; - rsi 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 |
|
|
|
; Tablica 8-bajtowych kawałków kodu, w której na miejscu 8*i znajduje się kod zakończony |
|
|
|
; instrukcją powrotu, który należy wykonać dla znaku o kodzie ascii równym i. Operacje, |
|
|
|
; instrukcją powrotu, który należy wykonać dla znaku o kodzie ascii równym i. Operacje, |
|
|
|
@ -46,7 +46,7 @@ bf_instructions: |
|
|
|
times 8*('+'-1) ret |
|
|
|
times 8*('+'-1) ret |
|
|
|
bf_increment: ; '+' ascii 43 |
|
|
|
bf_increment: ; '+' ascii 43 |
|
|
|
inc byte [rdi] |
|
|
|
inc byte [rdi] |
|
|
|
inc rbx |
|
|
|
inc rsi |
|
|
|
ret |
|
|
|
ret |
|
|
|
align 8 |
|
|
|
align 8 |
|
|
|
bf_in_stub: ; ',' ascii 44 |
|
|
|
bf_in_stub: ; ',' ascii 44 |
|
|
|
@ -54,7 +54,7 @@ bf_instructions: |
|
|
|
align 8 |
|
|
|
align 8 |
|
|
|
bf_decr: ; '-' ascii 45 |
|
|
|
bf_decr: ; '-' ascii 45 |
|
|
|
dec byte [rdi] |
|
|
|
dec byte [rdi] |
|
|
|
inc rbx |
|
|
|
inc rsi |
|
|
|
ret |
|
|
|
ret |
|
|
|
align 8 |
|
|
|
align 8 |
|
|
|
bf_out_stub: ; '.' ascii 46 |
|
|
|
bf_out_stub: ; '.' ascii 46 |
|
|
|
@ -64,13 +64,13 @@ bf_instructions: |
|
|
|
times 8*('<'-'.'-1) ret |
|
|
|
times 8*('<'-'.'-1) ret |
|
|
|
bf_left: ; '<' ascii 60 |
|
|
|
bf_left: ; '<' ascii 60 |
|
|
|
dec rdi |
|
|
|
dec rdi |
|
|
|
inc rbx |
|
|
|
inc rsi |
|
|
|
ret |
|
|
|
ret |
|
|
|
align 8 |
|
|
|
align 8 |
|
|
|
times 8*('>'-'<'-1) ret |
|
|
|
times 8*('>'-'<'-1) ret |
|
|
|
bf_right: ; '>' ascii 62 |
|
|
|
bf_right: ; '>' ascii 62 |
|
|
|
inc rdi |
|
|
|
inc rdi |
|
|
|
inc rbx |
|
|
|
inc rsi |
|
|
|
ret |
|
|
|
ret |
|
|
|
align 8 |
|
|
|
align 8 |
|
|
|
times 8*('['-'>'-1) ret |
|
|
|
times 8*('['-'>'-1) ret |
|
|
|
@ -87,7 +87,7 @@ bf_instructions: |
|
|
|
jne bf_forward_end |
|
|
|
jne bf_forward_end |
|
|
|
jmp bf_jump |
|
|
|
jmp bf_jump |
|
|
|
bf_forward_end: |
|
|
|
bf_forward_end: |
|
|
|
inc rbx |
|
|
|
inc rsi |
|
|
|
ret |
|
|
|
ret |
|
|
|
|
|
|
|
|
|
|
|
bf_backward: |
|
|
|
bf_backward: |
|
|
|
@ -95,13 +95,13 @@ bf_instructions: |
|
|
|
je bf_backward_end |
|
|
|
je bf_backward_end |
|
|
|
jmp bf_jump |
|
|
|
jmp bf_jump |
|
|
|
bf_backward_end: |
|
|
|
bf_backward_end: |
|
|
|
inc rbx |
|
|
|
inc rsi |
|
|
|
ret |
|
|
|
ret |
|
|
|
|
|
|
|
|
|
|
|
bf_jump: |
|
|
|
bf_jump: |
|
|
|
sub rbx, bf_program |
|
|
|
sub rsi, bf_program |
|
|
|
mov rbx, [8*rbx + bf_jumps] |
|
|
|
mov rsi, [8*rsi + bf_jumps] |
|
|
|
inc rbx |
|
|
|
inc rsi |
|
|
|
ret |
|
|
|
ret |
|
|
|
|
|
|
|
|
|
|
|
bf_out: |
|
|
|
bf_out: |
|
|
|
@ -113,7 +113,7 @@ bf_instructions: |
|
|
|
call fflush |
|
|
|
call fflush |
|
|
|
pop rsi |
|
|
|
pop rsi |
|
|
|
pop rdi |
|
|
|
pop rdi |
|
|
|
inc rbx |
|
|
|
inc rsi |
|
|
|
ret |
|
|
|
ret |
|
|
|
|
|
|
|
|
|
|
|
bf_in: |
|
|
|
bf_in: |
|
|
|
@ -123,7 +123,7 @@ bf_instructions: |
|
|
|
pop rsi |
|
|
|
pop rsi |
|
|
|
pop rdi |
|
|
|
pop rdi |
|
|
|
mov byte [rdi], al |
|
|
|
mov byte [rdi], al |
|
|
|
inc rbx |
|
|
|
inc rsi |
|
|
|
ret |
|
|
|
ret |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -135,32 +135,32 @@ call gets |
|
|
|
|
|
|
|
|
|
|
|
; Buduję tablicę skoków dla ']'. Jeśli i-ty znak programu to nawias, to na 8*i-tym miejscu w tablicy |
|
|
|
; Buduję tablicę skoków dla ']'. Jeśli i-ty znak programu to nawias, to na 8*i-tym miejscu w tablicy |
|
|
|
; skoków znajdzie się adres odpowiadającego mu nawiasu. |
|
|
|
; skoków znajdzie się adres odpowiadającego mu nawiasu. |
|
|
|
lea rbx, [bf_program] |
|
|
|
lea rsi, [bf_program] |
|
|
|
lea r12, [bf_jumps] |
|
|
|
lea r12, [bf_jumps] |
|
|
|
_jump_loop: |
|
|
|
_jump_loop: |
|
|
|
cmp byte [rbx], '[' |
|
|
|
cmp byte [rsi], '[' |
|
|
|
jne .else |
|
|
|
jne .else |
|
|
|
push r12 |
|
|
|
push r12 |
|
|
|
push rbx |
|
|
|
push rsi |
|
|
|
jmp .end |
|
|
|
jmp .end |
|
|
|
.else: |
|
|
|
.else: |
|
|
|
cmp byte [rbx], ']' |
|
|
|
cmp byte [rsi], ']' |
|
|
|
jne .end |
|
|
|
jne .end |
|
|
|
pop rax |
|
|
|
pop rax |
|
|
|
mov qword [r12], rax |
|
|
|
mov qword [r12], rax |
|
|
|
pop rax |
|
|
|
pop rax |
|
|
|
mov qword [rax], rbx |
|
|
|
mov qword [rax], rsi |
|
|
|
.end: |
|
|
|
.end: |
|
|
|
inc rbx |
|
|
|
inc rsi |
|
|
|
add r12, 8 |
|
|
|
add r12, 8 |
|
|
|
cmp byte [rbx], 0 |
|
|
|
cmp byte [rsi], 0 |
|
|
|
jnz _jump_loop |
|
|
|
jnz _jump_loop |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lea rbx, [bf_program] |
|
|
|
lea rsi, [bf_program] |
|
|
|
lea rdi, [bf_tape] |
|
|
|
lea rdi, [bf_tape] |
|
|
|
_program_loop: |
|
|
|
_program_loop: |
|
|
|
movzx rax, byte [rbx] |
|
|
|
movzx rax, byte [rsi] |
|
|
|
lea rax, [bf_instructions + 8*rax] |
|
|
|
lea rax, [bf_instructions + 8*rax] |
|
|
|
call rax |
|
|
|
call rax |
|
|
|
jmp _program_loop |
|
|
|
jmp _program_loop |
|
|
|
|