Code Generation/Exercise 12: Difference between revisions
From Wiki**3
< Code Generation
Line 29: | Line 29: | ||
ALIGN | ALIGN | ||
LABEL v ; v is a vector | LABEL v ; v is a vector | ||
SDOUBLE 1.41 | |||
SDOUBLE 2.72 | |||
SDOUBLE 3.14 | |||
</asm> | </asm> | ||
}} | }} | ||
Line 58: | Line 58: | ||
LOCAL -4 ; &i | LOCAL -4 ; &i | ||
LDINT ; i | |||
LOCAL +12 ; &s | LOCAL +12 ; &s | ||
LDINT ; s | |||
LT ; i < s | LT ; i < s | ||
Line 71: | Line 71: | ||
LOCAL +8 ; &v | LOCAL +8 ; &v | ||
LDINT ; v (v is a pointer) | |||
LOCAL -4 ; &i | LOCAL -4 ; &i | ||
LDINT ; i | |||
INT 8 ; sizeof(double) | INT 8 ; sizeof(double) | ||
MUL | MUL | ||
ADD ; v+1 == &v[i] | ADD ; v+1 == &v[i] | ||
LDDOUBLE ; v[i] | |||
LOCAL +16 ; &d | LOCAL +16 ; &d | ||
LDDOUBLE ; d | |||
DCMP | DCMP | ||
Line 94: | Line 94: | ||
LOCAL -4 ; &i | LOCAL -4 ; &i | ||
LDINT ; i | |||
STFVAL32 | |||
LEAVE | LEAVE | ||
RET | RET | ||
Line 112: | Line 112: | ||
LOCAL -4 ; &i | LOCAL -4 ; &i | ||
LDINT ; i | |||
DUP32 ; i | |||
INT 1 | INT 1 | ||
ADD ; i+1 | ADD ; i+1 | ||
LOCAL -4 ; &i | LOCAL -4 ; &i | ||
STINT ; i = i + 1 | |||
TRASH 4 | TRASH 4 | ||
Line 129: | Line 129: | ||
INT -1 | INT -1 | ||
STFVAL32 | |||
LEAVE | LEAVE | ||
RET | RET | ||
Line 153: | Line 153: | ||
ALIGN | ALIGN | ||
LABEL _L314 | LABEL _L314 | ||
SDOUBLE 3.14 | |||
TEXT | TEXT | ||
ADDR _L314 | ADDR _L314 | ||
LDDOUBLE ; 3.14 | |||
INT 3 | INT 3 | ||
Line 168: | Line 168: | ||
TRASH 16 | TRASH 16 | ||
LDFVAL32 | |||
STFVAL32 | |||
LEAVE | LEAVE | ||
RET | RET |
Revision as of 22:57, 1 May 2018
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 $?