Code Generation/Exercise 17: Difference between revisions
From Wiki**3
No edit summary |
|||
| Line 34: | Line 34: | ||
JZ if1end | JZ if1end | ||
INT -1 | INT -1 | ||
STFVAL32I | |||
LEAVE | LEAVE | ||
RET | RET | ||
| Line 65: | Line 65: | ||
LOCAL -4 | LOCAL -4 | ||
LDINT ; i | LDINT ; i | ||
STFVAL32I | |||
LEAVE | LEAVE | ||
RET | RET | ||
| Line 96: | Line 96: | ||
CALL find | CALL find | ||
TRASH 20 | TRASH 20 | ||
LDFVAL32I | |||
STFVAL32I | |||
LEAVE | LEAVE | ||
RET | RET | ||
| Line 114: | Line 114: | ||
CALL find | CALL find | ||
TRASH 20 | TRASH 20 | ||
LDFVAL32I | |||
STFVAL32I | |||
LEAVE | LEAVE | ||
RET | RET | ||
Latest revision as of 15:26, 29 May 2026
Problema
Considere o seguinte código C++ (assuma que ponteiros e int ocupam 32 bits e que double ocupa 64 bits).
int find(double *v, double f, int s, int e) {
if (s > e) return -1;
int i = (s + e) / 2;
if (v[i] == f) return i;
if (f > v[i])
return find(v, f, i + 1, e);
return find(v, f, s, i - 1);
}
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).
| Código Postfix |
|---|
TEXT
ALIGN
GLOBAL find, FUNC
LABEL find
ENTER 4 ; i@-4 v@+8 f@+12 s@+20 e@+24
LOCAL +20
LDINT ; s
LOCAL +24
LDINT
GT
JZ if1end
INT -1
STFVAL32I
LEAVE
RET
LABEL if1end
LOCAL +20
LDINT ; s
LOCAL +24
LDINT ; e
ADD
INT 2
DIV
LOCAL -4
STINT ; int i = ...
LOCAL +8
LDINT ; v
LOCAL -4
LDINT ; i
INT 8 ; sizeof
MUL
ADD ; &v[i]
LDDOUBLE ; v[i]
LOCAL +12
LDDOUBLE ; f
DCMP
INT 0
EQ ; v[i] == f
JZ if2end
LOCAL -4
LDINT ; i
STFVAL32I
LEAVE
RET
LABEL if2end
LOCAL +12
LDDOUBLE ; f
LOCAL +8
LDINT ; v
LOCAL -4
LDINT ; i
INT 8 ; sizeof
MUL
ADD ; &v[i]
LDDOUBLE ; v[i]
DCMP
INT 0
GT ; f > v[i]
JZ if3end
LOCAL +24
LDINT ; e
LOCAL -4
LDINT ; i
INT 1
ADD
LOCAL +12
LDDOUBLE ; f
LOCAL +8
LDINT ; v
CALL find
TRASH 20
LDFVAL32I
STFVAL32I
LEAVE
RET
LABEL if3end
LOCAL -4
LDINT ; i
INT 1
SUB ; i-1
LOCAL +20
LDINT ; s
LOCAL +12
LDDOUBLE ; f
LOCAL +8
LDINT ; v
CALL find
TRASH 20
LDFVAL32I
STFVAL32I
LEAVE
RET
|
Compiling and Running
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