My first compiler

2factorial

Source Code

class Factorial {
    public void main() {
        Print pp;
        pp = new Print();
        pp.Integer(new Fac().ComputeFac(10));
    }
}

class Fac {
    public int ComputeFac(int num) {
        int num_aux;
        if (num < 1)
            num_aux = 1;
        else num_aux = num * (this.ComputeFac(num - 1));
        return num_aux;
    }
}

class Print {
  int v;
    public void Integer(int i) {
      int tmp;
      int c;
      tmp = 0;
      c = 0;

      while (0 < i) {
        tmp = tmp * 10 + i % 10; 
        i = i /10;
        c = c + 1;
      }

      while (0 < tmp) {
        print(tmp % 10 + 48);
        tmp = tmp /10;
        c = c - 1;
      }
      while (0 < c) {
        print(48);
        c = c - 1;
    }
  }
}

preview

preview

preview

preview

preview

preview

preview

preview

Results

Assembly

# SPILL %40
# SPILL %38
# SPILL %20
# SPILL %49
# SPILL %3
# SPILL %27
# SPILL %41
# SPILL %62
.globl main

main:
   pushq  %rbp                # Save old EBP
   movq    %rsp, %rbp         # Save old ESP

   movq    $0, %rax
   movq    %rax, %rdi
   callq   malloc@PLT
   testq   %rax, %rax
   jz      fail_exit
   pushq   %rax

   callq   __LABEL0
   popq   %rax

   movq %rbp, %rsp            # Restore ESP
   popq %rbp                  # Restore EBP
   retq

__LABEL1:
   pushq  %rbp                # Save old EBP
   movq    %rsp, %rbp         # Save old ESP
   addq    $-72, %rsp

   ##MoMo %10 <- %-1
   movq   %rbp, %rbx
   ##MovL %11 <- 24
   movq   $24, %rax
   ##MoOp %12 <- %10,%11
   addq   %rbx, %rax
   ##MToR %13 <- #12
   movq   (%rax), %rbx
   ##MovL %14 <- 1
   movq   $1, %rax
   ##MoOp %15 <- %13,%14
   cmpq   %rbx, %rax
   setle   %dil
   xorb   $1, %dil
   movzbq %dil, %rax
   ##JuCo %15
   testq   %rax, %rax
   jnz     __LABEL2

__LABEL3:
   ##MoMo %16 <- %-1
   movq   %rbp, %rbx
   ##MovL %17 <- 16
   movq   $16, %rax
   ##MoOp %18 <- %16,%17
   addq   %rbx, %rax
   ##MToR %19 <- #18
   movq   (%rax), %rax
   ##MoMo %20 <- %19
   ##MovL %92 <- -24
   movq   $-24, %rbx
   ##MoOp %92 <- %92,%-1
   addq   %rbp, %rbx
   ##RToM #92 <- %20
   movq   %rax, (%rbx)
   ##MoMo %21 <- %-1
   movq   %rbp, %rbx
   ##MovL %22 <- 24
   movq   $24, %rax
   ##MoOp %23 <- %21,%22
   addq   %rbx, %rax
   ##MToR %24 <- #23
   movq   (%rax), %rbx
   ##MovL %25 <- 1
   movq   $1, %rax
   ##MoOp %26 <- %24,%25
   imulq   $-1, %rax
   addq   %rbx, %rax
   ##MoMo %27 <- %26
   ##MovL %95 <- -48
   movq   $-48, %rbx
   ##MoOp %95 <- %95,%-1
   addq   %rbp, %rbx
   ##RToM #95 <- %27
   movq   %rax, (%rbx)
   ##MoMo %28 <- %-1
   movq   %rbp, %rbx
   ##MovL %29 <- 24
   movq   $24, %rax
   ##MoOp %30 <- %28,%29
   addq   %rbx, %rax
   ##MToR %31 <- #30
   movq   (%rax), %rax
   ##PuAl
   pushq  %rax                  ## prepare call
   pushq  %rbx                  ## prepare call
   ##MovL %95 <- -48
   movq   $-48, %rbx
   ##MoOp %95 <- %95,%-1
   addq   %rbp, %rbx
   ##MToR %95 <- #95
   movq   (%rbx), %rbx
   ##Push %95
   pushq  %rbx
   ##MovL %92 <- -24
   movq   $-24, %rbx
   ##MoOp %92 <- %92,%-1
   addq   %rbp, %rbx
   ##MToR %92 <- #92
   movq   (%rbx), %rbx
   ##Push %92
   pushq  %rbx
   ##Call (#544978966)
   call   __LABEL1
   ##PopD
   add   $8, %rsp
   ##PopD
   add   $8, %rsp
   ##PoAl
   popq   %rbx
   popq   %rax
   ##GRet
   movq  %rdi, %rbx
   ##MoOp %33 <- %31,%32
   imul   %rbx, %rax
   ##MoMo %34 <- %33
   ##Jump 4
   jmp    __LABEL4

