|
|
(2 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| {{TOCright}}
| | #REDIRECT [[ist:Code Generation/Exercise 12]] |
| == 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 "[[Optimization Topics|bloco básico]] número".
| |
| | |
| {{CollapsedCode|Vector "v"|
| |
| <asm>
| |
| ;; static double v[] = { 1.41, 2.72, 3.14 };
| |
| ;;
| |
| DATA
| |
| ALIGN
| |
| LABEL v ; v is a vector
| |
| DOUBLE 1.41
| |
| DOUBLE 2.72
| |
| DOUBLE 3.14
| |
| </asm>
| |
| }}
| |
| | |
| {{CollapsedCode|Função "f"|
| |
| <asm>
| |
| ;; function "f"
| |
| ;;
| |
| | |
| ;;--- BB1 --- begin ---
| |
| TEXT
| |
| ALIGN
| |
| GLOBAL f, FUNC
| |
| LABEL f
| |
| ENTER 4 ; i@-4, v@+8, s@+12, d@+16
| |
| | |
| ;; BEGIN -- for
| |
| | |
| INT 0
| |
| LOCA -4 ; int i = 0
| |
| | |
| ;;--- BB1 --- end ---
| |
| ;;--- BB2 --- begin ---
| |
| | |
| LABEL for_test
| |
| | |
| LOCAL -4 ; &i
| |
| LOAD ; i
| |
| LOCAL +12 ; &s
| |
| LOAD ; s
| |
| LT ; i < s
| |
| | |
| JZ for_end
| |
| | |
| ;;--- BB2 --- end ---
| |
| ;;--- BB3 --- begin ---
| |
| | |
| ;; BEGIN -- for body
| |
| | |
| LOCAL +8 ; &v
| |
| LOAD ; v (v is a pointer)
| |
| LOCAL -4 ; &i
| |
| LOAD ; i
| |
| INT 8 ; sizeof(double)
| |
| MUL
| |
| ADD ; v+1 == &v[i]
| |
| DLOAD ; v[i]
| |
| | |
| LOCAL +16 ; &d
| |
| DLOAD ; d
| |
| | |
| DCMP
| |
| INT 0
| |
| EQ ; v[i] == d
| |
| | |
| JZ if_end
| |
| | |
| ;;--- BB3 --- end ---
| |
| ;;--- BB4 --- begin ---
| |
| | |
| ;; BEGIN -- if body
| |
| | |
| LOCAL -4 ; &i
| |
| LOAD ; i
| |
| | |
| POP
| |
| LEAVE
| |
| RET
| |
| | |
| ;; end -- if body
| |
| | |
| ;;--- BB4 --- end ---
| |
| ;;--- BB5 --- begin ---
| |
| | |
| LABEL if_end
| |
| | |
| ;; END -- for body
| |
| | |
| LABEL for_incr
| |
| | |
| LOCAL -4 ; &i
| |
| LOAD ; i
| |
| DUP ; i
| |
| INT 1
| |
| ADD ; i+1
| |
| LOCAL -4 ; &i
| |
| STORE ; i = i + 1
| |
| TRASH 4
| |
| | |
| JMP for_test
| |
| ;; END -- for
| |
| | |
| ;;--- BB5 --- end ---
| |
| ;;--- BB6 --- begin ---
| |
| | |
| LABEL for_end
| |
| | |
| INT -1
| |
| POP
| |
| LEAVE
| |
| RET
| |
| | |
| ;;--- BB6 --- end ---
| |
| </asm>
| |
| }}
| |
| | |
| {{CollapsedCode|Função principal|
| |
| <asm>
| |
| ;; main function
| |
| ;;
| |
| | |
| ;;--- BB7 --- begin ---
| |
| | |
| TEXT
| |
| ALIGN
| |
| GLOBAL _main, FUNC
| |
| LABEL _main
| |
| START ; no local vars
| |
| | |
| RODATA
| |
| ALIGN
| |
| LABEL _L314
| |
| DOUBLE 3.14
| |
| TEXT
| |
| ADDR _L314
| |
| DLOAD ; 3.14
| |
| | |
| INT 3
| |
| | |
| ADDR v ; v == &v (v is a vector)
| |
| | |
| CALL f
| |
| ;;--- BB7 --- end ---
| |
| | |
| ;;--- BB8 --- begin ---
| |
| TRASH 16
| |
| | |
| PUSH
| |
| POP
| |
| LEAVE
| |
| RET
| |
| | |
| ;;--- BB8 --- end ---
| |
| </asm>
| |
| }}
| |
| | |
| == 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 $?
| |
| | |
| [[category:Compiladores]]
| |
| [[category:Ensino]]
| |