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 | |||
;; | ;;--- 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 $?