prog in rsi

opt
Szymon Karpiński 6 years ago
parent 06f674bb6e
commit d2a35c5b0e
  1. 42
      brainfuck.asm

@ -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

Loading…
Cancel
Save