compiladores i- 1 - comparacion programa fuente y ensamblador generado

8
Compiladores I - 1 - COMPARACION PROGRAMA FUENTE Y ENSAMBLADOR GENERADO

Upload: cecil-boone

Post on 22-Dec-2015

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Compiladores I- 1 - COMPARACION PROGRAMA FUENTE Y ENSAMBLADOR GENERADO

Compiladores I - 1 -

COMPARACION PROGRAMA FUENTE Y

ENSAMBLADOR GENERADO

Page 2: Compiladores I- 1 - COMPARACION PROGRAMA FUENTE Y ENSAMBLADOR GENERADO

Compiladores I - 2 -

Programa Fuente

#include <stdio.h>

void *malloc();

struct CharNode { char c; struct CharNode *Sig;};

struct CharNode *Append(struct CharNode *l1,struct CharNode *l2)

{ if (l1==NULL) return l2; else { struct CharNode *tmp;

tmp=malloc(sizeof (struct CharNode)); tmp->c=l1->c; tmp->Sig=Append(l1->Sig,l2); return tmp; }}

void PrintCharNode(struct CharNode *cn){ while (cn) { putchar(cn->c); cn=cn->Sig; }}

Page 3: Compiladores I- 1 - COMPARACION PROGRAMA FUENTE Y ENSAMBLADOR GENERADO

Compiladores I - 3 -

Programa Fuente

struct CharNode *StrToCharNode(char *Str) { struct CharNode *cn; if (!*Str) return NULL; cn=malloc(sizeof (struct CharNode)); switch (*Str) { case '\\': ++Str; cn->c=*Str++; break; default: if (*Str>='a' && *Str<='z') cn->c=*Str++ - 'a' + 'A'; else cn->c=*Str++; } cn->Sig=StrToCharNode(Str); return cn;}void main() { float Loteria[10][20]; int rnd,i,j; struct CharNode *a=StrToCharNode("Bon Nadal i "); struct CharNode *b=StrToCharNode("Bon Any Nou."); PrintCharNode(a); puts(""); PrintCharNode(Append(a,b)); for (i=0;i<10;++i) { for (j=0;j<20;++j) { rnd=(rnd*255+48) % 65536; Loteria[i][j]=rnd; } } printf("\nEl gordo es %f\n",Loteria[rnd % 10][rnd % 20]);}

Page 4: Compiladores I- 1 - COMPARACION PROGRAMA FUENTE Y ENSAMBLADOR GENERADO

Compiladores I - 4 -

Programa Compilado (append)

.file "code.c"gcc2_compiled.:.text

.align 2.globl _Append_Append:

pushl %ebpmovl %esp,%ebpsubl $4,%espcmpl $0,8(%ebp)jne L2movl 12(%ebp),%eaxjmp L1.align 2,0x90jmp L3.align 2,0x90

L2:pushl $8call _mallocaddl $4,%espmovl %eax,-4(%ebp)movl -4(%ebp),%eaxmovl 8(%ebp),%edxmovb (%edx),%clmovb %cl,(%eax)pushl 12(%ebp)movl 8(%ebp),%eaxpushl 4(%eax)call _Appendaddl $8,%espmovl %eax,%eaxmovl -4(%ebp),%edxmovl %eax,4(%edx)movl -4(%ebp),%eaxjmp L1.align 2,0x90

L3:L1:

leaveret.align 2

Page 5: Compiladores I- 1 - COMPARACION PROGRAMA FUENTE Y ENSAMBLADOR GENERADO

Compiladores I - 5 -

Programa Compilado (PrintCharNode)

.align 2.globl _PrintCharNode_PrintCharNode:

pushl %ebpmovl %esp,%ebpnop

L5:cmpl $0,8(%ebp)je L6decl __iob+20cmpl $0,__iob+20jl L7movl __iob+24,%eaxmovl 8(%ebp),%edxmovb (%edx),%clmovb %cl,(%eax)incl __iob+24jmp L8.align 2,0x90

L7:pushl $__iob+20movl 8(%ebp),%eaxmovsbl (%eax),%edxpushl %edxcall __flsbufaddl $8,%esp

L8:movl 8(%ebp),%eaxmovl 4(%eax),%ecxmovl %ecx,8(%ebp)jmp L5.align 2,0x90

L6:L4:

leaveret

Page 6: Compiladores I- 1 - COMPARACION PROGRAMA FUENTE Y ENSAMBLADOR GENERADO

Compiladores I - 6 -

Programa Compilado (StrToCharNode)

.align 2.globl _StrToCharNode_StrToCharNode:

pushl %ebpmovl %esp,%ebpsubl $4,%espmovl 8(%ebp),%eaxcmpb $0,(%eax)jne L10xorl %eax,%eaxjmp L9.align 2,0x90

L10:pushl $8call _mallocaddl $4,%espmovl %eax,-4(%ebp)movl 8(%ebp),%eaxmovb (%eax),%dlcmpb $92,%dlje L12jmp L13.align 2,0x90

