data in rdi

opt
Szymon Karpiński 6 years ago
parent 8727e0be0f
commit 06f674bb6e
  1. 24
      brainfuck.asm

@ -31,7 +31,7 @@ bf_tape: resb TAPE_SIZE
section .text: section .text:
; Podczas interpretacji programu znaczenia rejestrów są następujące: ; 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 ; - 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 ; 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 align 8
times 8*('+'-1) ret times 8*('+'-1) ret
bf_increment: ; '+' ascii 43 bf_increment: ; '+' ascii 43
inc byte [rsi] inc byte [rdi]
inc rbx inc rbx
ret ret
align 8 align 8
@ -53,7 +53,7 @@ bf_instructions:
jmp bf_in jmp bf_in
align 8 align 8
bf_decr: ; '-' ascii 45 bf_decr: ; '-' ascii 45
dec byte [rsi] dec byte [rdi]
inc rbx inc rbx
ret ret
align 8 align 8
@ -63,13 +63,13 @@ bf_instructions:
align 8 align 8
times 8*('<'-'.'-1) ret times 8*('<'-'.'-1) ret
bf_left: ; '<' ascii 60 bf_left: ; '<' ascii 60
dec rsi dec rdi
inc rbx inc rbx
ret ret
align 8 align 8
times 8*('>'-'<'-1) ret times 8*('>'-'<'-1) ret
bf_right: ; '>' ascii 62 bf_right: ; '>' ascii 62
inc rsi inc rdi
inc rbx inc rbx
ret ret
align 8 align 8
@ -83,7 +83,7 @@ bf_instructions:
align 8 align 8
bf_forward: bf_forward:
cmp byte [rsi], 0 cmp byte [rdi], 0
jne bf_forward_end jne bf_forward_end
jmp bf_jump jmp bf_jump
bf_forward_end: bf_forward_end:
@ -91,7 +91,7 @@ bf_instructions:
ret ret
bf_backward: bf_backward:
cmp byte [rsi], 0 cmp byte [rdi], 0
je bf_backward_end je bf_backward_end
jmp bf_jump jmp bf_jump
bf_backward_end: bf_backward_end:
@ -105,20 +105,24 @@ bf_instructions:
ret ret
bf_out: bf_out:
movzx rdi, byte [rsi] push rdi
push rsi push rsi
movzx rdi, byte [rdi]
call putchar call putchar
xor rdi, rdi xor rdi, rdi
call fflush call fflush
pop rsi pop rsi
pop rdi
inc rbx inc rbx
ret ret
bf_in: bf_in:
push rdi
push rsi push rsi
call getchar call getchar
pop rsi pop rsi
mov byte [rsi], al pop rdi
mov byte [rdi], al
inc rbx inc rbx
ret ret
@ -154,7 +158,7 @@ _jump_loop:
lea rbx, [bf_program] lea rbx, [bf_program]
lea rsi, [bf_tape] lea rdi, [bf_tape]
_program_loop: _program_loop:
movzx rax, byte [rbx] movzx rax, byte [rbx]
lea rax, [bf_instructions + 8*rax] lea rax, [bf_instructions + 8*rax]

Loading…
Cancel
Save