__LABEL4:
   ##MoMo %36 <- %34
   ##SRet
   movq  %rax, %rdi
   movq    %rbp, %rsp 
   popq    %rbp
   retq

   movq    %rbp, %rsp            # Restore ESP
   popq    %rbp                  # Restore EBP
   retq

__LABEL2:
   ##MovL %35 <- 1
   movq   $1, %rax
   ##MoMo %34 <- %35
   ##Jump 4
   jmp    __LABEL4

__LABEL0:
   pushq  %rbp                # Save old EBP
   movq    %rsp, %rbp         # Save old ESP
   addq    $-72, %rsp

   ##MoMa 0
   pushq  %rbx                  ## prepare malloc
   movq    $8, %rdi
   callq   malloc@PLT
   testq   %rax, %rax
   jz      fail_exit
   movq   %rax, %rax
   popq   %rbx
   ##MoMo %1 <- %0
   ##MoMo %2 <- %1
   ##MoMo %3 <- %2
   movq   %rax, %rbx
   ##MovL %94 <- -40
   movq   $-40, %rax
   ##MoOp %94 <- %94,%-1
   addq   %rbp, %rax
   ##RToM #94 <- %3
   movq   %rbx, (%rax)
   ##MoMa 4
   pushq  %rbx                  ## prepare malloc
   movq    $0, %rdi
   callq   malloc@PLT
   testq   %rax, %rax
   jz      fail_exit
   movq   %rax, %rax
   popq   %rbx
   ##MoMo %5 <- %4
   ##MovL %6 <- 10
   movq   $10, %rbx
   ##MoMo %7 <- %6
   ##PuAl
   pushq  %rax                  ## prepare call
   pushq  %rbx                  ## prepare call
   ##Push %7
   pushq  %rbx
   ##Push %5
   pushq  %rax
   ##Call (#544978966)
   call   __LABEL1
   ##PopD
   add   $8, %rsp
   ##PopD
   add   $8, %rsp
   ##PoAl
   popq   %rbx
   popq   %rax
   ##GRet
   movq  %rdi, %rax
   ##MoMo %9 <- %8
   ##PuAl
   pushq  %rax                  ## prepare call
   pushq  %rbx                  ## prepare call
   ##Push %9
   pushq  %rax
   ##MovL %94 <- -40
   movq   $-40, %rax
   ##MoOp %94 <- %94,%-1
   addq   %rbp, %rax
   ##MToR %94 <- #94
   movq   (%rax), %rax
   ##Push %94
   pushq  %rax
   ##Call (#1296416700)
   call   __LABEL5
   ##PopD
   add   $8, %rsp
   ##PopD
   add   $8, %rsp
   ##PoAl
   popq   %rbx
   popq   %rax

   movq    %rbp, %rsp            # Restore ESP
   popq    %rbp                  # Restore EBP
   retq

