Advertisement
Guest User

Brainfuck compiler to x86 assembly

a guest
Jul 9th, 2021
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.41 KB | None | 0 0
  1.  
  2. import java.util.Scanner;
  3. import java.util.Stack;
  4.  
  5. public class Bf {
  6.  
  7.     static String program = ".section .data\n" +
  8.             "data_items: #These are the data items\n" +
  9.             "        .zero 65536\n" +
  10.             ".section .text\n" +
  11.             ".globl _start\n" +
  12.             "_start:\n" +
  13.             "movl $0, %edi\n";
  14.  
  15.     public static void main(String[] args){
  16.         Scanner in = new Scanner(System.in);
  17.         String s = in.next();
  18.         int label_num = 0;
  19.         Stack<Integer> jmp_labels = new Stack<Integer>();
  20.         for(int i = 0; i < s.length(); i++){
  21.             char c = s.charAt(i);
  22.             if(c == '>'){
  23.                 program += "inc %rdi\n";
  24.             }else if (c == '<'){
  25.                 program += "dec %rdi\n";
  26.             }else if (c == '+'){
  27.                 program += "incb data_items(,%rdi,1)\n";
  28.             }else if (c == '-'){
  29.                 program += "decb data_items(,%rdi,1)\n";
  30.             }else if (c == '.'){
  31.                 program += "mov %rdi, %rdx\n";
  32.                 program += "add $data_items, %rdx\n";
  33.                
  34.                 program += "mov     $1, %rax\n" +
  35.                         "mov     %rdi, %rcx\n" +
  36.                         "mov     $1, %rdi\n" +
  37.                         "mov     %rdx, %rsi\n" +
  38.                         "mov     $1, %rdx\n" +
  39.                         "mov     %rcx, %rdi\n" +
  40.                         "syscall\n";
  41.             }else if (c == ','){
  42.                 program += "dec %rdi\n";
  43.             }else if (c == '['){
  44.                 program += "mov data_items(,%rdi,1), %rbx\n";
  45.                 program += "cmp $0, %rbx\n";
  46.                 program += "je " + "R" + label_num + "\n";
  47.                 String label = "L" + label_num + ":\n";
  48.                 program += label;
  49.                 jmp_labels.add(label_num);
  50.                 label_num++;
  51.             }else if (c == ']'){
  52.                 program += "mov data_items(,%rdi,1), %rbx\n";
  53.                 program += "cmp $0, %rbx\n";
  54.  
  55.                 int label_number = jmp_labels.pop();
  56.                 String where_to_jmp = "L" + label_number;
  57.  
  58.                 program += "jne " + where_to_jmp + "\n";
  59.  
  60.                 String label = "R" + label_number + ":\n";
  61.                 program += label;
  62.             }
  63.  
  64.         }
  65.         program += "mov $1, %rax\n" +
  66.                 "int $0x80";
  67.  
  68.         System.out.println(program);
  69.     }
  70. }
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement