Escolar Documentos
Profissional Documentos
Cultura Documentos
Compiladores - Tpicos
-Linguagens e suas representaes - Linguagens; - Gramticas; - Representao BNF; -Grafos sintticos; e - rvores de anlise sinttica (rvores de derivao) - Arvores sintticas (rvores reduzidas de anlise sinttica) -Compiladores - Traduo de linguagens de programao - Analise lxica; - Analise sinttica; - Traduo dirigida por sintaxe; - Gerao de cdigo intermedirio; - Otimizao de cdigo; - Gerncia de memria; 2 - Gerao de cdigo objeto;
Torre de Babel
a) Cdigo de Mquina do Processador Motorola MC 68000 23FC 0000 0CB9 0000 6E0C 06B9 0000 06E8 0001 0000 0040 000A 0000 0040 0001 0000 0040
b) Linguagem de Montador (Assembly) do Processador MC 68000 #0X1,N COMPARE:CMPL #0XA,N BGT END_OF_LOOP ADDL #0X1,N BRA COMPARE END_OF_LOOP: MOVL
Torre de Babel
c) Linguagem FORTRAN 2 DO 2 N=1,10 CONTINUE
Torre de Babel
e) Linguagem C For (N=1; N<=10; N++) { } f) Linguagem ADA For N in 1..10 Loop NULL; End Loop; g) Matemtica
10 N =1
h) Portugus N variando entre 1 e 10 Podemos ver, pelos exemplos, que cada linguagem tem suas prprias 7 regras e utiliza seu prprio vocabulrio.
Linguagens
Linguagem : o conjunto de palavras e mtodos de combin-las, usados e entendidos por uma comunidade. Ex: Portugus, Ingls, Matemtica, Algol, Pascal, Qumica, etc... Alfabeto ou vocabulrio: um conjunto finito de smbolos da linguagem. Ex: Alfabeto latino { a, b, c, ..., z}; Alfabeto grego { , , , ...., }; Alfabeto binrio { 0, 1).
Linguagens
Sentenas: qualquer cadeia de tamanho limitado, composta de smbolos da linguagem. Ex: Eu estou estudando. (Portugus); A = B + C (Matemtica); For ( i = 1; i <= 5; i++ ) { a[i] = b[i] + c[i]; } ( Linguagem C ) Se V um alfabeto, ento V* o conjunto de todas as sentenas compostas por smbolos de V, inclusive a sentena vazia . V* chamado de fechamento transitivo de concatenao. V+ usado para designar o conjunto V* - {}.
9
Linguagens
Ex: Se V = {0, 1} ento, V* = {, 0, 1, 00, 01, 10, 000, ....} e V+ = { 0, 1, 00, 01, 10, 000, ....}
Ex: Se V = {01} ento, V* = {, 01, 0101, 010101, ....} e V+ = { 01, 0101, 010101, ....} Ex: c* = { , c, cc, ccc, cccc, .....} abc*d = { abd, abcd, abccd, abcccd, abccccd, .....}
10
Gramtica
o conjunto de regras que define a gerao das sentenas de uma linguagem. Formalmente as gramticas podem ser caracterizadas como qudruplas ordenadas: G = (V, , P, S) onde: V representa o vocabulrio da gramtica G. Este vocabulrio corresponde ao conjunto de todos os elementos simblicos, dos quais gramtica se vale para definir as leis de formao das sentenas da linguagem.
Gramtica G = (V, , P, S) S um elemento de N, cuja propriedade ser o no-terminal que d incio ao processo de gerao de sentenas. S chamado de smbolo
inicial da gramtica. Exemplos: G1 = (V1, 1, P1, S1) V1 = { A, B, 0, 1} 1 = {0, 1} P1 = { A 0A, A B, B 1B, B } S1 = A Obteno de Sentenas : A 0A aplicando A 0A A 00A A B A 00B B 1B A 001B B 1B A 0011B B portanto: A 0011 uma sentena da gramtica
13
Gramtica G = (V, , P, S)
Exemplos: Cdigo Morse = (V, , P, S) V = { A, , } = {, } P = { A A, A A, A } S=A Obteno de Sentenas : A A aplicando A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A uma sentena vlida 14 S O S
Gramtica G = (V, , P, S)
Exemplos: G2 = (V2, 2, P2, S2) V2 = {<sentena>, <sujeito>, <predicado>, <artigo>, muito <substantivo>,<verbo>,<advrbio> , garoto, o, corre } 2 = {muito, garoto, o, corre} P2 = {<sentena> <sujeito><predicado>, <sujeito> <artigo> <substantivo>, <predicado> <verbo> <advrbio>, <artigo> o, <verbo> corre, <advrbio> muito, <substantivo> garoto} S2 = <sentena> Obteno de Sentenas : <sentena> <sujeito> <predicado> <sentena> <artigo> <substantivo> <predicado> <sentena> O garoto <predicado> <sentena> O garoto <verbo> <advrbio> <sentena> O garoto corre muito
15
17
Exerccios
Dada a gramtica: G1 = (V1, 1, P1, S1) V1 = { A, B, 0, 1} 1 = {0, 1} P1 = { A 0A, A B, B 1B, B } S1 = A Provar que as sentenas abaixo so sentenas vlidas da gramtica: a) 111001 b) 011111 c) 000001 d) 00011
19
Exerccios - Resultados
a) 111001 Obteno da Sentena : A B aplicando B 1B A 1B B 1B A 11B B 1B A 111B Como no existe produo que partindo de B nos permita obter o valor zero, a sentena no vlida para a gramtica em questo. b) 011111 Obteno da Sentena : A 0A aplicando A 1B A 01B B 1B A 011B B 1B A 0111B B 1B A 01111B B 1B A 011111B B A 011111 c.q.d.
20
c) 000001 Obteno da Sentena : A 0A aplicando A 0A A 00A A 0A A 000A A 0A A 0000A A 0A A 00000A A B A 00000B B 1B A 000001B B A 000001 c.q.d. d) 00011 Obteno da Sentena : A 0A aplicando A 0A A 00A A 0A A 000A A B A 000B B 1B A 0001B B 1B A 00011B B A 00011 c.q.d.
Exerccios - Resultados
21
Exerccio
Verifique se a sentena begin A:= B + C ; B := C end pertence linguagem definida pela gramtica abaixo: < programa > ::= begin < lista de declaraes > end < lista de declaraes > ::= < declarao > | < declarao > ; < lista de declaraes > < declarao > ::= < varivel > := < expresso > < varivel > ::= A | B | C < expresso > ::= < varivel > + < varivel > | < varivel > - < varivel > | < varivel >
22
Exerccio - Resultado
Verifique se a sentena begin A:= B + C ; B := C end <programa> ::= begin < lista de declaraes > end begin < lista de declaraes > end begin < declarao > ; < lista de declaraes > end begin < varivel > := < expresso > ; < lista de declaraes > end begin A := < expresso > ; < lista de declaraes > end begin A := < varivel > + < varivel > ; < lista de declaraes > end begin A := B + < varivel > ; < lista de declaraes > end begin A := B + C ; < lista de declaraes > end begin A := B + C ; < declarao > end begin A := B + C ; < varivel > := < expresso > end begin A := B + C ; B := < expresso > end begin A := B + C ; B := < varivel > end begin A := B + C ; B := C end c.q.d 23
Grafo Sinttico
uma maneira grfica de representar as regras sintticas de uma linguagem na forma EBNF. < programa > ::= begin < lista de declaraes > end <programa> begin lista de declarao end
< lista de declaraes > ::= < declarao > | < declarao > ; < lista de declaraes > < lista de declaraes > declarao ;
25
Grafo Sinttico
< declarao > ::= < varivel > := < expresso > < declarao > varivel := expresso
Grafo Sinttico
< expresso > ::= < varivel > + < varivel > | < varivel > - < varivel > | < varivel > < expresso > varivel varivel varivel
27
+ -
varivel varivel
28
Regras de Construo do Grafo Sinttico - Exerccio Dada a gramtica abaixo, desenhar o grafo sinttico correspondente: < programa > ::= program < declarao >* end < declarao > ::= < atribuio > | < lao > < atribuio > ::= < identificador > := < expresso > ; < lao > ::= while < expresso lgica > do < declarao >+ done < expresso > ::= < valor > | < valor > + < valor > | < valor > - < valor > | < valor > * < valor > | < valor > / < valor > < expresso lgica > ::= < valor > = < valor > | < valor > > < valor > | < valor > < < valor > < valor > ::= < identificador > | < nmeros > < identificador > ::= { a,b,c,..., z }+ < nmeros > ::= { 0,1,2,..., 9 }+
29
- Exerccio ( Soluo ) -
30
- Exerccio ( Soluo ) -
31
- Exerccio ( Soluo ) -
32
- Exerccio ( Soluo ) -
33
Gramtica < atribuio > ::= < id > := < expr > < id > ::= A|B|C < expr > ::= < id > + < expr > | < id > * < expr > | ( < expr > ) | < id >
34
Gramtica Ambgua
a gramtica que permite mais de uma rvore de anlise sinttica para uma mesma sentena. Gramtica <atribuio> ::= <id> := <exp > <id> ::= A|B|C <expr> ::= <expr> + <expr> | <expr> * <expr> | ( <expr> ) | <id>
Sentena A:= B + C * A
35
A:= (B + C) * A
A:= B + C * A
37
A:= ( B + C ) * A
38
40
41
42
Como no existe produo que partindo de B implique na obteno de um 0, a sentena no pode ser obtida e portanto ela no uma sentena da gramtica.
43
44
A mudana de um estado Sn-1 para um estado Sn, ocasionada por uma entrada e, representada por:
47
48
49
Onde: S0 o estado inicial (primeira posio na coluna de estados); S1 o estado final (valor 1 na coluna de indicao de estados final e no-final) A leitura da tabela se d da seguinte forma: Na linha 1: estando o autmato no estado S0: ao receber uma entrada 0 ele continua no estado S0; ao receber uma entrada 1 ele passa ao estado S1. Na linha 2: estando o autmato no estado S1: ao receber uma entrada 0 ele passa ao estado S0; ao receber uma entrada 1 ele continua no estado S .
50
53
57
g(0, float) = 6 g(0, char) = 7 g(6, id) = 8g(7, id) = 8 g(2, id) = 8 g(8, ;) = 1 g(3, num) = 9 g(9, ]) = 4 g(4, ;) = 1
58
59
60
E as novas transies seriam: g(0, int) = x g(0, float) = x g(0, char) = x g(8, ,) = x g(x, id) = 8g(8, ;) = 1 g(8, [) = 3 g(3, num) = 9 g(9, ]) = 4 g(4, ,) = x g(4, ;) = 1
g(x, id) = 8
61
62
63
Compiladores - Introduo
O compilador um software de sistema cujo papel traduzir programas em linguagens de alto nvel (programa fonte), para linguagens de mquina (programa objeto).
O processo de traduo envolve duas tarefas bsicas: Anlise: o texto de na linguagem fonte avaliado e os erros so identificados, e Sntese: em que a sada em linguagem objeto gerado.
64
Compiladores - Introduo
A tarefa de anlise dependente da linguagem fonte a ser traduzida (C, Pascal, C++, etc). A tarefa de sntese tem uma ligao estreita c/ o hardware e dependente da linguagem de mquina. Para manter uma independncia entre as duas fases, um cdigo intermedirio gerado pela tarefa de anlise.
65
Compiladores - Fases
As tarefas de anlise e sntese podem ser subdivididas nas seguintes fases: Anlise lxica Anlise sinttica Anlise Anlise semntica Gerao de cdigo intermedirio Otimizao de cdigo Sntese Gerao de cdigo objeto E o compilador pode ser visto como sendo formado por um conjunto de componentes, de modo que cada fase seja executada por um componente.
66
Compiladores - Componentes
Portanto, um compilador seria constitudo pelos seguintes componentes: Analisador lxico Analisador sinttico Analisador semntico Gerador de cdigo intermedirio Otimizador de cdigo Gerador de cdigo objeto Alm dos componentes acima, o compilador tambm possui um gerenciador da tabela de smbolos. A tabela de smbolos uma estrutura de dados contendo um registro para cada nome de varivel, com campos para os atributos desse nome, como por exemplo: tipo, escopo, 67 endereo.
Anlise Lxica
A anlise lxica, tambm chamada de varredura, feita pelo analisador lxico. O analisador l cada caractere que compe o programa fonte agrupando-os em sequncias chamadas lexemas ou marcas (tokens, em ingls). Cada lexema representa uma unidade de informao do programa fonte. So exemplos de lexemas: Palavras reservadas: if, for, while, else, char. Identificadores: nomes de variveis e de constantes. Smbolos especiais: + - * / Valores numricos: 100 5.67 -76 A anlise lxica usa autmatos finitos para reconhecer os lexemas.
68
A Linguagem C- (SEMENOS)
<programa> ::= <lista-decl> <lista-decl>::= <lista-decl> <decl> | <decl> <decl> ::= <decl-var> | <decl-funo> <decl-var> ::= <tipo> ID; | <tipo> ID [ NUM ]; <tipo> ::= int | <tipo-fun> ::= int | void <decl-funo> ::= <tipo-fun> ID (<parmetros>) <bloco-decl> <parmetros> ::= <lista-parmetros> | void <lista-parmetros>::= <lista-parmetros>, <parmetro> | <parmetro> <parmetro>::= <tipo> ID | <tipo> ID [ ] <bloco-decl> ::= { <decl-locais> <lista-comandos> } <decl-locais> ::= <decl-locais> <decl-var> | <lista-comandos> ::= <lista-comandos> <comando> |
70
A Linguagem C- (SEMENOS) (Continuao) <comando> ::= <decl-expresso>| <bloco-decl> | <decl-seleo> <decl-iterao> | <decl-retorno> <decl-expresso> ::= <expresso> ; | ; <decl-seleo>::= if ( <expresso ) <comando> | if ( <expresso ) <comando> else <comando> <decl-iterao>::= while ( <expresso> ) <comando> <decl-retorno> ::= return ; | return <expresso> ; <expresso> ::= <var> = <expresso-simples> | <expresso-simples> <var> ::= ID | ID [ <expresso> ] <expresso-simples> ::= <expresso-soma> <relacional> <expressosoma> 71 | <expresso-soma>
72
73
74
Projeto de Compilador para a Linguagem CDefinio do tipo de dados tipoToken (arquivo auxiliar.h)
typedef enum { /*Palavras reservadas*/ ELSE, IF, INT, VOID, WHILE, RETURN, /*Operadores aritmticos*/ MAIS, MENOS, VEZES, DIVIDIDO, /*Operadores relacionais*/ MENOR, MENORIGUAL, MAIOR,MAIORIGUAL, IGUAL, DIFERENTE, /*Smbolos especiais*/ ATRIBUICAO, PTOVIRGULA, VIRGULA, APARENTESIS, FPARENTESIS, ACOLCHETE, FCOLCHETE, ACHAVE, FCHAVE, /*Identificadores, Nmeros e Comentrios*/ ID, NUM, COMENTARIO, /*Controles*/ ERRO, FIMARQ } tipoToken;
77
79
80
Valor de retorno: COMENTARIO Exerccio Avaliado: 1) Desenhar um autmato para reconhecimento dos operadores relacionais.
81
82
83
84
Projeto do analisador lxico: Algoritmo de validao de comentrios, ID,NUM e / char c; tipoToken token; int estado, tokenStringIndex = 0; estado = 0; while(estado != 4) { c = getNextChar(); /* leitura do prximo caractere */ switch(estado) { case 0: if(isdigit(c)) /* Se c for um algarismo (0..9) */ estado = 6; else if(isalpha(c)) /* Se c for um caractere (a...z, A...Z) */ estado = 5; else if(c == /) estado = 1; else if(c == ) estado = 0; else { estado = 11; /* estado de erro, por enquanto*/ token = ERRO; } 85 break;
Algoritmo para validao de comentrios, ID, NUM e / case 5: if( !(isalpha(c)) ) { estado = 4; token = ID; } break; case 6: if( !(isdigit(c)) ) { estado = 4; token = NUM; } break;
Exerccio Avaliado: Completar o algoritmo com a validao de operadores relacionais e do operador de atribuio. Fazer com que o contedo do lexema seja armazenado em tokenString.
87
//Tabela de palavras reservadas struct palavraReservada tabelaPalavrasReservadas[] = { {"else",ELSE}, {"if",IF}, {"int",INT}, {"void",VOID}, {"while",WHILE}, {"return",RETURN} };
88
Anlise Sinttica
A anlise sinttica feita pelo analisador sinttico. O analisador solicita ao analisado lxico cada tipo de lexema (usando getNextToken()) que compe o programa fonte e testa-os nas produes da linguagem. Por exemplo, uma declarao de varivel em C- pode ser representada pelo grafo sinttico abaixo:
E assim, int alfa; e int beta[10]; seriam reconhecidas como declaraes de variveis da linguagem C- pelo algoritmo do prximo slide.
89
90
<bloco-decl>
Como a declarao de comando em C- possui recurso implcita (boco-decl usa comando que pode ser bloco decl), no possvel obter um grafo sinttico constitudo apenas pelos smbolos da linguagem.
92
94
28 Termo() 29 { 30 Fator() //Ativar regra <fator> 31 Enquanto (token = VEZES) 32 token = LerNovoToken() 33 Fator() //Ativar regra <fator> 34 Fim_Enquanto 35 } 36 Fator() 37 { 38 Caso token = APARENTESIS 39 token = LerNovoToken() 40 Exp() //Ativar regra <exp> 41 ValidarToken(FPARENTESIS) 42 Caso token = NUM 43 token = LerNovoToken() 44 Caso contrrio 45 token = ERRO 46 Fim_caso 47 }
95
Exerccio ( fazer para os alunos acompanharem) Simular a execuo do algoritmo do analisador sinttico anterior, no reconhecimento da sentena: 12 + 31 * ( 45 + 10) Situao aps a leitura do primeiro token e chamada da funo EXP. Funo AnalisadorSintatico Exp Token Lido NUM Linha de Retorno 14 Lexema 12
96
Exerccio Avaliado: Simular a execuo do algoritmo do analisador sinttico anterior, no reconhecimento da sentena: ( (12 * 31) + (45 * 10 ) )
Observao Importante
Devem conter testes que possibilitem a escolha inequvoca do caminho a ser percorrido.
97
98
Decl() { int temp; temp = posicaoLeitura; if(token == VOID) DeclFuncao(); else //Pesquisar frente { showToken = 0; token = getNextToken(); ValidarToken(ID); if(token == APARENTESIS) { showToken = 1; posicaoLeitura = temp; // restaura situao de entrada token = INT; // restaura token da entrada DeclFuncao(); }
99
....continua
...continuao Decl()
else if((token == ACOLCHETE)||(token == PTOVIRGULA)) { showToken = 1; posicaoLeitura = temp; // restaura situao de entrada token = INT; // restaura token da entrada DeclVar(); } else { token = ERRO; showToken = 1; }
100
DeclVar() { Tipo(); ValidarToken(ID); if(token == ACOLCHETE) { token = getNextToken(); ValidarToken(NUM); ValidarToken(FCOLCHETE); } ValidarToken(PTOVIRGULA); } Tipo() { ValidarToken(INT); } OBS: O uso da funo ValidarToken torna os algoritmos mais intuitivos, porm menos eficientes.
101
DeclFuncao() { TipoFunc(); ValidarToken(ID); ValidarToken(APARENTESIS); Parametros(); ValidarToken(FPARENTESIS); BlocoDecl(); } TipoFunc() { if((token == INT)||(token == VOID)) token = getNextToken(); else token = ERRO; }
102
Parametros() { if(token == VOID) token = getNextToken; else if(token == INT) ListaParametros(); else token = ERRO; } ListaParametros() { do { Parametro(); if(token == VIRGULA) token = getNextToken(); else break; }while(1); }
103
104
BlocoDecl() { if(token == ACHAVE) { token = getNextToken(); DeclLocais(); ListaComandos(); ValidarToken(FCHAVE); } else token = ERRO; } DeclLocais() { while(token == INT) DeclVar(); }
105
ListaComandos() { //Enquanto for um tokem inicial de comando while((token == ACHAVE) || (token == IF) || (token == WHILE) || (token == RETURN) || (token == ID) || (token = NUM) || (token == APARENTESIS) || (token == PTOVIRGULA)) { Comando(); // vai sem ler novo token } }
106
Comando() { switch(token) { case ACHAVE : BlocoDecl(); // # break; case IF : DeclSelecao(); // # vai sem ler novo token break; case WHILE : DeclIteracao(); // vai sem ler novo token break; case RETURN : DeclRetorno(); // vai sem ler novo token break; case PTOVIRGULA: // ; de <decl-expresso case APARENTESIS: // ( de <fator> case NUM : // NUM de <fator> case ID : DeclExpressao(); // ID de <var> e <ativao> # break; default : token = ERRO; } 107 }
DeclExpressao() { //Se token inicia Expresso if(token != PTOVIRGULA) Expressao(); //sem chamar novo token ValidarToken(PTOVIRGULA); } Var() { ValidarToken(ID); if(token == ACOLCHETE) { token = getNextToken(); Expressao(); ValidarToken(FCOLCHETE); } }
108
Expressao() { int temp; temp = posicaoLeitura; if((token == APARENTESIS)||(token == NUM)) // expresso-simples ExpressaoSimples(); //Sem chamar novo token else if(token == ID) //Pode ser expresso-simples ou var { showToken = 0; token = getNextToken(); if((token == ATRIBUICAO)||(token == ACOLCHETE)) // var { showToken = 1; posicaoLeitura = temp; //restaura ponteiro de leitura token = ID; //restaura token Var(); ValidarToken(ATRIBUICAO); ExpressaoSimples(); }
109
...continua....
...continuao....Expressao() else { // expresso simples comeando com ID showToken = 1; posicaoLeitura = temp; //restaura ponteiro de leitura token = ID; //restaura token ExpressaoSimples();
} else }
token = ERRO;
110
DeclSelecao() { ValidarToken(IF); ValidarToken(APARENTESIS); Expressao(); ValidarToken(FPARENTESIS); Comando(); if(token == ELSE) token = getNextToken(); Comando(); }
111
DeclIteracao() { ValidarToken(WHILE); ValidarToken(APARENTESIS); Expressao(); ValidarToken(FPARENTESIS); Comando(); } DeclRetorno() { ValidarToken(RETURN); if(token != PTOVIRGULA) Expressao(); ValidarToken(PTOVIRGULA); }
112
ExpressaoSimples() { ExpressaoSoma(); //Sem chamar novo token if( (token == MAIOR) || (token == MAIORIGUAL) || (token == MENOR) || (token == MENORIGUAL) || (token == IGUAL) || (token == DIFERENTE)) { token = getNextToken(); ExpressaoSoma(); } } ExpressaoSoma() { Termo(); while((token == MAIS) || (token == MENOS)) { token = getNextToken(); Termo(); } }
113
Termo() { Fator(); while((token == VEZES) || (token == DIVIDIDO)) { token = getNextToken(); Fator(); } } Ativacao() { ValidarToken(ID); ValidarToken(APARENTESIS); Args(); ValidarToken(FPARENTESIS); }
114
Fator() { int temp; temp = posicaoLeitura; switch(token) { case APARENTESIS: token = getNextToken(); // ( <expresso> ) Expressao(); ValidarToken(FPARENTESIS); break; case NUM: token = getNextToken(); // NUM break; case ID: showToken = 0; token = getNextToken(); if(token == APARENTESIS) // ativao { showToken = 1; posicaoLeitura = temp; token = ID; Ativacao(); 115 } ....continua.....
...continuao Fator() else // <var> { showToken = 1; posicaoLeitura = temp; token = ID; Var(); } break; token = ERRO; showToken = 1; break;
default: }
116
Args() { if((token == APARENTESIS)||(token == NUM)||(token== ID)) ListaArg(); } ListaArg() { do { Expressao(); if(token == VIRGULA) token = getNextToken(); else break; }while(1); }
117
118
119
Portanto, 16810 = A816 156910 = X16 ? 1569 / 16 = 98, 98 / 16 = 6, 6 / 16 = 0, resto = 1 resto = 2 resto = 6 116 = 1 216 = 2 616 = 6
120
Computador Simplificado de Instruo Arquitetura do computador CSI Memria A mmria do computador CSI constituida por 32.768 bytes (215 ) contguos. Cada 3 bytes consecutivos formam uma palavra (word) de 24 bits. Um endereo corresponde posio de um determinado byte na memria. Palavras (words) so endereadas pela localizao do byte mais esquerda.
121
Computador Simplificado de Instruo - Arquitetura Registradores Existem 5 registradores de 24 bits (uma palavra) no CSI:
Mnemnico A X L Nmero 0 1 2 Utilizao Acumulador, usado para operaes aritmticas. Registrador de ndices, usado para endereamento. Registrador de ligao (linkage register). A instruo JSUB ( chamada de subrotina) guarda o endereo de retorno neste registrador. Contador do programa (program counter). Contm o endereo da prxima instruo a ser executada. Palavra de estado (status word). Contm uma variedade de informaes, inclusive o Cdico de Condio (Condition Code) CC.
122
PC SW
8 9
Computador Simplificado de Instruo Formato de Dados Caracteres ASCII em representao hexadecimal. - Dgitos 0..9 : cdigo ASCII de 30 a 39 - Letras Maisculas A..Z: cdigo ASCII de 41 a 5A - Letras Minsculas a..z: cdigo ASCII de 61 a 7A Modos de Endereamento Todas as instrues tm 24 bits (uma palavra) e possuem o seguinte formato:
Computador Simplificado de Instruo O computador CSI possui dois modos de endereamento indicados pela flag x: modo DIRETO e modo Indexado. O endereo final TA (target adress) calculado a partir do endereo da instruo: Modo Indicao Clculo do Endereo Direto x=0 TA = endereo Indexado x=1 TA = endereo + (X) Obs: (X) representa o contedo do registrador de ndices X Exemplo de instruo em modo direto ADD ALFA 00011000 00000000 00001111 Significado dessa instruo: Some o valor contido no endereo de ALFA (15) com o contedo do acumulador (registrador A).
124
Computador Simplificado de Instruo Exemplo de instruo em modo indexado: LDA BETA, X 00000000 10000000 00001111 Significado dessa instruo: Carregar o acumulador (registrador A) com o contedo do endereo (BETA + (X)) Se o registrador X estiver carregado com (X) = 00000000 00000000 00001010 O endereo final (TA) ser dado por : endereo base 00000000 00001111 (X) 00000000 00001010 TA 00000000 00011001
125
A <-- (A) + ( m..m + 2) A <-- (A) & ( m..m + 2) (A) : (m..m + 2) C A <-- (A) / (m..m + 2) PC <-- m PC <-- m se CC indicar = PC <-- m se CC indicar > PC <-- m se CC indicar < L <-- (PC); PC <-- m A <-- (m..m + 2) A[ byte mais direita] <-- (m) L <-- (m..m + 2)
126
dispositivo especificado por (m) P PC <-- (L) m..m + 2 <-- (A) m <-- (A) [byte mais direita] m..m + 2 <-- (L) m..m + 2 <-- (SW) P m..m + 2 <-- (X) A <-- (A) (m..m + 2) 127
Nota
E0 Testa dispositivo especificado por (m) P, C 2C X <-- (X) + 1; (X) : (m..m + 2) C DC Dispositivo (m) <-- (A) [byte mais direita] P
OBSERVAES: 1) As letras na coluna Nota tm o seguinte significado: C : a instruo seta o cdigo de condio CC usado p/ indicar o resultado da operao (<, =, >); P : a instruo uma instruo privilegiada. 2) Parntesis so usados para indicar o contedo de uma posio de memria ou registrador. Por exemplo (A) indica o contedo do registrador A; (m..m + 2) indica o contedo das posies de memria m at m+2; 3) m..m + 2 <-- (A) especifica que o contedo do registrador A armazenado na palavra que comea no endereo m.
128
Computador CSI
Diretivas da Linguagem Assembler do CSI START Especifica o nome e o endereo inicial do programa. END BYTE Indica o final do programa fonte e (opcionalmente) especifica a primeira instruo executvel do mesmo. Gera um caractere ou constante hexadecimal neste ltimo caso, ocupa tantos bytes quanto necessrio para representar a constante. WORD Gera uma constante inteira com o tamanho de uma RESB RESW palavra 24 bits. Reserva uma rea de memria com o tamanho correspondente ao nmero de bytes indicado. Reserva uma rea de memria com o tamanho correspondente ao nmero de palavras indicado.
129
Computador CSI Exemplos de Programao Assembler Movimentao de Dados Como no existem instrues para movimentar dados diretamente na memria do computador a movimentao deve ser feita atravs dos registradores. No exemplo, para mover a constante FIVE para a varivel ALFA, utilizado o acumulador A, entretanto poderiam ser utilizados tanto o registrador X (LDX, STX) como o registrador L ( LDL, STL). Para mover a letra 'Z' para a varivel C1 o exemplo utiliza as instrues LDCH e STCH. Estas instrues operam sobre o byte mais direita do registrador A no afetando os demais bytes.
130
Computador CSI Exemplos de Programao Assembler Label Instruo Operando LDA STA LDCH STCH ALFA RESW FIVE WORD CHARZ BYTE C1 RESB FIVE ALFA CHARZ C1 1 5 CZ 1 Comentrio Registrador A constante 5 ALFA (A) Registrador A caractere Z Varivel caractere C1 (A) Reserva 3Bytes p/a varivel ALFA Define a constante FIVE do tipo WORD e atribui mesma o valor 5 Define a constante CHARZ do tipo BYTE e atribui mesma o caractere Z Reserva 1 byte para a varivel C1
131
Computador CSI Exemplos de Programao Assembler 'Looping' e Indexao com a Instruo TIX
O exemplo a seguir copia uma 'string' de 5 caracteres (STR1) para outra 'string' (STR2). O registrador de ndices X inicializado com o valor zero, assim, na primeira passagem pelo 'loop' o endereo final (STR1 + X) para a instruo LDCH ser o endereo do primeiro byte da 'string' STR1. Similarmente, a instruo STCH armazenar o caractere copiado na primeira posio da 'string' STR2. A seguir a instruo TIX incrementa 1 ao valor do registrador X e compara o resultado com o tamanho da 'string' ( fornecido pelo operando CINCO). O resultado dessa comparao guardado no cdigo de condio CC para posterior uso pela instruo JLT. A instruo JLT testa o cdigo de condio CC. Se este contiver a informao '<' ento o endereo de salto MOVECH colocado no registrador PC, provocando o retorno para a leitura de um novo caractere.
133
Computador CSI Exemplos de Programao Assembler 'Looping' e Indexao com a Instruo TIX
Instruo Operando LDX ZERO MOVECH LDCH STR1, X STCH STR2, X TIX CINCO JLT MOVECH STR1 BYTE C'TESTE' STR2 ZERO CINCO RESB WORD WORD 5 0 5 Label Comentrio Inicia o registrador de ndices com 0 Carrega em A o caractere de STR1[X] Armazena o caractere em STR2[X] Soma 1 ao ndice e compara-o com 5 Se ndice < 5 salta para MOVECH Define uma constante do tipo caractere, com 5 bytes e contedo 'TESTE' Reserva 5 bytes para a varivel STR2 Define a constante ZERO (c/ valor 0) Define a constante CINCO (c/ valor 5)
134
Computador CSI Exemplos de Programao Assembler 'Looping' e Indexao sem a Instruo TIX
Este exemplo executa a soma de dois arrays de inteiros de 100 posies, de forma que o resultado seja dado por: GAMA[i] = ALFA[i] + BETA[i] Label Instruo Operando Comentrio LDA ZERO Carrega a constante ZERO em A STA INDEX Inicia a varivel INDICE com 0 ADDLP LDX INDEX Carrega o registrador de ndices LDA ALFA, X Carrega em A o contedo de ALFA[x] ADD BETA, X Soma BETA[X] ao contedo de A STA GAMA, X Armazena em GAMA[X] o contedo de A LDA INDEX Carrega A com o contedo de INDEX ADD THREE Soma 3 ao valor contido em A STA INDEX Armazena em INDEX o novo valor COMP K300 Compara o novo ndice com 300 JLT ADDLP Se ndice < 300 salta para ADDLP continua...
135
Computador CSI Exemplos de Programao Assembler 'Looping' e Indexao sem a Instruo TIX
...continuao... Label INDEX ALFA BETA GAMA ZERO K300 THREE Instruo Operando Comentrio RESW 1 Reserva 3 bytes para INDEX RESW 100 Reserva 300 bytes para o array ALFA RESW 100 Reserva 300 bytes para o array BETA RESW 100 Reserva 300 bytes para o array GAMA WORD 0 Define a constante ZERO com valor 0 WORD 300 Define a constante K300 com o valor 300 WORD 3 Define a constante THREE com o valor 3
136
Neste exemplo utilizamos uma subrotina (READ) que l um registro de 100 bytes de um dispositivo de entrada e armazena esses bytes na memria do computador. Label Instruo Operando Comentrio JSUB READ Chamada da subrotina READ .... READ LDX ZERO Inicia o registrador de ndices com 0 RLOOP TD IDEV Testa o dispositivo de entrada JEQ RLOOP Retorna para RLOOP se o dispositivo no estiver disponvel. RD IDEV L um byte de INDEV e guarda em A STCH REC, X Armazena o caractere em REC[X] TIX K100 Soma 1 ao ndice e compara-o com 100 JLT RLOOP Salta para RLOOP se ndice < 100 RSUB Retorna da Subrotina IDEV BYTE X'F1' Define o dispositivo de entrada (base 16) REC RESB 100 Reserva 100 bytes p/ dados de entrada ZERO WORD 0 Define a constante ZERO com valor 0 138 K100 WORD 100 Define a constante K100 com valor 10
Gerao de Cdigo em Linguagem da Mquina para o Computador CSI Os passos para converter o cdigo assembler do CSI em linguagem de mquina so: 1 converter os mnemnicos em seus equivalentes em linguagem de mquina. Por exemplo: as instrues STL, J e LDCH devem ser convertidas em 14, 3C e 50. 2 - Atribuir endereos - em hexadecimal - s instrues do programa. Cada instruo do computador CSI armazenada em uma palavra de 3 bytes. 3 - Converter os operadores simblicos nos seus respectivos endereos de mquinas. 4 - Converter as constantes do programa fonte em seus equivalentes em linguagem de mquina. Os valores sero representados em hexadecimal. 5 - Construir as instrues de mquinas. 139
Gerao de Cdigo em Linguagem da Mquina para o Computador CSI Os passos para converter o cdigo assembler do CSI em linguagem de mquina so: 1 converter os mnemnicos em seus equivalentes em linguagem de mquina. Por exemplo: as instrues STL, J e LDCH devem ser convertidas em 14, 3C e 50. Linha Instrues Opcode 5 COPY START 1000 10 FIRST STL RETADR 14 15 CLOOP JSUB RDREC 48 20 LDA LENGTH 00 25 COMP ZERO 28 30 JEQ ENDFIL 30 45 ENDFIL LDA EOF 00 50 STA BUFFER 0C 140 55 LDA THREE 00
Gerao de Cdigo em Linguagem da Mquina para o CSI 2 - Atribuir endereos - em hexadecimal - s instrues do programa. Cada instruo do computador CSI armazenada em uma palavra de 3 bytes. Linha 5 10 15 20 25 30 35 40 45 50 55 End COPY 1000 FIRST 1003 CLOOP 1006 1009 100C 100F 1012 1015 ENDFIL 1018 101B Instrues START 1000 STL RETADR JSUB RDREC LDA LENGTH COMP ZERO JEQ ENDFIL JSUB WRREC J CLOOP LDA EOF STA BUFFER LDA THREE Opcode 14 48 00 28 30 48 3C 00 0C 00
141
Gerao de Cdigo em Linguagem da Mquina para o Computador CSI Os passos para converter o cdigo assembler do CSI em linguagem de mquina so: 3 - Converter os operadores simblicos e constantes nos seus respectivos endereos de mquinas. Linha End Instrues End Mq Opcode 5 COPY START 1000 10 1000 FIRST STL 1033 14 15 1003 CLOOP JSUB 2039 48 20 1006 LDA 1036 00 25 1009 COMP 1030 28 30 100C JEQ 1015 30 35 100F JSUB 2061 48 40 1012 J 1003 3C 45 1015 ENDFIL LDA 1027 00
142
Gerao de Cdigo em Linguagem da Mquina para o Computador CSI Os passos para converter o cdigo assembler do CSI em linguagem de mquina so: 4 - Construir as instrues de mquinas. Linha Instrues End Mq & Instrues de Constantes Mquina 5 COPY START 1000 10 FIRST STL 1033 141033 15 CLOOP JSUB 2039 482039 20 LDA 1036 001036 25 COMP 1030 281030 30 JEQ 1015 301015 35 JSUB 2061 482061 40 J 1003 3C1003 45 ENDFIL LDA 1027 001027
143
Cdigo de 3 Endereos
O cdigo de 3 endereos um cdigo intermedirio que tem por objetivo facilitar a gerao de cdigo alvo. Exemplos: Comando original: alfa = (alfa + beta) (alfa * beta) Cdigo de 3 endereos: T1 = alfa + beta T2 = alfa * beta alfa = T1 T2 Cdigo em assembler construdo a partir do cdigo de 3 end. LDA alfa LDA alfa ADD beta MUL beta STA t1 STA t2 LDA alfa LDA alfa cdigo otimizado MUL beta ADD beta STA t2 SUB t2 LDA t1 STA alfa SUB t2 STA alfa
144
Cdigo de 3 Endereos
Exemplos: Comando original: alfa = alfa * beta alfa / beta Cdigo de 3 endereos: T1 = alfa * beta T2 = alfa / beta alfa = T1 T2 Cdigo em assembler construdo a partir do cdigo de 3 end. LDA alfa LDA alfa MUL beta DIV beta STA t1 STA t2 LDA alfa LDA alfa cdigo otimizado DIV beta MUL beta STA t2 SUB t2 LDA t1 STA alfa SUB t2 STA alfa
145
Referncias Bibliogrficas
[1] AHO, A. V.; LAM, M.S.; SETHI, R. e ULLMAN, J. D. Compiladores: princpios, tcnicas e ferramentas. 2a ed. So Paulo: Addison Weslley, 2008. 634p. [2] NETO, J. J. Introduo compilao. So Paulo: LTC, 1987. 222p. [3] PRICE, A.M.A.; TOSCANI, S.P. Implementao de linguagens de programao: compiladores. 3 ed. Porto Alegre: Bookman, 2008, 195p. [4] SETZER, V. W. e MELO, I. S. H. Construo de um compilador. Rio de Janeiro: Editora Campus, 1986. 325p. [5] LOUDEN, K.C. Compiladores princpios e prticas. So Paulo: Pioneira Thomson Learning, 2004. 569p. [6] FISCHER, C. N.; LEBLANC, R. J. Crafting a compiler with C. New York: Benjamin/Cummungs, 1991. 812p. [7] HOPCROFT, J. E.; ULLMAN, J. D. Introduction to automata theory, languages, and computation. Massachusetts: Assison-Weslwy Publisshing Company, 1979. 410p. [8] KELLEY, D. Automata and formal languages - an introduction. Englewood Cliffs: Prentice Hall, 1995. 240p.
146