Line 1: | Line 1: | ||
+ | {{TOCright}} | ||
+ | == Problema == | ||
+ | |||
Considere a seguinte função em C: | Considere a seguinte função em C: | ||
# Que optimizações independentes da máquina são possíveis? | # Que optimizações independentes da máquina são possíveis? | ||
Line 13: | Line 16: | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | == Código Postfix (não optimizado) == | ||
+ | |||
+ | O código Postfix correspondente ao código C é o seguinte (agradece-se a comunicação de questões relativas a este código). | ||
+ | |||
+ | {{CollapsedCode|Código Postfix| | ||
+ | <source lang="asm"> | ||
+ | ;;---- BB1 START ---- | ||
+ | TEXT | ||
+ | ALIGN | ||
+ | GLOBAL fun, FUNC | ||
+ | LABEL fun | ||
+ | ENTER 8 ; i@-4 c@-8 a@+8 b@+12 | ||
+ | |||
+ | INT 10 | ||
+ | LOCA -4 ; i=10 | ||
+ | |||
+ | INT 20 | ||
+ | INT 1024 | ||
+ | MUL | ||
+ | LOCAL -4 | ||
+ | LDINT | ||
+ | ADD | ||
+ | DUP32 | ||
+ | LOCAL -8 | ||
+ | STINT ; c = ... | ||
+ | TRASH 4 | ||
+ | ;;---- BB1 END ---- | ||
+ | |||
+ | ;;---- BB2 START ---- | ||
+ | ALIGN | ||
+ | LABEL while_test | ||
+ | LOCAL -4 | ||
+ | LDINT | ||
+ | INT 1 | ||
+ | ADD | ||
+ | DUP32 | ||
+ | LOCAL -4 | ||
+ | STINT ; ++i | ||
+ | |||
+ | LOCAL +8 | ||
+ | LDINT | ||
+ | LOCAL +12 | ||
+ | LDINT | ||
+ | ADD ; a + b | ||
+ | |||
+ | LT | ||
+ | JZ while_end | ||
+ | ;;---- BB2 END ---- | ||
+ | |||
+ | ;;---- BB3 START ---- | ||
+ | LOCAL +8 | ||
+ | LDINT | ||
+ | LOCAL +12 | ||
+ | LDINT | ||
+ | ADD ; a + b | ||
+ | |||
+ | INT 3 | ||
+ | LOCAL -4 | ||
+ | LDINT | ||
+ | MUL | ||
+ | INT 5 | ||
+ | ADD | ||
+ | |||
+ | LT | ||
+ | JZ ifend | ||
+ | ;;---- BB3 END ---- | ||
+ | |||
+ | ;;---- BB4 START ---- | ||
+ | LOCAL -8 | ||
+ | LDINT ; c | ||
+ | INT 2 | ||
+ | LOCAL -4 | ||
+ | LDINT | ||
+ | MUL ; 2 * i | ||
+ | ADD | ||
+ | DUP32 | ||
+ | LOCAL -8 ; &c | ||
+ | STINT | ||
+ | TRASH 4 | ||
+ | ;;---- BB4 END ---- | ||
+ | |||
+ | ;;---- BB5 START ---- | ||
+ | ALIGN | ||
+ | LABEL ifend | ||
+ | |||
+ | JMP while_test | ||
+ | ;;---- BB5 END ---- | ||
+ | |||
+ | ;;---- BB6 START ---- | ||
+ | ALIGN | ||
+ | LABEL while_end | ||
+ | |||
+ | LOCAL -8 | ||
+ | LDINT ; c | ||
+ | STFVAL32 | ||
+ | LEAVE | ||
+ | RET | ||
+ | ;;---- BB6 END ---- | ||
+ | </source> | ||
+ | }} | ||
+ | |||
+ | == Compiling and Running == | ||
+ | |||
+ | Para compilar o código Postfix directamente, pode ser utilizada a ferramenta [[Compiladores/Projecto de Compiladores/Compiladores Exemplo|pf2asm]] (assumindo uma arquitectura Intel de 32 bits -- ix86): | ||
+ | |||
+ | pf2asm code.pf | ||
+ | yasm -felf32 code.asm | ||
+ | |||
+ | [[category:Compiladores]] | ||
+ | [[category:Ensino]] |
Considere a seguinte função em C:
int fun(int a, int b) {
int i = 10, c;
c = 20 * 1024 + i;
while (++i < a + b) {
if (a + b < 3 * i + 5) c += 2 * i;
}
return c;
}
O código Postfix correspondente ao código C é o seguinte (agradece-se a comunicação de questões relativas a este código).
Código Postfix |
---|
;;---- BB1 START ----
TEXT
ALIGN
GLOBAL fun, FUNC
LABEL fun
ENTER 8 ; i@-4 c@-8 a@+8 b@+12
INT 10
LOCA -4 ; i=10
INT 20
INT 1024
MUL
LOCAL -4
LDINT
ADD
DUP32
LOCAL -8
STINT ; c = ...
TRASH 4
;;---- BB1 END ----
;;---- BB2 START ----
ALIGN
LABEL while_test
LOCAL -4
LDINT
INT 1
ADD
DUP32
LOCAL -4
STINT ; ++i
LOCAL +8
LDINT
LOCAL +12
LDINT
ADD ; a + b
LT
JZ while_end
;;---- BB2 END ----
;;---- BB3 START ----
LOCAL +8
LDINT
LOCAL +12
LDINT
ADD ; a + b
INT 3
LOCAL -4
LDINT
MUL
INT 5
ADD
LT
JZ ifend
;;---- BB3 END ----
;;---- BB4 START ----
LOCAL -8
LDINT ; c
INT 2
LOCAL -4
LDINT
MUL ; 2 * i
ADD
DUP32
LOCAL -8 ; &c
STINT
TRASH 4
;;---- BB4 END ----
;;---- BB5 START ----
ALIGN
LABEL ifend
JMP while_test
;;---- BB5 END ----
;;---- BB6 START ----
ALIGN
LABEL while_end
LOCAL -8
LDINT ; c
STFVAL32
LEAVE
RET
;;---- BB6 END ----
|
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta pf2asm (assumindo uma arquitectura Intel de 32 bits -- ix86):
pf2asm code.pf yasm -felf32 code.asm