Code Generation/Exercise 12: Difference between revisions

From Wiki**3

< Code Generation
Line 39: Line 39:
;; function "f"
;; function "f"
;;
;;
;;--- BB1 --- begin ---
TEXT
TEXT
ALIGN
ALIGN
Line 49: Line 51:
INT 0
INT 0
LOCA -4  ; int i = 0
LOCA -4  ; int i = 0
;;--- BB1 --- end ---
;;--- BB2 --- begin ---


LABEL for_test
LABEL for_test
Line 59: Line 64:


JZ for_end
JZ for_end
;;--- BB2 --- end ---
;;--- BB3 --- begin ---


;; BEGIN -- for body
;; BEGIN -- for body
Line 79: Line 87:


JZ if_end
JZ if_end
;;--- BB3 --- end ---
;;--- BB4 --- begin ---


;; BEGIN -- if body
;; BEGIN -- if body
Line 90: Line 101:


;; end -- if body
;; end -- if body
;;--- BB4 --- end ---
;;--- BB5 --- begin ---


LABEL if_end
LABEL if_end
Line 107: Line 121:


JMP for_test
JMP for_test
;; END -- for


;; END -- for
;;--- BB5 --- end ---
;;--- BB6 --- begin ---


LABEL for_end
LABEL for_end
Line 116: Line 132:
LEAVE
LEAVE
RET
RET
;;--- BB6 --- end ---
</asm>
</asm>
}}
}}
Line 123: Line 141:
;; main function
;; main function
;;
;;
;;--- BB7 --- begin ---
TEXT
TEXT
ALIGN
ALIGN
Line 148: Line 169:
LEAVE
LEAVE
RET
RET
;;--- BB7 --- end ---
</asm>
</asm>
}}
}}

Revision as of 18:40, 22 June 2016

Problema

Considere o seguinte código C++ (assuma que ponteiros e int ocupam 32 bits e que double ocupa 64 bits).

<cpp> static double v[] = { 1.41, 2.71, 3.14 }; int f(double v[], int s, double d) {

 for (int i = 0; i < s; i++)
   if (v[i] == d) return i;
 return -1;

} int main() {

 return f(v, 3, 3.14);

} </cpp>

Código Postfix (não optimizado)

O código Postfix correspondente às funções é o seguinte (agradece-se a comunicação de questões relativas a este código).

No código Postfix, BB# significa "bloco básico número".

Vector "v"
{{{2}}}
Função "f"
{{{2}}}
Função principal
{{{2}}}

Compiling and Running

Para compilar o código Postfix directamente, pode ser utilizada a ferramenta pf2asm (assumindo uma arquitectura de 32 bits):

  • pf2asm code.pf
  • yasm -felf32 code.asm

Para criar o executável:

  • ld -m elf_i386 -o code code.o -L$HOME/compiladores/root/usr/lib -lrts

Para executar o programa:

  • ./code

Para aferir o resultado (retorno do programa ao shell -- zsh/bash assumidos como exemplos):

  • echo $?