My first compiler

6poo_print

Source Code

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

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

.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    $-8, %rsp

   ##MovL %6 <- 0
   movq   $0, %rax
   ##MoMo %7 <- %6
   movq   %rax, %rcx
   ##MovL %8 <- 0
   movq   $0, %rax
   ##MoMo %9 <- %8
   movq   %rax, %rbx

__LABEL2:

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

__LABEL5:
   ##Jump 6
   jmp    __LABEL6

__LABEL6:

__LABEL8:

__LABEL9:
   ##MovL %38 <- 0
   movq   $0, %rdx
   ##MoMo %39 <- %7
   movq   %rcx, %rax
   ##MoOp %40 <- %38,%39
   cmpq   %rdx, %rax
   setle   %dil
   xorb   $1, %dil
   movzbq %dil, %rax
   ##JuCo %40
   testq   %rax, %rax
   jnz     __LABEL10

__LABEL11:
   ##Jump 12
   jmp    __LABEL12

__LABEL12:

__LABEL14:

__LABEL15:
   ##MovL %52 <- 0
   movq   $0, %rcx
   ##MoMo %53 <- %9
   movq   %rbx, %rax
   ##MoOp %54 <- %52,%53
   cmpq   %rcx, %rax
   setle   %dil
   xorb   $1, %dil
   movzbq %dil, %rax
   ##JuCo %54
   testq   %rax, %rax
   jnz     __LABEL16

__LABEL17:
   ##Jump 18
   jmp    __LABEL18

__LABEL18:

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

__LABEL16:

__LABEL19:
   ##MovL %55 <- 48
   movq   $48, %rax
   ##Prin %55
   pushq  %r8                   ## prepare print call
   pushq  %rax                   ## prepare print call
   pushq  %rbx                   ## prepare print call
   pushq  %rcx                   ## prepare print call
   pushq  %rdx                   ## 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   %rdx
   popq   %rcx
   popq   %rbx
   popq   %rax
   popq   %r8
   ##MoMo %56 <- %9
   ##MovL %57 <- 1
   movq   $1, %rax
   ##MoOp %58 <- %56,%57
   imulq   $-1, %rax
   addq   %rbx, %rax
   ##MoMo %9 <- %58
   movq   %rax, %rbx
   ##Jump 15
   jmp    __LABEL15

__LABEL10:

__LABEL13:
   ##MoMo %41 <- %7
   movq   %rcx, %rdx
   ##MovL %42 <- 10
   movq   $10, %rax
   ##MoOp %43 <- %41,%42
#%rdx A:%rdx 		 B:%rax
   pushq   %rax
   movq    %rax, %rdi
   movq    %rdx, %rax
   cqto
   idiv    %rdi
   popq    %rax
   ##MovL %44 <- 48
   movq   $48, %rax
   ##MoOp %45 <- %43,%44
   addq   %rdx, %rax
   ##Prin %45
   pushq  %r8                   ## prepare print call
   pushq  %rax                   ## prepare print call
   pushq  %rbx                   ## prepare print call
   pushq  %rcx                   ## prepare print call
   pushq  %rdx                   ## 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   %rdx
   popq   %rcx
   popq   %rbx
   popq   %rax
   popq   %r8
   ##MoMo %46 <- %7
   ##MovL %47 <- 10
   movq   $10, %rax
   ##MoOp %48 <- %46,%47
   pushq   %rdx
   movq    %rax, %rdi
   movq    %rcx, %rax
   cqto
   idiv    %rdi
   popq    %rdx
   ##MoMo %7 <- %48
   movq   %rax, %rcx
   ##MoMo %49 <- %9
   ##MovL %50 <- 1
   movq   $1, %rax
   ##MoOp %51 <- %49,%50
   imulq   $-1, %rax
   addq   %rbx, %rax
   ##MoMo %9 <- %51
   movq   %rax, %rbx
   ##Jump 9
   jmp    __LABEL9

__LABEL4:

__LABEL7:
   ##MoMo %16 <- %7
   ##MovL %17 <- 10
   movq   $10, %rax
   ##MoOp %18 <- %16,%17
   imul   %rcx, %rax
   ##MoMo %19 <- %-1
   movq   %rbp, %rdx
   ##MovL %20 <- 24
   movq   $24, %rcx
   ##MoOp %21 <- %19,%20
   addq   %rdx, %rcx
   ##MToR %22 <- #21
   movq   (%rcx), %rdx
   ##MovL %23 <- 10
   movq   $10, %rcx
   ##MoOp %24 <- %22,%23
#%rcx A:%rdx 		 B:%rcx
   pushq   %rax
   pushq   %rdx
   movq    %rdx, %rax
   cqto
   idiv    %rcx
   movq    %rdx, %rcx
   popq    %rdx
   popq    %rax
   ##MoOp %25 <- %18,%24
   addq   %rcx, %rax
   ##MoMo %7 <- %25
   movq   %rax, %rcx
   ##MoMo %26 <- %-1
   movq   %rbp, %rdx
   ##MovL %27 <- 24
   movq   $24, %rax
   ##MoOp %28 <- %26,%27
   addq   %rdx, %rax
   ##MToR %29 <- #28
   movq   (%rax), %rdx
   ##MovL %30 <- 10
   movq   $10, %rax
   ##MoOp %31 <- %29,%30
   pushq   %rax
   pushq   %rdx
   movq    %rax, %rdi
   movq    %rdx, %rax
   cqto
   idiv    %rdi
   movq    %rax, %r8
   popq    %rdx
   popq    %rax
   ##MoMo %32 <- %-1
   movq   %rbp, %rdx
   ##MovL %33 <- 24
   movq   $24, %rax
   ##MoOp %34 <- %32,%33
   addq   %rdx, %rax
   ##RToM #34 <- %31
   movq   %r8, (%rax)
   ##MoMo %35 <- %9
   ##MovL %36 <- 1
   movq   $1, %rax
   ##MoOp %37 <- %35,%36
   addq   %rbx, %rax
   ##MoMo %9 <- %37
   movq   %rax, %rbx
   ##Jump 3
   jmp    __LABEL3

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

   ##MoMa 0
   pushq  %r8                  ## prepare malloc
   pushq  %rbx                  ## prepare malloc
   pushq  %rcx                  ## prepare malloc
   pushq  %rdx                  ## prepare malloc
   movq    $8, %rdi
   callq   malloc@PLT
   testq   %rax, %rax
   jz      fail_exit
   movq   %rax, %rax
   popq   %rdx
   popq   %rcx
   popq   %rbx
   popq   %r8
   ##MoMo %1 <- %0
   ##MoMo %2 <- %1
   ##MoMo %3 <- %2
   movq   %rax, %rbx
   ##MovL %4 <- 1729
   movq   $1729, %rax
   ##MoMo %5 <- %4
   ##PuAl
   pushq  %r8                  ## prepare call
   pushq  %rax                  ## prepare call
   pushq  %rbx                  ## prepare call
   pushq  %rcx                  ## prepare call
   pushq  %rdx                  ## prepare call
   ##Push %5
   pushq  %rax
   ##Push %3
   pushq  %rbx
   ##Call (#276737754)
   call   __LABEL1
   ##PopD
   add   $8, %rsp
   ##PopD
   add   $8, %rsp
   ##PoAl
   popq   %rdx
   popq   %rcx
   popq   %rbx
   popq   %rax
   popq   %r8

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

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