My first compiler

12call_recursion

Source Code

// MyCC code example
// Gabriel Capella
class Test {
    public void main() {
       f(57);
    }
    public void f(int i) {
    	if (i < 48) return;
    	print(i);
    	f(i-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

   ##MoMo %6 <- %-1
   movq   %rbp, %rbx
   ##MovL %7 <- 24
   movq   $24, %rax
   ##MoOp %8 <- %6,%7
   addq   %rbx, %rax
   ##MToR %9 <- #8
   movq   (%rax), %rbx
   ##MovL %10 <- 48
   movq   $48, %rax
   ##MoOp %11 <- %9,%10
   cmpq   %rbx, %rax
   setle   %dil
   xorb   $1, %dil
   movzbq %dil, %rax
   ##JuCo %11
   testq   %rax, %rax
   jnz     __LABEL2

__LABEL3:
   ##Jump 4
   jmp    __LABEL4

__LABEL4:
   ##MoMo %12 <- %-1
   movq   %rbp, %rbx
   ##MovL %13 <- 24
   movq   $24, %rax
   ##MoOp %14 <- %12,%13
   addq   %rbx, %rax
   ##MToR %15 <- #14
   movq   (%rax), %rax
   ##Prin %15
   pushq  %rax                   ## prepare print call
   pushq  %rbx                   ## prepare print call
   pushq  %rcx                   ## 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   %rcx
   popq   %rbx
   popq   %rax
   ##MoMo %16 <- %-1
   movq   %rbp, %rbx
   ##MovL %17 <- 16
   movq   $16, %rax
   ##MoOp %18 <- %16,%17
   addq   %rbx, %rax
   ##MToR %19 <- #18
   movq   (%rax), %rcx
   ##MoMo %20 <- %-1
   movq   %rbp, %rbx
   ##MovL %21 <- 24
   movq   $24, %rax
   ##MoOp %22 <- %20,%21
   addq   %rbx, %rax
   ##MToR %23 <- #22
   movq   (%rax), %rbx
   ##MovL %24 <- 1
   movq   $1, %rax
   ##MoOp %25 <- %23,%24
   imulq   $-1, %rax
   addq   %rbx, %rax
   ##MoMo %26 <- %25
   ##PuAl
   pushq  %rax                  ## prepare call
   pushq  %rbx                  ## prepare call
   pushq  %rcx                  ## prepare call
   ##Push %26
   pushq  %rax
   ##Push %19
   pushq  %rcx
   ##Call (#740882966)
   call   __LABEL1
   ##PopD
   add   $8, %rsp
   ##PopD
   add   $8, %rsp
   ##PoAl
   popq   %rcx
   popq   %rbx
   popq   %rax

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

__LABEL2:
   ##SRet
   movq  %rbp, %rdi
   movq    %rbp, %rsp 
   popq    %rbp
   retq
   ##Jump 4
   jmp    __LABEL4

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

   ##MoMo %0 <- %-1
   movq   %rbp, %rbx
   ##MovL %1 <- 16
   movq   $16, %rax
   ##MoOp %2 <- %0,%1
   addq   %rbx, %rax
   ##MToR %3 <- #2
   movq   (%rax), %rbx
   ##MovL %4 <- 57
   movq   $57, %rax
   ##MoMo %5 <- %4
   ##PuAl
   pushq  %rax                  ## prepare call
   pushq  %rbx                  ## prepare call
   pushq  %rcx                  ## prepare call
   ##Push %5
   pushq  %rax
   ##Push %3
   pushq  %rbx
   ##Call (#740882966)
   call   __LABEL1
   ##PopD
   add   $8, %rsp
   ##PopD
   add   $8, %rsp
   ##PoAl
   popq   %rcx
   popq   %rbx
   popq   %rax

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

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