__LABEL5:
   pushq  %rbp                # Save old EBP
   movq    %rsp, %rbp         # Save old ESP
   addq    $-72, %rsp

   ##MovL %37 <- 0
   movq   $0, %rax
   ##MoMo %38 <- %37
   ##MovL %91 <- -16
   movq   $-16, %rbx
   ##MoOp %91 <- %91,%-1
   addq   %rbp, %rbx
   ##RToM #91 <- %38
   movq   %rax, (%rbx)
   ##MovL %39 <- 0
   movq   $0, %rax
   ##MoMo %40 <- %39
   ##MovL %90 <- -8
   movq   $-8, %rbx
   ##MoOp %90 <- %90,%-1
   addq   %rbp, %rbx
   ##RToM #90 <- %40
   movq   %rax, (%rbx)

__LABEL6:

__LABEL7:
   ##MovL %41 <- 0
   movq   $0, %rbx
   ##MovL %96 <- -56
   movq   $-56, %rax
   ##MoOp %96 <- %96,%-1
   addq   %rbp, %rax
   ##RToM #96 <- %41
   movq   %rbx, (%rax)
   ##MoMo %42 <- %-1
   movq   %rbp, %rbx
   ##MovL %43 <- 24
   movq   $24, %rax
   ##MoOp %44 <- %42,%43
   addq   %rbx, %rax
   ##MToR %45 <- #44
   movq   (%rax), %rbx
   ##MovL %96 <- -56
   movq   $-56, %rax
   ##MoOp %96 <- %96,%-1
   addq   %rbp, %rax
   ##MToR %96 <- #96
   movq   (%rax), %rax
   ##MoOp %46 <- %96,%45
   cmpq   %rax, %rbx
   setle   %dil
   xorb   $1, %dil
   movzbq %dil, %rax
   ##JuCo %46
   testq   %rax, %rax
   jnz     __LABEL8

__LABEL9:
   ##Jump 10
   jmp    __LABEL10

__LABEL10:

__LABEL12:

__LABEL13:
   ##MovL %69 <- 0
   movq   $0, %rax
   ##MovL %91 <- -16
   movq   $-16, %rbx
   ##MoOp %91 <- %91,%-1
   addq   %rbp, %rbx
   ##MToR %91 <- #91
   movq   (%rbx), %rbx
   ##MoMo %70 <- %91
   ##MoOp %71 <- %69,%70
   cmpq   %rax, %rbx
   setle   %dil
   xorb   $1, %dil
   movzbq %dil, %rax
   ##JuCo %71
   testq   %rax, %rax
   jnz     __LABEL14

__LABEL15:
   ##Jump 16
   jmp    __LABEL16

__LABEL16:

__LABEL18:

__LABEL19:
   ##MovL %83 <- 0
   movq   $0, %rax
   ##MovL %90 <- -8
   movq   $-8, %rbx
   ##MoOp %90 <- %90,%-1
   addq   %rbp, %rbx
   ##MToR %90 <- #90
   movq   (%rbx), %rbx
   ##MoMo %84 <- %90
   ##MoOp %85 <- %83,%84
   cmpq   %rax, %rbx
   setle   %dil
   xorb   $1, %dil
   movzbq %dil, %rax
   ##JuCo %85
   testq   %rax, %rax
   jnz     __LABEL20

__LABEL21:
   ##Jump 22
   jmp    __LABEL22

__LABEL22:

   movq    %rbp, %rsp            # Restore ESP
   popq    %rbp                  # Restore EBP
   retq

__LABEL20:

