Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %include "io64.inc"
- section .bss
- input: resb 20000
- array: resb 20000
- loop_stack: resq 100
- section .text
- global main
- extern _read
- main:
- mov rbp, rsp
- sub rsp, 40
- mov rcx, 0
- lea rdx, [input]
- mov r8, 20000
- call _read
- mov byte [input + rax], 0
- add rsp, 40
- lea rsi, [input]
- lea rdi, [array]
- lea rbp, [loop_stack]
- mov r8, 0
- mov r9, 0
- mov r10, 0
- .scan:
- mov al, [rsi]
- test al, al
- jz .done
- inc rsi
- test r10, r10
- jz .normal
- cmp al, '['
- je .skip_up
- cmp al, ']'
- je .skip_down
- jmp .scan
- .skip_up:
- inc r10
- jmp .scan
- .skip_down:
- dec r10
- jmp .scan
- .normal:
- call loop_start_sub
- test cl, cl
- jne .scan
- call loop_end_sub
- test cl, cl
- jne .scan
- call plus_sub
- test cl, cl
- jne .scan
- call minus_sub
- test cl, cl
- jne .scan
- call right_sub
- test cl, cl
- jne .scan
- call left_sub
- test cl, cl
- jne .scan
- call dot_sub
- jmp .scan
- .done:
- ret
- plus_sub:
- cmp al, '+'
- sete cl
- jne .ret
- inc byte [rdi + r8]
- .ret:
- ret
- minus_sub:
- cmp al, '-'
- sete cl
- jne .ret
- dec byte [rdi + r8]
- .ret:
- ret
- right_sub:
- cmp al, '>'
- sete cl
- jne .ret
- inc r8
- .ret:
- ret
- left_sub:
- cmp al, '<'
- sete cl
- jne .ret
- dec r8
- .ret:
- ret
- dot_sub:
- cmp al, '.'
- jne .ret
- movzx rax, byte [rdi + r8]
- PRINT_CHAR rax
- .ret:
- ret
- loop_start_sub:
- cmp al, '['
- sete cl
- jne .ret
- cmp byte [rdi + r8], 0
- jne .cont
- mov r10, 1
- jmp .ret
- .cont:
- mov [rbp + r9*8], rsi
- inc r9
- .ret:
- ret
- loop_end_sub:
- cmp al, ']'
- sete cl
- jne .ret
- cmp byte [rdi + r8], 0
- je .finish
- mov rsi, [rbp + (r9-1)*8]
- jmp .ret
- .finish:
- dec r9
- .ret:
- ret
Advertisement
Add Comment
Please, Sign In to add comment