opsftw

NASM BF Interpreter

Jul 1st, 2026
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %include "io64.inc"
  2.  
  3. section .bss
  4.     input:      resb 20000
  5.     array:      resb 20000
  6.     loop_stack: resq 100
  7.  
  8. section .text
  9.     global main
  10.     extern _read
  11.  
  12. main:
  13.     mov rbp, rsp
  14.  
  15.     sub rsp, 40
  16.     mov rcx, 0
  17.     lea rdx, [input]
  18.     mov r8, 20000
  19.     call _read
  20.     mov byte [input + rax], 0
  21.     add rsp, 40
  22.  
  23.     lea rsi, [input]
  24.     lea rdi, [array]
  25.     lea rbp, [loop_stack]
  26.  
  27.     mov r8, 0
  28.     mov r9, 0
  29.     mov r10, 0
  30.  
  31. .scan:
  32.     mov al, [rsi]
  33.  
  34.     test al, al
  35.     jz .done
  36.     inc rsi
  37.  
  38.     test r10, r10
  39.     jz .normal
  40.     cmp al, '['
  41.     je .skip_up
  42.     cmp al, ']'
  43.     je .skip_down
  44.     jmp .scan
  45. .skip_up:
  46.     inc r10
  47.     jmp .scan
  48. .skip_down:
  49.     dec r10
  50.     jmp .scan
  51.  
  52. .normal:
  53.     call loop_start_sub
  54.     test cl, cl
  55.     jne .scan
  56.  
  57.     call loop_end_sub
  58.     test cl, cl
  59.     jne .scan
  60.  
  61.     call plus_sub
  62.     test cl, cl
  63.     jne .scan
  64.  
  65.     call minus_sub
  66.     test cl, cl
  67.     jne .scan
  68.  
  69.     call right_sub
  70.     test cl, cl
  71.     jne .scan
  72.  
  73.     call left_sub
  74.     test cl, cl
  75.     jne .scan
  76.  
  77.     call dot_sub
  78.  
  79.     jmp .scan
  80.  
  81. .done:
  82.     ret
  83.  
  84.  
  85. plus_sub:
  86.     cmp al, '+'
  87.     sete cl
  88.     jne .ret
  89.     inc byte [rdi + r8]
  90. .ret:
  91.     ret
  92.  
  93.  
  94. minus_sub:
  95.     cmp al, '-'
  96.     sete cl
  97.     jne .ret
  98.     dec byte [rdi + r8]
  99. .ret:
  100.     ret
  101.  
  102.  
  103. right_sub:
  104.     cmp al, '>'
  105.     sete cl
  106.     jne .ret
  107.     inc r8
  108. .ret:
  109.     ret
  110.  
  111.  
  112. left_sub:
  113.     cmp al, '<'
  114.     sete cl
  115.     jne .ret
  116.     dec r8
  117. .ret:
  118.     ret
  119.  
  120.  
  121. dot_sub:
  122.     cmp al, '.'
  123.     jne .ret
  124.     movzx rax, byte [rdi + r8]
  125.     PRINT_CHAR rax
  126. .ret:
  127.     ret
  128.  
  129.  
  130. loop_start_sub:
  131.     cmp al, '['
  132.     sete cl
  133.     jne .ret
  134.     cmp byte [rdi + r8], 0
  135.     jne .cont
  136.     mov r10, 1
  137.     jmp .ret
  138. .cont:
  139.     mov [rbp + r9*8], rsi
  140.     inc r9
  141. .ret:
  142.     ret
  143.  
  144.  
  145. loop_end_sub:
  146.     cmp al, ']'
  147.     sete cl
  148.     jne .ret
  149.     cmp byte [rdi + r8], 0
  150.     je .finish
  151.     mov rsi, [rbp + (r9-1)*8]
  152.     jmp .ret
  153. .finish:
  154.     dec r9
  155. .ret:
  156.     ret
Advertisement
Add Comment
Please, Sign In to add comment