__LABEL23:
   ##MovL %86 <- 48
   movq   $48, %rax
   ##Prin %86
   pushq  %rax                   ## prepare print call
   pushq  %rbx                   ## prepare print call
   pushq  %rax                  ## print
   movq   $1,%rax               ## sys_write
   movq   $1,%rdi               ## fd stdout
   movq   %rsp,%rsi             ## string pointer
   movq   $1,%rdx               ## size
   syscall                      ## syscall
   popq   %rsi                  ##
   popq   %rbx
   popq   %rax
   ##MovL %90 <- -8
   movq   $-8, %rbx
   ##MoOp %90 <- %90,%-1
   addq   %rbp, %rbx
   ##MToR %90 <- #90
   movq   (%rbx), %rbx
   ##MoMo %87 <- %90
   ##MovL %88 <- 1
   movq   $1, %rax
   ##MoOp %89 <- %87,%88
   imulq   $-1, %rax
   addq   %rbx, %rax
   ##MoMo %40 <- %89
   ##MovL %90 <- -8
   movq   $-8, %rbx
   ##MoOp %90 <- %90,%-1
   addq   %rbp, %rbx
   ##RToM #90 <- %40
   movq   %rax, (%rbx)
   ##Jump 19
   jmp    __LABEL19

__LABEL14:

__LABEL17:
   ##MovL %91 <- -16
   movq   $-16, %rbx
   ##MoOp %91 <- %91,%-1
   addq   %rbp, %rbx
   ##MToR %91 <- #91
   movq   (%rbx), %rbx
   ##MoMo %72 <- %91
   ##MovL %73 <- 10
   movq   $10, %rax
   ##MoOp %74 <- %72,%73
#%rbx A:%rbx 		 B:%rax
   pushq   %rax
   pushq   %rdx
   movq    %rax, %rdi
   movq    %rbx, %rax
   cqto
   idiv    %rdi
   movq    %rdx, %rbx
   popq    %rdx
   popq    %rax
   ##MovL %75 <- 48
   movq   $48, %rax
   ##MoOp %76 <- %74,%75
   addq   %rbx, %rax
   ##Prin %76
   pushq  %rax                   ## prepare print call
   pushq  %rbx                   ## prepare print call
   pushq  %rax                  ## print
   movq   $1,%rax               ## sys_write
   movq   $1,%rdi               ## fd stdout
   movq   %rsp,%rsi             ## string pointer
   movq   $1,%rdx               ## size
   syscall                      ## syscall
   popq   %rsi                  ##
   popq   %rbx
   popq   %rax
   ##MovL %91 <- -16
   movq   $-16, %rbx
   ##MoOp %91 <- %91,%-1
   addq   %rbp, %rbx
   ##MToR %91 <- #91
   movq   (%rbx), %rbx
   ##MoMo %77 <- %91
   ##MovL %78 <- 10
   movq   $10, %rax
   ##MoOp %79 <- %77,%78
   pushq   %rdx
   movq    %rax, %rdi
   movq    %rbx, %rax
   cqto
   idiv    %rdi
   popq    %rdx
   ##MoMo %38 <- %79
   ##MovL %91 <- -16
   movq   $-16, %rbx
   ##MoOp %91 <- %91,%-1
   addq   %rbp, %rbx
   ##RToM #91 <- %38
   movq   %rax, (%rbx)
   ##MovL %90 <- -8
   movq   $-8, %rbx
   ##MoOp %90 <- %90,%-1
   addq   %rbp, %rbx
   ##MToR %90 <- #90
   movq   (%rbx), %rbx
   ##MoMo %80 <- %90
   ##MovL %81 <- 1
   movq   $1, %rax
   ##MoOp %82 <- %80,%81
   imulq   $-1, %rax
   addq   %rbx, %rax
   ##MoMo %40 <- %82
   ##MovL %90 <- -8
   movq   $-8, %rbx
   ##MoOp %90 <- %90,%-1
   addq   %rbp, %rbx
   ##RToM #90 <- %40
   movq   %rax, (%rbx)
   ##Jump 13
   jmp    __LABEL13

__LABEL8:

