Apostila antiga - The Cyan Programming Language
Apostila antiga - The Cyan Programming Language
Apostila antiga - The Cyan Programming Language
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
CHAPTER 4. GERAÇÃO DE CÓDIGO 41<br />
L2:<br />
goto L1<br />
Contudo, existe uma forma mais eficiente:<br />
goto L1<br />
L2: codigo para S<br />
L1: cmp i, n<br />
goto< L2<br />
A cada passo do laço, na primeira forma há um “goto L1” e um “goto>= L2” que falha. 1 Na<br />
segunda forma, a cada passo do laço há apenas um “goto< L2” que sucede. Mesmo havendo um<br />
“goto L1” no início da segunda forma, esta é mais eficiente do que a primeira.<br />
4.4 Geração de Código para Vetores e Comando case/switch<br />
Geração de Código para Vetores<br />
Suponha que S2 suporte vetores unidimensionais declarados como<br />
var v : array(integer)[100];<br />
e que podem ser indexados como em C++:<br />
a = v[i]; // 1<br />
v[i] = a; // 2<br />
Estas instruções serão traduzidas para<br />
mov a, v[i] // 1<br />
mov v[i], a // 2<br />
em assembler. Se a instrução mov não admitisse a indexação de seus operandos, o endereço de v[i]<br />
teria que ser calculado previamente. Nesta situação, a instrução 1 seria traduzida para<br />
mov t1, &v<br />
add t1, i<br />
mov a, *t1<br />
onde t1 é uma variável temporária. No caso geral, o endereço t1 do i-ésimo elemento do vetor é<br />
calculado como<br />
t1 = &v + i*sizeof(v[0])<br />
considerando que a memória é indexada byte a byte. Na máquina que estamos utilizando, a memória<br />
é indexada de dois em dois bytes. Isto é, o endereço t1 representa dois bytes, suficientes para um<br />
inteiro e t1 + 1 também representa dois bytes. Assim, o endereço do i-ésimo elemento do vetor v é<br />
t1 = &v + i;<br />
Geração de Código para o Comando case/switch<br />
Suponha que tenha sido acrescentado a S2 um comando case da forma<br />
1 Este desvio condicional sucederá apenas quando o laço for terminar.