L12:incl 8(%ebp)movl -4(%ebp),%eaxmovl 8(%ebp),%edxmovb (%edx),%clmovb %cl,(%eax)incl 8(%ebp)jmp L11.align 2,0x90

L13:movl 8(%ebp),%eaxcmpb $96,(%eax)jle L14movl 8(%ebp),%eaxcmpb $122,(%eax)jg L14movl -4(%ebp),%eaxmovl 8(%ebp),%edxmovb (%edx),%claddb $-32,%clmovb %cl,(%eax)incl 8(%ebp)jmp L15.align 2,0x90

L14:movl -4(%ebp),%eaxmovl 8(%ebp),%edxmovb (%edx),%clmovb %cl,(%eax)incl 8(%ebp)

L15:L11:pushl 8(%ebp)

call _StrToCharNodeaddl $4,%espmovl %eax,%eaxmovl -4(%ebp),%edxmovl %eax,4(%edx)movl -4(%ebp),%eaxjmp L9.align 2,0x90

L9: leaveret

Page 7: Compiladores I- 1 - COMPARACION PROGRAMA FUENTE Y ENSAMBLADOR GENERADO

Compiladores I - 7 -

Programa Compilado (main I)

LC0:.ascii "Bon Nadal i \0"LC1:.ascii "Bon Any Nou.\0"LC2:.ascii "\0"LC3:.ascii "\12El gordo es

%f\12\0".align 2

.globl _main_main:

pushl %ebpmovl %esp,%ebpsubl $828,%esppushl %esipushl %ebxcall ___mainpushl $LC0call _StrToCharNodeaddl $4,%espmovl %eax,-816(%ebp)pushl $LC1call _StrToCharNodeaddl $4,%espmovl %eax,-820(%ebp)pushl -816(%ebp)call _PrintCharNodeaddl $4,%esppushl $LC2call _putsaddl $4,%esppushl -820(%ebp)pushl -816(%ebp)call _Appendaddl $8,%esp

movl %eax,-824(%ebp)pushl -824(%ebp)call _PrintCharNodeaddl $4,%espmovl $0,-808(%ebp)

L18:cmpl $9,-808(%ebp)jg L19movl $0,-812(%ebp)

L21:cmpl $19,-812(%ebp)jg L22movl -804(%ebp),%edxmovl %edx,-824(%ebp)sall $8,%edxmovl %edx,-828(%ebp)movl -824(%ebp),%esisubl %esi,-828(%ebp)movl -828(%ebp),%eaxaddl $48,%eaxmovl %eax,-824(%ebp)movl %eax,-828(%ebp)cmpl $0,-828(%ebp)jge L24addl $65535,-828(%ebp)

L24:movl -828(%ebp),%edxsarl $16,%edxmovl %edx,-804(%ebp)movl -804(%ebp),%esimovl %esi,-828(%ebp)movl %esi,%ecx

Page 8: Compiladores I- 1 - COMPARACION PROGRAMA FUENTE Y ENSAMBLADOR GENERADO

Compiladores I - 8 -

Programa Compilado (main I)

sall $16,%ecxmovl -824(%ebp),%eaxsubl %ecx,%eaxmovl %eax,-804(%ebp)movl -808(%ebp),%edxmovl %edx,-828(%ebp)sall $2,%edxmovl %edx,-824(%ebp)movl -828(%ebp),%esiaddl %esi,-824(%ebp)sall $4,-824(%ebp)movl -824(%ebp),%eaxaddl %ebp,%eaxmovl %eax,-828(%ebp)addl $-800,%eaxmovl %eax,-824(%ebp)movl -812(%ebp),%edxmovl %edx,-828(%ebp)fildl -804(%ebp)fstps (%eax,%edx,4)

L23: incl -812(%ebp)jmp L21.align 2,0x90

L22:L20: incl -808(%ebp)

jmp L18.align 2,0x90

L19:movl -804(%ebp),%esimovl %esi,-824(%ebp)movl -824(%ebp),%eaxmovl $10,%esicltd

idivl %esimovl %edx,%ecxmovl %eax,-828(%ebp)leal 0(,%ecx,4),%eaxmovl %eax,-824(%ebp)addl %ecx,-824(%ebp)sall $4,-824(%ebp)movl -824(%ebp),%edxaddl %ebp,%edxmovl %edx,-828(%ebp)addl $-800,%edxmovl %edx,-824(%ebp)movl -804(%ebp),%ebxmovl %ebx,%eaxmovl $20,%esicltdidivl %esimovl %edx,%ecxmovl %eax,-828(%ebp)movl -824(%ebp),%eaxflds (%eax,%ecx,4)subl $8,%espfstpl (%esp)pushl $LC3call _printfaddl $12,%esp

L17:leal -836(%ebp),%esppopl %ebxpopl %esileaveret