2call_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);
}
}







Results
Assembly
# SPILL %19
.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 $-16, %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
movq %rax, %rdi ## print
callq putchar@PLT
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), %rbx
##MovL %27 <- -8
movq $-8, %rax
##MoOp %27 <- %27,%-1
addq %rbp, %rax
##RToM #27 <- %19
movq %rbx, (%rax)
##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
##Push %26
pushq %rax
##MovL %27 <- -8
movq $-8, %rax
##MoOp %27 <- %27,%-1
addq %rbp, %rax
##MToR %27 <- #27
movq (%rax), %rax
##Push %27
pushq %rax
##Call (#740882966)
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
__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 $-16, %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), %rax
##MovL %4 <- 57
movq $57, %rbx
##MoMo %5 <- %4
##PuAl
pushq %rax ## prepare call
pushq %rbx ## prepare call
##Push %5
pushq %rbx
##Push %3
pushq %rax
##Call (#740882966)
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
fail_exit:
movl $1, %eax
popq %rbp
retq
Expected
9876543210
Got
9876543210