Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal Fluminense - UFF Departamento de Computação - RCM Instituto de Ciência e Tecnologia - ICT Professor: Eduardo Marques Lista de exercícios de Compiladores 1) Responda: a) Quando se pode aplicar a otimização de eliminação de sub-expressão comum b) Qual o efeito que a quantidade de registradores tem no código gerado e por que. 2) Transforme os códigos a seguir em código intermediário de 3 endereços a) x := a+b b) if (a<b) x:=a else x := b c) while (x != y) x:=x*2 3) Mostre como o código intermediário a seguir pode ser otimizado e justifique as otimizações. a) 1 MOV a 0 2 JGT a 10 5 3 MOV x a 4 JMP 6 5 MOV x b 6 RTN b) 1 MOV x 0 2 JGT x 10 7 3 MULT t1 y A 4 ADD t2 x t1 5 MOV x t2 6 JMP 2 7 RTN c) 1 MOV a 0 2 MOV a p 3 JGT 0 a 17 4 DIV t1 a p 5 JGT t1 0.5 9 6 DIV t2 a p 7 ADD t3 f t2 8 MOV f t3 9 DIV t4 a p 10 JGT 0.5 t4 14 11 DIV t5 a p 12 SUB t6 f t5 13 MOV f t6 14 SUB t7 a 1 15 MOV a t7 16 JMP 3 17 MOV p f As instruções utilizadas foram: MOV a b - copia o conteúdo de b para a JGT a b c – pula para a instrução na linha c se a maior que b JMP a – pula para a instrução na linha a RTN – retorna a chamada de uma função ADD a b c – soma b e c e copia o valor para a SUB a b c – subtrai b e c e copia o valor para a DIV a b c – divide b e c e copia o valor para a MULT a b c – multiplica b e c e copia o valor para a 4) Indique qual o numero de registradores necessários para calcular as expressões a seguir a) (a+b)*(c-d) b) (a+(b-c))*((e-f)+(g-h)) c) ((a-b)*(c-d)+(e-f)*(g-h)) 5) Qual o código final gerado para os códigos intermediários da questão 3 utilizando apenas 2 registradores? Utilize as seguintes instruções: MOV R $n - move o valor n para o registrador R MOV R p - move o valor na posição de memória p para o registrador R MOV p R - move o valor no registrador R para a posição de memória p JGZ R1,R2 - pula para a instrução no registrador R2 se o valor e R1 for maior que zero JMP R - pula para a instrução no registrador R ADD R p - soma ao valor em R o valor na posição de memória p e guarda em R SUB R p - subtrai do valor em R o valor na posição de memória p e guarda em R MUL R p - multiplica o valor em R pelo valor na posição de memória p e guarda em R DIV R p - divide o valor em R pelo valor na posição de memória p e guarda em R RTN R - retorna para a instrução no registrador R
Compartilhar