Compilers are usually a pretty boring subject, but this is really sweet. Take a look at the following snippet and try to guess what will the generated asm code look like (for your convenience, the interesting parts marked with different colors):
#include <stdio.h>
int foo(int i) {
if(i > 0)
puts("positive");
else if (i == 0)
puts("zero");
else
puts("negative");
}
Now look at the actual generated code (colored parts correspond to the colors in C code):
.file "puts_pre.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "positive"
.LC1:
.string "zero"
.LC2:
.string "negative"
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
cmpl $0, 8(%ebp)
jle .L17
movl $.LC0, (%esp)
.L21:
call puts
movl %ebp, %esp
popl %ebp
ret
.p2align 4,,7
.L17:
jne .L19
movl $.LC1, (%esp)
jmp .L21
.p2align 4,,7
.L19:
movl $.LC2, (%esp)
jmp .L21
.size foo, .-foo
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.3.6 (Gentoo 3.3.6, ssp-3.3.6-1.0, pie-8.7.8)"
LOL ZOMG, call to puts has been taken out of the if ^_^
No comments:
Post a Comment