Difference between revisions of "Code Generation/Exercise 14"

From Wiki**3

< Code Generation
(Created page with "{{TOCright}} == Problema == Considere o seguinte código C++ (assuma que ponteiros e '''int''' ocupam 32 bits e que '''double''' ocupa 64 bits). <source lang="c++"> static...")
 
(Código Postfix (não optimizado))
Line 56: Line 56:
 
MUL
 
MUL
 
ADD ; &v[i]
 
ADD ; &v[i]
 +
LDDOUBLE ; v[i]
  
 
INT 0
 
INT 0
Line 62: Line 63:
 
DCMP
 
DCMP
 
INT 0
 
INT 0
GT
+
GT ; v[i] > 0
 
JZ ifend
 
JZ ifend
  
Line 107: Line 108:
  
 
LOCAL -4
 
LOCAL -4
 +
LDINT ; p
 
JZ op3else
 
JZ op3else
 
LOCAL -12
 
LOCAL -12

Revision as of 15:19, 14 June 2022

Problema

Considere o seguinte código C++ (assuma que ponteiros e int ocupam 32 bits e que double ocupa 64 bits).

static double mop(double v[], int s) {
  int p = 0;
  double m = 0;
  for (int i = 0; i < s; ++i) {
    if (v[i] > 0) {
      m = m + v[i];
      ++p;
    }
  }
  return p ? m / p : 0;
}

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
LABEL mop, FUNC
ENTER 16 ; p@-4 m@-12 i@-16 v@+8 s@+12

INT 0
LOCAL -4
STINT ; p

INT 0
I2D
LOCAL -12
STDOUBLE ; m

INT 0
LOCAL -16
STINT ; i

LABEL fortest
LOCAL -16
LDINT ; i
LOCAL 12
LDINT ; s
LT
JZ forend

LOCAL 8
LDINT ; v
LOCAL -16
LDINT ; i
INT 8
MUL
ADD ; &v[i]
LDDOUBLE ; v[i]

INT 0
I2D

DCMP
INT 0
GT ; v[i] > 0
JZ ifend

LOCAL -12
LDDOUBLE ; m
LOCAL 8
LDINT ; v
LOCAL -16
LDINT ; i
INT 8
MUL
ADD ; &v[i]
LDDOUBE ; v[i]
DADD
DUP64

LOCAL -12
STDOUBLE ; m = ...

TRASH 8

LOCAL -4
LDINT ; p
INT 1
ADD
DUP32
LOCAL -4
STINT
TRASH 4

LABEL ifend

LABEL forincr
LOCAL -16
LDINT
INT 1
ADD
DUP32
LOCAL -16
STINT
TRASH 4
JMP fortest
LABEL forend

LOCAL -4
LDINT ; p
JZ op3else
LOCAL -12
LDDOUBLE ; m
LOCAL -4
LDINT
I2D
DDIV
JMP op3end
LABEL op3else
INT 0
I2D
LABEL op3end

STFVAL64
LEAVE
RET

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