1. .intel_syntax noprefix
    
  2. 
    
  3. .global tape
    
  4. .global i
    
  5. .global pc
    
  6. .global plus
    
  7. .global plus_end
    
  8. .global minus
    
  9. .global minus_end
    
  10. .global right
    
  11. .global right_end
    
  12. .global left
    
  13. .global left_end
    
  14. .global dot
    
  15. .global dot_end
    
  16. .global prologue
    
  17. .global prologue_end
    
  18. .global bleft
    
  19. .global bleft_end
    
  20. .global bright
    
  21. .global bright_end
    
  22. 
    
  23. # prologue is expected to ret.
    
  24. prologue:
    
  25.     ret
    
  26. prologue_end:
    
  27.     ret
    
  28. 
    
  29. plus:
    
  30.     movsxd rsi, dword ptr [i]
    
  31.     inc byte ptr [tape+rsi]
    
  32. plus_end:
    
  33.     ret
    
  34. 
    
  35. minus:
    
  36.     movsxd rsi, dword ptr [i]
    
  37.     dec byte ptr [tape+rsi]
    
  38. minus_end:
    
  39.     ret
    
  40. 
    
  41. right:
    
  42.     # inc rsi
    
  43.     inc dword ptr [i]
    
  44. right_end:
    
  45.     ret
    
  46. 
    
  47. left:
    
  48.     dec dword ptr [i]
    
  49. left_end:
    
  50.     ret
    
  51. 
    
  52. dot:
    
  53.     # write(1, &tape[i], 1 /*single byte*/);
    
  54.     mov rax, 1 # write syscall
    
  55.     mov rdi, 1 # stdout
    
  56.     movsxd rsi, dword ptr [i] # tape[i]
    
  57.     lea rsi, [tape+rsi]
    
  58.     mov rdx, 1 # length = one byte
    
  59.     syscall
    
  60. dot_end:
    
  61.     ret
    
  62. 
    
  63. # branch operators
    
  64. # jump instructions encode relative offset into the instruction,
    
  65. # so these instructions will need to be patched by the compiler.
    
  66. # offsets are relative to next instruction.
    
  67. #
    
  68. # Jumps are written as large constants, rather than labels, to ensure
    
  69. # rel32 jump variants are assembled.
    
  70. 
    
  71. # [ : jump if tape[i] == 0 
    
  72. bleft:
    
  73.     movsxd rsi, dword ptr [i]
    
  74.     mov al, byte ptr [tape+rsi]
    
  75.     test al, al
    
  76.     jz 0x123456 # 0f 84 rel32
    
  77. bleft_end:
    
  78.     ret
    
  79. 
    
  80. # ] : jump if tape[i] != 0
    
  81. bright:
    
  82.     movsxd rsi, dword ptr [i]
    
  83.     mov al, byte ptr [tape+rsi]
    
  84.     test al, al
    
  85.     jnz 0x123456 # 0f 85 rel32
    
  86. bright_end:
    
  87.     ret
    
  88.