My first compiler

12op_mod

Source Code

// MyCC code example
// Gabriel Capella
class Test {
    int f;
    int h;
    public void main() {
        int x;
        x = 0;
        while (x < 100) {
            print(x % 10 + 48);
            x = x + 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    $16, %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    $-8, %rsp

   ##MovL %0 <- 0
   movq   $0, %rax
   ##MoMo %1 <- %0
   movq   %rax, %rcx

__LABEL1:

__LABEL2:
   ##MoMo %2 <- %1
   movq   %rcx, %rbx
   ##MovL %3 <- 100
   movq   $100, %rax
   ##MoOp %4 <- %2,%3
   cmpq   %rbx, %rax
   setle   %dil
   xorb   $1, %dil
   movzbq %dil, %rax
   ##JuCo %4
   testq   %rax, %rax
   jnz     __LABEL3

__LABEL4:
   ##Jump 5
   jmp    __LABEL5

__LABEL5:

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

__LABEL3:

__LABEL6:
   ##MoMo %5 <- %1
   movq   %rcx, %rbx
   ##MovL %6 <- 10
   movq   $10, %rax
   ##MoOp %7 <- %5,%6
#%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 %8 <- 48
   movq   $48, %rax
   ##MoOp %9 <- %7,%8
   addq   %rbx, %rax
   ##Prin %9
   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 %10 <- %1
   movq   %rcx, %rbx
   ##MovL %11 <- 1
   movq   $1, %rax
   ##MoOp %12 <- %10,%11
   addq   %rbx, %rax
   ##MoMo %1 <- %12
   movq   %rax, %rcx
   ##Jump 2
   jmp    __LABEL2

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