__LABEL11:
   ##MovL %91 <- -16
   movq   $-16, %rbx
   ##MoOp %91 <- %91,%-1
   addq   %rbp, %rbx
   ##MToR %91 <- #91
   movq   (%rbx), %rbx
   ##MoMo %47 <- %91
   ##MovL %48 <- 10
   movq   $10, %rax
   ##MoOp %49 <- %47,%48
   imul   %rax, %rbx
   ##MovL %93 <- -32
   movq   $-32, %rax
   ##MoOp %93 <- %93,%-1
   addq   %rbp, %rax
   ##RToM #93 <- %49
   movq   %rbx, (%rax)
   ##MoMo %50 <- %-1
   movq   %rbp, %rbx
   ##MovL %51 <- 24
   movq   $24, %rax
   ##MoOp %52 <- %50,%51
   addq   %rbx, %rax
   ##MToR %53 <- #52
   movq   (%rax), %rbx
   ##MovL %54 <- 10
   movq   $10, %rax
   ##MoOp %55 <- %53,%54
#%rbx A:%rbx 		 B:%rax
   pushq   %rax
   pushq   %rdx
   movq    %rax, %rdi
   movq    %rbx, %rax
   cqto
   idiv    %rdi
   movq    %rdx, %rbx
   popq    %rdx
   popq    %rax
   ##MovL %93 <- -32
   movq   $-32, %rax
   ##MoOp %93 <- %93,%-1
   addq   %rbp, %rax
   ##MToR %93 <- #93
   movq   (%rax), %rax
   ##MoOp %56 <- %93,%55
   addq   %rbx, %rax
   ##MoMo %38 <- %56
   ##MovL %91 <- -16
   movq   $-16, %rbx
   ##MoOp %91 <- %91,%-1
   addq   %rbp, %rbx
   ##RToM #91 <- %38
   movq   %rax, (%rbx)
   ##MoMo %57 <- %-1
   movq   %rbp, %rbx
   ##MovL %58 <- 24
   movq   $24, %rax
   ##MoOp %59 <- %57,%58
   addq   %rbx, %rax
   ##MToR %60 <- #59
   movq   (%rax), %rbx
   ##MovL %61 <- 10
   movq   $10, %rax
   ##MoOp %62 <- %60,%61
   pushq   %rax
   pushq   %rdx
   movq    %rax, %rdi
   movq    %rbx, %rax
   cqto
   idiv    %rdi
   movq    %rax, %rbx
   popq    %rdx
   popq    %rax
   ##MovL %97 <- -64
   movq   $-64, %rax
   ##MoOp %97 <- %97,%-1
   addq   %rbp, %rax
   ##RToM #97 <- %62
   movq   %rbx, (%rax)
   ##MoMo %63 <- %-1
   movq   %rbp, %rbx
   ##MovL %64 <- 24
   movq   $24, %rax
   ##MoOp %65 <- %63,%64
   addq   %rax, %rbx
   ##MovL %97 <- -64
   movq   $-64, %rax
   ##MoOp %97 <- %97,%-1
   addq   %rbp, %rax
   ##MToR %97 <- #97
   movq   (%rax), %rax
   ##RToM #65 <- %97
   movq   %rax, (%rbx)
   ##MovL %90 <- -8
   movq   $-8, %rbx
   ##MoOp %90 <- %90,%-1
   addq   %rbp, %rbx
   ##MToR %90 <- #90
   movq   (%rbx), %rbx
   ##MoMo %66 <- %90
   ##MovL %67 <- 1
   movq   $1, %rax
   ##MoOp %68 <- %66,%67
   addq   %rbx, %rax
   ##MoMo %40 <- %68
   ##MovL %90 <- -8
   movq   $-8, %rbx
   ##MoOp %90 <- %90,%-1
   addq   %rbp, %rbx
   ##RToM #90 <- %40
   movq   %rax, (%rbx)
   ##Jump 7
   jmp    __LABEL7

fail_exit:
   movl   $1, %eax
   popq   %rbp
   retq
Expected
3628800
Got
3628800