My first compiler

2poo_reference

Source Code

// MyCC code example
// Gabriel Capella
class Test {
    public void main() {
       Print p;
       Print pp;
       p = new Print();
       pp = p;
       pp.Integer(1729);
    }
}

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

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

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

preview

preview

preview

preview

preview

preview

preview

preview

Results

Assembly

# SPILL %9
# SPILL %18
# SPILL %10
# SPILL %31
.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

__LABEL0:
   pushq  %rbp                # Save old EBP
   movq    %rsp, %rbp         # Save old ESP
   addq    $-40, %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
   ##MoMo %4 <- %3
   ##MoMo %5 <- %4
   ##MovL %6 <- 1729
   movq   $1729, %rbx
   ##MoMo %7 <- %6
   ##PuAl
   pushq  %rax                  ## prepare call
   pushq  %rbx                  ## prepare call
   ##Push %7
   pushq  %rbx
   ##Push %5
   pushq  %rax
   ##Call (#1669437588)
   call   __LABEL1
   ##PopD
   add   $8, %rsp
   ##PopD
   add   $8, %rsp
   ##PoAl
   popq   %rbx
   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    $-40, %rsp

   ##MovL %8 <- 0
   movq   $0, %rax
   ##MoMo %9 <- %8
   ##MovL %46 <- -8
   movq   $-8, %rbx
   ##MoOp %46 <- %46,%-1
   addq   %rbp, %rbx
   ##RToM #46 <- %9
   movq   %rax, (%rbx)

__LABEL2:

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

__LABEL5:
   ##Jump 6
   jmp    __LABEL6

__LABEL6:

__LABEL8:

__LABEL9:
   ##MovL %35 <- 0
   movq   $0, %rax
   ##MovL %46 <- -8
   movq   $-8, %rbx
   ##MoOp %46 <- %46,%-1
   addq   %rbp, %rbx
   ##MToR %46 <- #46
   movq   (%rbx), %rbx
   ##MoMo %36 <- %46
   ##MoOp %37 <- %35,%36
   cmpq   %rax, %rbx
   setle   %dil
   xorb   $1, %dil
   movzbq %dil, %rax
   ##JuCo %37
   testq   %rax, %rax
   jnz     __LABEL10

__LABEL11:
   ##Jump 12
   jmp    __LABEL12

__LABEL12:

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

__LABEL10:

__LABEL13:
   ##MovL %46 <- -8
   movq   $-8, %rbx
   ##MoOp %46 <- %46,%-1
   addq   %rbp, %rbx
   ##MToR %46 <- #46
   movq   (%rbx), %rbx
   ##MoMo %38 <- %46
   ##MovL %39 <- 10
   movq   $10, %rax
   ##MoOp %40 <- %38,%39
#%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 %41 <- 48
   movq   $48, %rax
   ##MoOp %42 <- %40,%41
   addq   %rbx, %rax
   ##Prin %42
   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 %46 <- -8
   movq   $-8, %rbx
   ##MoOp %46 <- %46,%-1
   addq   %rbp, %rbx
   ##MToR %46 <- #46
   movq   (%rbx), %rbx
   ##MoMo %43 <- %46
   ##MovL %44 <- 10
   movq   $10, %rax
   ##MoOp %45 <- %43,%44
   pushq   %rdx
   movq    %rax, %rdi
   movq    %rbx, %rax
   cqto
   idiv    %rdi
   popq    %rdx
   ##MoMo %9 <- %45
   ##MovL %46 <- -8
   movq   $-8, %rbx
   ##MoOp %46 <- %46,%-1
   addq   %rbp, %rbx
   ##RToM #46 <- %9
   movq   %rax, (%rbx)
   ##Jump 9
   jmp    __LABEL9

__LABEL4:

__LABEL7:
   ##MovL %46 <- -8
   movq   $-8, %rbx
   ##MoOp %46 <- %46,%-1
   addq   %rbp, %rbx
   ##MToR %46 <- #46
   movq   (%rbx), %rbx
   ##MoMo %16 <- %46
   ##MovL %17 <- 10
   movq   $10, %rax
   ##MoOp %18 <- %16,%17
   imul   %rax, %rbx
   ##MovL %47 <- -16
   movq   $-16, %rax
   ##MoOp %47 <- %47,%-1
   addq   %rbp, %rax
   ##RToM #47 <- %18
   movq   %rbx, (%rax)
   ##MoMo %19 <- %-1
   movq   %rbp, %rbx
   ##MovL %20 <- 24
   movq   $24, %rax
   ##MoOp %21 <- %19,%20
   addq   %rbx, %rax
   ##MToR %22 <- #21
   movq   (%rax), %rbx
   ##MovL %23 <- 10
   movq   $10, %rax
   ##MoOp %24 <- %22,%23
#%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 %47 <- -16
   movq   $-16, %rax
   ##MoOp %47 <- %47,%-1
   addq   %rbp, %rax
   ##MToR %47 <- #47
   movq   (%rax), %rax
   ##MoOp %25 <- %47,%24
   addq   %rbx, %rax
   ##MoMo %9 <- %25
   ##MovL %46 <- -8
   movq   $-8, %rbx
   ##MoOp %46 <- %46,%-1
   addq   %rbp, %rbx
   ##RToM #46 <- %9
   movq   %rax, (%rbx)
   ##MoMo %26 <- %-1
   movq   %rbp, %rbx
   ##MovL %27 <- 24
   movq   $24, %rax
   ##MoOp %28 <- %26,%27
   addq   %rbx, %rax
   ##MToR %29 <- #28
   movq   (%rax), %rbx
   ##MovL %30 <- 10
   movq   $10, %rax
   ##MoOp %31 <- %29,%30
   pushq   %rax
   pushq   %rdx
   movq    %rax, %rdi
   movq    %rbx, %rax
   cqto
   idiv    %rdi
   movq    %rax, %rbx
   popq    %rdx
   popq    %rax
   ##MovL %49 <- -32
   movq   $-32, %rax
   ##MoOp %49 <- %49,%-1
   addq   %rbp, %rax
   ##RToM #49 <- %31
   movq   %rbx, (%rax)
   ##MoMo %32 <- %-1
   movq   %rbp, %rbx
   ##MovL %33 <- 24
   movq   $24, %rax
   ##MoOp %34 <- %32,%33
   addq   %rax, %rbx
   ##MovL %49 <- -32
   movq   $-32, %rax
   ##MoOp %49 <- %49,%-1
   addq   %rbp, %rax
   ##MToR %49 <- #49
   movq   (%rax), %rax
   ##RToM #34 <- %49
   movq   %rax, (%rbx)
   ##Jump 3
   jmp    __LABEL3

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