Code Generation/Exercise 18

From Wiki**3

< Code Generation

Vários fragmentos simples com variáveis globais e ciclos.

Fragmento 1

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

// gerar declarações:
extern void print(int);
int ix = 0; // variável global

// gerar fragmento de código C:
for (ix = 0; ix < 10; ix = ix + 1) print(ix);

O código Postfix correspondente ao código acima é o seguinte (agradece-se a comunicação de questões relativas a este código).

Código Postfix
 EXTERN print

DATA
ALIGN
GLOBAL ix, OBJ
LABEL ix
SINT 0

TEXT
INT 0
DUP32
ADDR ix
STINT
TRASH 4

LABEL fortest
ADDR ix
LDINT
INT 10
LT
JZ forend

ADDR ix
LDINT
CALL print
TRASH 4

LABEL forincr
ADDR ix
LDINT
INT 1
ADD
DUP32
ADDR ix
STINT
TRASH 4

JMP fortest

LABEL forend

Fragmento 2

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

// gerar declarações:
extern void print(int);
static int ix = 0;

// gerar fragmento de código C:
ix = 0;
while (ix < 10) {
  print(ix = ix + 1);
}

O código Postfix correspondente ao código acima é o seguinte (agradece-se a comunicação de questões relativas a este código).

Código Postfix
EXTERN print

DATA
ALIGN
LABEL ix
SINT 0

TEXT
INT 0
DUP32
ADDR ix
STINT
TRASH 4

LABEL whiletest
ADDR ix
LDINT
INT 10
LT
JZ whileend

ADDR ix
LDINT
INT 1
ADD
DUP32
ADDR ix
STINT

CALL print
TRASH 4

JMP whiletest

LABEL whileend

Fragmento 3

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

// gerar declarações:
extern void print(int);
static int ix = 0;

// gerar fragmento de código C:
ix = 0;
for (; ix < 10; ) {
  print(ix = ix + 1);
}

O código Postfix correspondente ao código acima é o seguinte (agradece-se a comunicação de questões relativas a este código).

Código Postfix
 EXTERN print

DATA
ALIGN
LABEL ix
SINT 0

TEXT
INT 0
DUP32
ADDR ix
STINT
TRASH 4

LABEL fortest
ADDR ix
LDINT
INT 10
LT
JZ forend

ADDR ix
LDINT
INT 1
ADD
DUP32
ADDR ix
STINT

CALL print
TRASH 4

LABEL forincr

JMP fortest

LABEL forend

Fragmento 4

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

// gerar declarações:
extern void print(int);
static int ix = 0;

// gerar fragmento de código C:
ix = 0;
do {
  print(ix = ix + 1);
} while (ix < 10);

O código Postfix correspondente ao código acima é o seguinte (agradece-se a comunicação de questões relativas a este código).

Código Postfix
EXTERN print

DATA
ALIGN
LABEL ix
SINT 0

TEXT
INT 0
DUP32
ADDR ix
STINT
TRASH 4

LABEL whilestart

ADDR ix
LDINT
INT 1
ADD
DUP32
ADDR ix
STINT

CALL print
TRASH 4

LABEL whiletest
ADDR ix
LDINT
INT 10
LT
JNZ whilestart

LABEL whileend