auto-avaliação experimental em slacgec.di.uminho.pt/discip/lesi/slac9495/autoav-jul.doc  · web...

72
Universidade do Minho Auto-avaliação Experimental em SLAC ___________________________________________________________ _________ Curso: Engª Sistemas e Informática Exame(2ª Cham) 95/07/03 Disciplina: Sist. Lógicos e Arq. de Computadores Duração: 3h 00 min (global) Componente Teórica (Quem pretender efectuar apenas a parte do exame relativa à matéria do 2º semestre não deve responder às questões assinaladas com um asterisco * ) 1. Considere o seguinte pedaço de código em C: struct s_reg { int s_reg_i ; real s_reg_r ; } ; void copia (struct s_reg *selo) { real x1 ; char c1 ; int i[10] ; ... (selo-> s_reg_i) = i[3] ; ... a) O texto com esta função está armazenado num ficheiro de texto (com caracteres ASCII) no disco de um computador pessoal (com início num sector já identificado, sector_x). Identifique a sequência de passos que o CPU tem de executar para que o conteúdo desse ficheiro seja transferido para a memória do computador (com início na posição celula_x), sem passar pelo CPU. Não precisa de detalhar esses passos, apenas identificá-los.

Upload: others

Post on 15-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

Auto-avaliação Experimental em SLAC

____________________________________________________________________

Curso: Engª Sistemas e Informática Exame(2ª Cham) 95/07/03Disciplina: Sist. Lógicos e Arq. de Computadores Duração: 3h 00 min

(global)

Componente Teórica

(Quem pretender efectuar apenas a parte do exame relativa à matéria do 2º semestre não deve responder às questões assinaladas com um asterisco * )

1. Considere o seguinte pedaço de código em C:

struct s_reg {int s_reg_i ;real s_reg_r ;} ;

void copia (struct s_reg *selo) {real x1 ;char c1 ;int i[10] ;...(selo-> s_reg_i) = i[3] ;...

a) O texto com esta função está armazenado num ficheiro de texto (com caracteres ASCII) no disco de um computador pessoal (com início num sector já identificado, sector_x). Identifique a sequência de passos que o CPU tem de executar para que o conteúdo desse ficheiro seja transferido para a memória do computador (com início na posição celula_x), sem passar pelo CPU. Não precisa de detalhar esses passos, apenas identificá-los.Sugestão: Identifique primeiro os componentes que deverão estar no computador para efectuar essa operação.

Resolução

* b) Uma vez na memória do computador, esse ficheiro vai ser traduzido para depois ser executado no CPU, com a opção de gerar também código em assembly language. Qual o nome desse "tradutor" e o que o distingue do assembler?

Resolução

Page 2: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.Nota: O MAC-1 tem apenas um registo para dados, o AC, e apenas um registo de apontadores, o SP; o instruction set do MAC-1 está na figura anexa.

Resolução

*d) Mostre o conteúdo da stack que contém o campo do activation record reservado para a variável local x1, sabendo que lá se encontra armazenado o valor '40.625'.Nota: V = (-1)^(S) * (1.F) * 2 ^(E-127) no formato simples IEEE

Resolução

* e) O código em assembly language resultante da tradução da instrução(selo-> s_reg_i) = i[3] ;

contém normalmente pelo menos 3 instruções, que servem para: colocar num registo o endereço da variável passada como parâmetro, colocar noutro registo o elemento do array, e copiar para a zona de memória, cujo início é apontado pelo 1º registo, o conteúdo do 2º registo. Embora no M68020 esta instrução do C possa ser implementada com apenas uma instrução em assembly language, apresente uma solução com 2 instruções. Indique claramente o significado dos símbolos que usar, mas não necessita de indicar os seus valores. O formato da instrução no M68020 é "MOVE.size <origem>,<destino>", e a sintaxe dos modos de endereçamento está na figura anexa.

Resolução

* f) A 2ª instrução no i86 poderia ser "LEA BX, i[3]". De acordo com o formato de instrução apresentado na figura anexa, represente esta instrução em binário. Sugestão: Se não fez a alínea c), construa a parte relevante do activation record, i.e., com as variáveis locais.

Resolução

g) Pretende-se acrescentar ao instruction set do MAC-1 uma nova instrução equivalente ao LEA do i86 (ver alínea f)), com o seguinte comportamento: "ac= sp + x". Considerando que a busca e descodificação da instrução já está no microcódigo, construa em MAL a parte do microcódigo que executa esta nova instrução na microarquitectura do MIC-2.

Resolução

h) O registo MAR do CPU do MAC-1 é o único que pode escrever no Address Bus, não havendo necessidade que as saídas dos seus FF's sejam colocados em tri-state. Represente esquematicamente 1 bit deste registo (i.e., apenas um dos FF's), indicando explicitamente a proveniência e destino de cada sinal ligado ao FF.

Resolução

Page 3: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

i) Este programa vai ser escrito numa impressora ligada ao computador através duma porta paralela, de acordo com o esquema de ligação da figura anexa. Identifique e caracterize sumariamente todos os sinais que ligam o CPU ao controlador de portas paralelas.

Resolução

j) Pretende-se configurar o controlador de portas paralelas para o esquema de ligação da figura anexa. Mostre em binário o valor que deveria ser escrito no registo de configuração. Justifique todas as opções que tomar.

Resolução

Page 4: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. a) O texto com esta função está armazenado num ficheiro de texto (com caracteres ASCII) no disco de um computador pessoal (com início num sector já identificado, sector_x). Identifique a sequência de passos que o CPU tem de executar para que o conteúdo desse ficheiro seja transferido para a memória do computador (com início na posição celula_x), sem passar pelo CPU. Não precisa de detalhar esses passos, apenas identificá-los.Sugestão: Identifique primeiro os componentes que deverão estar no computador para efectuar essa operação.

Resolução

A sugestão apresentada para identificar primeiro os componentes tinha como objectivo obrigar as pessoas a pensar primeiro quais seriam todos os intervenientes nesta operação. A maioria dos que vieram ao exame identificaram alguns deles, mas foram raros os que identificaram todos... Vamos ver primeiro excertos de algumas respostas apresentadas quanto à sequência de passos pedida (apenas corrigidas ortograficamente); seleccione a que lhe parecer mais adequada:

R1. "O CPU executa a instrução que contém o código de operação a executar, e identifica que é uma transferência entre o disco e a MEM, pois nesta instrução diz também onde estão os dados e como se poderão aceder..."

R2. "O CPU utiliza o barramento de controlo para activar ou desactivar "as opções" no controlador de acesso directo à memória. O CPU coloca no barramento de endereços o endereço da posição onde começa o ficheiro de texto no disco"

R3. "Depois de identificado o sector, o CPU manda um sinal HOLD e outro HLDA para o DMA. Tendo esses sinais o DMA pode requesitar o uso de um BUS para fazer a transferência directa do dispositivo I/O para o disco..."

R4. "Terá de se proceder da seguinte forma: inicializar os registos do controlador DMA com os endereços destino desejados; inicializar o controlador de disco para o tipo de disco, tamanho do bloco a transferir, início do bloco (ficheiro) a transferir, activar a transmissão (chamar o respectivo interrupt).

R5. "Primeiro o CPU faz a interrupção para aceder ao disco, posiciona-se no sector do disco, verifica se o barramento de dados está livre, se este estiver livre começa a leitura do disco e começa a passar os dados para o barramento, manda os sinais necessários ao DMAC para que este dê acesso a memória pelo barramento de dados, verificando depois se o pode fazer, e fazendo-o por fim."

R6. "A partir do momento em que o o disco tem pronto um byte de dados, este envia um sinal de DREQ para o DMA. Se as entradas do DMAC estiverem não mascaráveis, ele recebe o sinal e envia um HRQ para o CPU. O CPU por sua vez envia o HLDA para o DMA, libertando os barramentos..."

Page 5: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. a) O texto com esta função está armazenado num ficheiro de texto (com caracteres ASCII) no disco de um computador pessoal (com início num sector já identificado, sector_x). Identifique a sequência de passos que o CPU tem de executar para que o conteúdo desse ficheiro seja transferido para a memória do computador (com início na posição celula_x), sem passar pelo CPU. Não precisa de detalhar esses passos, apenas identificá-los.Sugestão: Identifique primeiro os componentes que deverão estar no computador para efectuar essa operação.

R1. "O CPU executa a instrução que contém o código de operação a executar, e identifica que é uma transferência entre o disco e a MEM, pois nesta instrução diz também onde estão os dados e como se poderão aceder..."

Será que também diz se se pode aceder de bicicleta ou de comboio?Com esta resposta fica-se com a impressão que quem redigiu estas linhas nunca escreveu nenhum programa em assembly para aceder a controladores de periféricos. Será que mesmo com o instrucion set do i86 presente não é possível verificar que não existem instruções com essas especificações?

Sugiro muito fortemente que estude com cuidado os tipos de operações que o CPU normalmente executa (no capítulo 6. Operations on Data [Goor]) e que só depois leia os capítulos do [Hall] para compreender os mecanismos de interface com o exterior.

E depois tente de novo...

Page 6: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. a) O texto com esta função está armazenado num ficheiro de texto (com caracteres ASCII) no disco de um computador pessoal (com início num sector já identificado, sector_x). Identifique a sequência de passos que o CPU tem de executar para que o conteúdo desse ficheiro seja transferido para a memória do computador (com início na posição celula_x), sem passar pelo CPU. Não precisa de detalhar esses passos, apenas identificá-los.Sugestão: Identifique primeiro os componentes que deverão estar no computador para efectuar essa operação.

R2. "O CPU utiliza o barramento de controlo para activar ou desactivar "as opções" no controlador de acesso directo à memória. O CPU coloca no barramento de endereços o endereço da posição onde começa o ficheiro de texto no disco"

R3. "Depois de identificado o sector, o CPU manda um sinal HOLD e outro HLDA para o DMA. Tendo esses sinais o DMA pode requesitar o uso de um BUS para fazer a transferência directa do dispositivo I/O para o disco..."

Ao se pedir Identifique a sequência de passos que o CPU tem de executar para que ... estava-se a sugerir que descrevesse informalmente o algoritmo do código que o CPU teria de executar para que... sem no entanto excluir outras acções que o CPU poderia tomar, nomeadamente na activação de sinais específicos associados a alguns dos seus pinos.

Contudo, analise melhor cada uma destas respostas:

- O CPU utiliza o barramento de controlo para activar ou desactivar "as opções" no controlador : acha que é este o meio normal de o CPU enviar comandos a um controlador de periféricos? É claro que o CPU usa alguns dos sinais do barramento de controlo para aceder a um controlador de periféricos (quais?), mas a selecção das "opções" faz-se escrevendo uma palavra de controlo num dos registos de controlo desse componente.

- O CPU coloca no barramento de endereços o endereço da posição onde começa o ficheiro de texto no disco : será essa a utilidade do barramento de endereços? Será lá que se colocam endereços de sectores do disco? Pense lá um pouco e tente saber onde é que esse endereço deverá ser colocado...

- o CPU manda um sinal HOLD e outro HLDA para o DMA : sem comentários!

- Tendo esses sinais o DMA pode requesitar o uso de um BUS para fazer a transferência directa : pois pode, mas o que importa saber é a altura em que ele o pode fazer!...

Conclusão: viu-se que o CPU precisa de enviar comandos e informação adicional ao(s) controlador(es), e que existirá também algum diálogo ao níveis de sinais electrónicos nos seus pinos. Organize melhor as suas ideias e tente responder de novo.

Page 7: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. a) O texto com esta função está armazenado num ficheiro de texto (com caracteres ASCII) no disco de um computador pessoal (com início num sector já identificado, sector_x). Identifique a sequência de passos que o CPU tem de executar para que o conteúdo desse ficheiro seja transferido para a memória do computador (com início na posição celula_x), sem passar pelo CPU. Não precisa de detalhar esses passos, apenas identificá-los.Sugestão: Identifique primeiro os componentes que deverão estar no computador para efectuar essa operação.

R4. "Terá de se proceder da seguinte forma: inicializar os registos do controlador DMA com os endereços destino desejados; inicializar o controlador de disco para o tipo de disco, tamanho do bloco a transferir, início do bloco (ficheiro) a transferir, activar a transmissão (chamar o respectivo interrupt).

A sequência de acções a desencadear estão aqui quase todas! Só mais uma linha e candidatava-se a ter a cotação toda.

O que falta aqui ou as gaffes cometidas:

- algum detalhe sobre a programação do DMAC, em particulr a dimensão do bloco a transferir ou o modo de transmissão (se controlado pelo periférico ou não, ...);

- activar a transmissão (chamar o respectivo interrupt) ? Não percebo! Compete ao controlador de disco activar a transmissão em conjunto com o controlador de DMA; só quando se concluir a transferência é que o CPU irá receber um pedido de interrupção (proveniente do controlador de disco), e vai então atendê-la (último passo da sequênca pedida).

Como se pode concluir desta resposta, a sugestão do enunciado tinha como objectivo obrigar a pensar que no computador deveriam estar presentes para além do CPU e memória, o controlador de disco e o controlador de DMA; é claro que também lá deverão estar o descodificador de endereços e muito provavelmente um controlador de interrupções, embora estes já não sejam relevantes para a resolução desta pergunta.

A pergunta seguinte...

Page 8: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. a) O texto com esta função está armazenado num ficheiro de texto (com caracteres ASCII) no disco de um computador pessoal (com início num sector já identificado, sector_x). Identifique a sequência de passos que o CPU tem de executar para que o conteúdo desse ficheiro seja transferido para a memória do computador (com início na posição celula_x), sem passar pelo CPU. Não precisa de detalhar esses passos, apenas identificá-los.Sugestão: Identifique primeiro os componentes que deverão estar no computador para efectuar essa operação.

R5. "Primeiro o CPU faz a interrupção para aceder ao disco, posiciona-se no sector do disco, verifica se o barramento de dados está livre, se este estiver livre começa a leitura do disco e começa a passar os dados para o barramento, manda os sinais necessários ao DMAC para que este dê acesso a memória pelo barramento de dados, verificando depois se o pode fazer, e fazendo-o por fim."

Esta resposta é composta por uma grande sequência de ideias disparatadas ou incompreensívies (8 ao todo)! Denota falta de estudo e falta de bases sobre a organização e funcionamento dum computador.

Sugere-se muito fortemente a leitura dos capítulos introdutórios de [Tanen] e os capítulos recomendados de [Hall].

E depois de estudar tente de novo...

Page 9: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. a) O texto com esta função está armazenado num ficheiro de texto (com caracteres ASCII) no disco de um computador pessoal (com início num sector já identificado, sector_x). Identifique a sequência de passos que o CPU tem de executar para que o conteúdo desse ficheiro seja transferido para a memória do computador (com início na posição celula_x), sem passar pelo CPU. Não precisa de detalhar esses passos, apenas identificá-los.Sugestão: Identifique primeiro os componentes que deverão estar no computador para efectuar essa operação.

R6. "A partir do momento em que o o disco tem pronto um byte de dados, este envia um sinal de DREQ para o DMA. Se as entradas do DMAC estiverem não mascaráveis, ele recebe o sinal e envia um HRQ para o CPU. O CPU por sua vez envia o HLDA para o DMA, libertando os barramentos..."

Este é um exemplo de que não basta estar com a maioria para se ter razão. A maioria dos colegas respondeu de modo semelhante, isto é, apenas referiu as comunicações ao nível de sinais entre os diversos componentes intervenientes.

Ao se pedir Identifique a sequência de passos que o CPU tem de executar para que ... estava-se a sugerir que descrevesse informalmente o algoritmo do código que o CPU teria de executar para que... sem no entanto excluir outras acções que o CPU poderia tomar, nomeadamente na activação de sinais específicos associados a alguns dos seus pinos, tal como referido aqui.

Com esta pergunta também se pretendia saber o que originara a acção A partir do momento em que o o disco tem pronto um byte de dados, bem como quem instruira as entradas do DMAC para estarem não mascaráveis.

Pense de novo e responda de novo...

Page 10: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. b) Uma vez na memória do computador, esse ficheiro vai ser traduzido para depois ser executado no CPU, com a opção de gerar também código em assembly language. Qual o nome desse "tradutor" e o que o distingue do assembler?

Resolução

Esta é uma pergunta típica dum tema que tem aparecido em quase todos os testes e exames. Contudo, alguns dos examinandos insistem em apresentar respostas disparatadas. Veja se consegue separar o trigo do joio e seleccione a resposta que lhe parece mais adequada:

R1. "O Instruction Unit faz o fetch da instrução e depois de descodificada ela é executada na Execution Unit onde estão os adders, multipliers, etc...."

R2. "O nome desse "tradutor" é compilador, pois traduz de uma linguagem de alto nível para código máquina. O que o distingue do assembler é que o assembler passa de uma linguagem de alto nível para assembly language, que não é bem código máquina mas sim tem as mnemónicas que vão levar ao código máquina"

R3. " O nome do tradutor é "Linker"... O que distingue é que este tradutor traduz um ficheiro (em texto), possivelmente de uma HLL, para uma linguagem de baixo nível, possivelmente em binário, e o assembler, como o próprio nome indica, monta uma correspondência directa entre uma linguagem de baixo nível (assembly language)."

R4. "O nome do tradutor é: compilador. O compilador "traduz" as mnemónicas das instruções em linguagem ASCII para linguagem máquina, pronto a ser executado. O assembler (=montar) pega nas instruções do assembly language e faz a sua respectiva "tradução" para os formatos de instruções em linguagem máquina."

Page 11: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. b) Uma vez na memória do computador, esse ficheiro vai ser traduzido para depois ser executado no CPU, com a opção de gerar também código em assembly language. Qual o nome desse "tradutor" e o que o distingue do assembler?

R1. "O Instruction Unit faz o fetch da instrução e depois de descodificada ela é executada na Execution Unit onde estão os adders, multipliers, etc...."

R3. " O nome do tradutor é "Linker"... O que distingue é que este tradutor traduz um ficheiro (em texto), possivelmente de uma HLL, para uma linguagem de baixo nível, possivelmente em binário, e o assembler, como o próprio nome indica, monta uma correspondência directa entre uma linguagem de baixo nível (assembly language)."

A primeira resposta é tão disparatada que nem merece comentários! Também quem respondeu assim não teve sequer 1 valor em toda a parte teórica, que valia 10... Estes disparates apenas mostram que nunca leu/assimilou os capítulos introdutórios a esta disciplina, nomeadamente os relativos a níveis virtuais; mostra ainda que nas aulas práticas usou mecanicamente as ferramentas que tinha à disposição sem saber o que estava a fazer!

A primeira parte de R3 mostra também uma certa confusão de conceitos... O resto mostra uma grande insegurança e um português difícil de seguir.

Sugiro que leia as secções 2.1 Machine level identification [Goor] e 2.2 Conversion mechanisms between machine levels[Goor], 1.2 Contemporary multilevel machines[Tanen], e ainda [Proe], e que procure lá a resposta mais adequada.

E depois volte a tentar responder!

Page 12: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. b) Uma vez na memória do computador, esse ficheiro vai ser traduzido para depois ser executado no CPU, com a opção de gerar também código em assembly language. Qual o nome desse "tradutor" e o que o distingue do assembler?

R2. "O nome desse "tradutor" é compilador, pois traduz de uma linguagem de alto nível para código máquina. O que o distingue do assembler é que o assembler passa de uma linguagem de alto nível para assembly language, que não é bem código máquina mas sim tem as mnemónicas que vão levar ao código máquina"

R4. "O nome do tradutor é: compilador. O compilador "traduz" as mnemónicas das instruções em linguagem ASCII para linguagem máquina, pronto a ser executado. O assembler (=montar) pega nas instruções do assembly language e faz a sua respectiva "tradução" para os formatos de instruções em linguagem máquina."

Estamos de acordo quanto ao facto de se tratar de um compilador. Já muita confusão existe quanto às diferenças entre este e o assembler... E pior ainda, são as explicações que são apresentadas no exame e que nada dizem! Eis algumas possíveis explicações inspiradas em respostas aos exames; escolha a mais apropriada:

R21. O compilador traduz de HLL para linguagem máquina para ser executado directamente pela máquina, enquanto o assembler apenas traduz de assembly para linguagem máquina, precisando depois de um loader

R22. O compilador traduz de HLL para assembly e o assembler deste nível para linguagem máquina.

R23. O compilador traduz de um nível para outro mais baixo, fazendo corresponder a cada instrução HLL uma ou mais instruções do nível mais baixo; o assembler converte as mnemónicas da linguagem máquina para os formatos de instrução associados a um dado CPU, em código binário.

Page 13: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. b) Uma vez na memória do computador, esse ficheiro vai ser traduzido para depois ser executado no CPU, com a opção de gerar também código em assembly language. Qual o nome desse "tradutor" e o que o distingue do assembler?

R2. "O nome desse "tradutor" é compilador, pois ..."

R21. O compilador traduz de HLL para linguagem máquina para ser executado directamente pela máquina, enquanto o assembler apenas traduz de assembly para linguagem máquina, precisando depois de um loader

Esta resposta mostra uma certa confusão de conceitos.

O compilador em princípio apenas converte de um nível superior (HLL por exemplo) para um nível mais baixo (assembler ou linguagem máquina), associando a cada instrução do nível superior uma ou mais instruções do nível inferior.

Contudo, quando se invoca um compilador num computador, normalmente associado ao comando encontra-se uma outra função, que permite que um aplicação possa ser compilado por partes, sem ser necessário compilar a aplicação toda, que é o linker. Este permite estabelecer referências cruzadas a nomes de variáveis externas à parte do programa a ser compilado, e que na maioria das vezes faz parte duma biblioteca associada ao próprio compilador. Se a opção de compilação não fôr para assembly, o ficheiro resultante normalmente está pronto a ser executado, faltando apenas completar algumas referências a endereços de memória, os quais estão dependentes da posição de memória onde ficará instalado o programa. Esta tarefa compete normalmente ao loader.

O assembler lê um programa escrito em mnemónicas de linguagem máquina, especialmente "montadas" para facilitar a sua legibilidade - por isso a designação de assembly language - e converte-as para os formatos de instruções associadas a um dado processador, em código binário. A cada instrução assembler corresponde normalmente uma instrução de linguagem máquina (quando isto não acontece á apenas para melhorar a legibilidade do programa em assembly). Os comentários feitos em cima sobre linkers e loaders também se aplicam ao assembler.

A principal diferença está descrita. Mas ainda há uma outra, para as quais já se apresentaram algumas pistas. Qual é?

Confirme a sua hipótese em R23.

Page 14: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. b) Uma vez na memória do computador, esse ficheiro vai ser traduzido para depois ser executado no CPU, com a opção de gerar também código em assembly language. Qual o nome desse "tradutor" e o que o distingue do assembler?

R2. "O nome desse "tradutor" é compilador, pois ..."

R22. O compilador traduz de HLL para assembly e o assembler deste nível para linguagem máquina.

O papel do compilador é mais lato que esse. Efectivamente os compiladores mais populares incluem normalmente essa opção de tradução, mas não é a utilização mais comum do compilador.

O compilador em princípio apenas converte de um nível superior (HLL por exemplo) para um nível mais baixo (assembler ou linguagem máquina), associando a cada instrução do nível superior uma ou mais instruções do nível inferior. O assembler lê um programa escrito em mnemónicas de linguagem máquina, especialmente "montadas" para facilitar a sua legibilidade - por isso a designação de assembly language - e converte-as para os formatos de instruções associadas a um dado processador, em código binário. A cada instrução assembler corresponde normalmente uma instrução de linguagem máquina (quando isto não acontece á apenas para melhorar a legibilidade do programa em assembly).

Um comentário agora sobre linkers e loaders, que têm confundido muitos. Quando se invoca um compilador/assembler num computador, normalmente associado ao comando encontra-se uma outra função, que permite que um aplicação possa ser traduzida por partes, sem ser necessário traduzir a aplicação toda, que é o linker. Este permite estabelecer referências cruzadas a nomes de variáveis externas à parte do programa a ser traduzido, e que na maioria das vezes faz parte duma biblioteca associada ao próprio compilador ou assembler. Se a opção de compilação não fôr para assembly, o ficheiro resultante normalmente está pronto a ser executado, faltando apenas completar algumas referências a endereços de memória, os quais estão dependentes da posição de memória onde ficará instalado o programa. Esta tarefa compete normalmente ao loader. Idêntica situação ocorre com o assembler.

A principal diferença está descrita. Mas ainda há uma outra, para as quais já se apresentaram algumas pistas. Qual é?

Confirme a sua hipótese em R23.

Page 15: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. b) Uma vez na memória do computador, esse ficheiro vai ser traduzido para depois ser executado no CPU, com a opção de gerar também código em assembly language. Qual o nome desse "tradutor" e o que o distingue do assembler?

R2. "O nome desse "tradutor" é compilador, pois ..."

R23. O compilador traduz de um nível para outro mais baixo, fazendo corresponder a cada instrução HLL uma ou mais instruções do nível mais baixo; o assembler converte as mnemónicas da linguagem máquina para os formatos de instrução associados a um dado CPU, em código binário.

Correcto! A principal diferença está identificada. Mas ainda há outra, que esta explicação refere ao de leve. Já conseguiu identificá-la?

Um compilador converte normalmente de uma linguagem HLL e independente do hardware numa linguagem de nível mais baixo, mas dependente do processador. O mesmo ficheiro de texto com um dado programa fonte tanto pode ser compilado para um PC, Mac ou um qualquer sistema Unix; a análise sintática e semântica é a mesma, apenas varia a componente de geração de código, que é altamente dependente da arquitectura onde vai ser executada.

Por sua vez o assembler converte duma linguagem dependente duma dada arquitectura de processador para uma linguagem dependente da implementação dessa mesma arquitectura, sendo essa a razão de se conseguir normalmente uma correspondência de 1 para 1.

A pergunta seguinte...

Page 16: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.

Nota: O MAC-1 tem apenas um registo para dados, o AC, e apenas um registo de apontadores, o SP; o instruction set do MAC-1 está na figura anexa.

Resolução

No activation record deverão estar presentes um conjunto de campos, com a seguinte ordem de ocupação na stack: os parâmetros explícitos, os parâmetros implícitos e as variáveis locais.

A 1ª parte do enunciado pedia a construção deste record com indicação dos tamanhos ocupados por cada item, supondo o record associado ao i86. Vamos construi-lo, apresentando as dimensões em número de células de memória, sabendo que cada célula de memória no PC tem... (quantos bytes?).

O activation record vai conter variáveis escalares do tipo int, char, real e apontadores de memória. De entre as diversas alternativas de dimensão que se seguem, qual escolheria?

R1. Int (1 célula), char (1), real (2), apont (2)

R2. Int (2 células), char (2), real (4), apont (2)

R3. Int (4 células), char (1), real (4), apont (4)

MAC-1

Vamos ver agora quais as diferenças que se vão sentir no activation record devido a se usar o MAC-1 em vez do i86. Estas diferenças têm a ver com:

R4. MAC-1 versus i86: diferentes dimensões das células de memória

R5. MAC-1 versus i86: diferentes dimensões de cada um dos registos

R6. MAC-1 versus i86: diferentes organizações dos registos

R7. MAC-1 versus i86: diferentes representações das variáveis

R8. MAC-1 versus i86: pelo menos 2 das hipóteses acima referidas

R9. MAC-1 versus i86: pelo menos 3 das hipóteses acima referidas

Page 17: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.

R1. Int (1 célula), char (1), real (2), apont (2)

Vou partir do princípio que sabe que a dimensão da célula é de 1 byte. Então acha que os inteiros são representados no PC por apenas 1 byte? 8 bits para representar o conjunto infinito de números inteiros positivos e negativos? Qual seria o maior e o menor inteiro que poderia representar, usando a notação de complemento para 2?

E para representar os valores reais? Que formato iria usar? Um à sua escolha? Para que servem as normas internacionais? Não acha que é importante a portabilidade das aplicações, e que no caso da representação de números reais, não acha que todos os fabricantes de computadores deveriam adoptar pelo menos a norma do IEEE? E de acordo com esta norma, qual o menor nº de bits que são necessários para representar um valor em vírgula flutuante?

Pense bem, e se preciso reveja o capítulo 3. Data Representation [Goor].

Tente de novo...

Page 18: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.

R2. Int (2 células), char (2), real (4), apont (2)

De acordo com esta opção:

- os inteiros ocupam 16 bits, o que apenas faz sentido em computadores que não disponham de registos maiores que 16 bits; - os caracteres ocupam 2 bytes! Pouco prático, e a justificação de que facilita os push e os pop não faz sentido: o modo de endereçamento normalmente usado para aceder a variáveis locais não é manipulando o SP, mas sim por registo de base (deslocamento em relação ao BP); assim este campo só deveria ocupar 1 célula; - os reais, vírgula flutuante, com 32 bits, para suportar a norma IEEE para precisão simples; - os apontadores (das variáveis passadas por referência, do endereço de retorno e do frame pointer anterior) são normalmente valores manuseados por registos ou conteúdos de registos, pelo que faz sentido serem de 16 bits, tal como a dimensão dos registos do i8086/88 e do i80286.

Para completar o activation record falta ainda referir a estrutura array, a última a ser incluída; é composta por 10 inteiros, i(0) a i(9), e o início do array fica no topo da stack enquanto o último elemento do array fica "encostado" à variável do tipo char. Atenção ainda que a estrutura passada como parâmetro por referência não faz parte do activation record, mas apenas o apontador para esse record. Várias resoluções do exame continham esta incorrecção.

Resumindo: o activation record começa a ser construído na stack a partir do apontador *selo (2 células), depois será o endereço de retorno, IP (2), o antigo frame pointer, BP (2), o real x1 (4), o caracter c1 (1), e o array de inteiros i[10] (20 células). Não se considerou a salvaguarda de registos, mas que poderia ter sido incluída quer antes da invocação - isto é antes de guardar o IP - quer antes de reservar espaço para as variáveis locais.

E agora as diferenças em relação ao MAC-1.

Page 19: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.

R3. Int (4 células), char (1), real (4), apont (4)

De acordo com esta alternativa, quer os inteiros quer os apontadores são representados por 32 bits (os restantes estão correctos e não há comentários a fazer). Ou o processador dispõe de registos de 32 bits para inteiros e uma ALU que aceite operandos de 32 bits, ou esta opção vai ter consequências no desempenho do processador.

O eneunciado especificava execução no i86, sendo i86 sinónimo de i8086/88; sendo assim, este processador é indubitavelmente um processador de 16 bits e a opção dos 4 bytes está incorrecta. Se contudo interpretou i86 como sendo um dos processadores dessa família, incluindo o i386 e seus sucessores, então esta resolução, embora incorrecta, apresenta já alguma lógica.

Estes mesmos comentários aplicam-se à dimensão dos apontadores.

Siga o resto da resolução em R2.

Page 20: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.

R2. Int (2 células), char (2), real (4), apont (2)

R4. MAC-1 versus i86: diferentes dimensões das células de memória

Correcto: as células de memória na família ix86 são de 8 bits - tal como em todos os outros processadores comerciais actualmente disponíveis - enquanto que no MAC-1 são de 16 bits.

Mas... existem outras diferenças!

Se ainda não as descobriu, tente de novo...

Se já as descobriu, passe à pergunta seguinte.

Page 21: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.

R2. Int (2 células), char (2), real (4), apont (2)

R5. MAC-1 versus i86: diferentes dimensões de cada um dos registos

Incorrecto! Quer um quer outro dispõem de registos de 16 bits.

Estude melhor a secção 4.3 An example macroarchitecture [Tanen] e tente de novo.

Page 22: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.

R2. Int (2 células), char (2), real (4), apont (2)

R6. MAC-1 versus i86: diferentes organizações dos registos

Correcto! Mas, quais são as implicações?

Foi para ajudar neste ponto que se forneceu com o enunciado a figura dos apontamentos com o instruction set do MAC-1. Por aí é fácil de ver que os únicos registos disponíveis ao nível da programação em linguagem máquina são o Ac e o SP. Mais, pela descrição dos modos de funcionamento de cada operação é possível identificar que um dos modos de endereçamento é por registo de base - bem útil para aceder aos parâmetros e variáveis locais no activation record - mas que o registo de base usado é o SP. Assim sendo não faz sentido reservar espaço no activation record para o antigo valor de frame pointer, que no caso do i86 é o BP; este campo desaparece.

Mas... existem outras diferenças!

Se ainda não as descobriu, tente de novo...

Se já as descobriu, passe à pergunta seguinte.

Page 23: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.

R2. Int (2 células), char (2), real (4), apont (2)

R7. MAC-1 versus i86: diferentes representações das variáveis

Variáveis escalares presentes:

- int: com a mesma dimensão de ALU, não há diferenças; - char: com células de memória de 16 bits, o mínimo que se pode reservar para char é 1 célula, tal como no i86; embora as células tenham dimensões diferentes, pode-se afirmar que não há diferença na dimensão do campo char, quando medido em termos de células; mas se se apresentar a medida de cada campo em termos de bytes, então são diferentes; - real: nehum dos processadores suporta operações em vírgula flutuante por hardware, devendo-se concluir que ambos suportam por software a norma IEEE de precisão simples; conclusão: não há diferenças.

Resumindo: esta alternativa estará correcta, se as dimensões apresentadas estiverem em bytes; estará incorrecta se as dimensões apresentadas estiverem em células de memória.

Mas... existem outras diferenças!

Se ainda não as descobriu, tente de novo...

Se já as descobriu, passe à pergunta seguinte.

Page 24: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.

R2. Int (2 células), char (2), real (4), apont (2)

R8. MAC-1 versus i86: pelo menos 2 das hipóteses acima referidas

Se está a trabalhar com dimensões dos campos em termos de nº de células, então esta opção está correcta; agora procure as 2 hipóteses acima referidas, tentando de novo...

Page 25: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

* 1. c) Construa o activation record desta função, associada à sua execução no i86, e indicando a dimensão de cada um dos campos. Se em vez do i86 o programa fosse executado no MAC-1, indique, justificando, as diferenças no activation record.

R2. Int (2 células), char (2), real (4), apont (2)

R9. MAC-1 versus i86: pelo menos 3 das hipóteses acima referidas

Se está a trabalhar com dimensões dos campos em termos de nº de células, então esta opção está incorrecta; mas se estiver a pensar na dimensão dos campos do activation record em termos de nº de bytes, então pode-se considerar correcta, e deve procurar as 3 hipóteses acima referidas, tentando de novo...

Page 26: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. d) Mostre o conteúdo da stack que contém o campo do activation record reservado para a variável local x1, sabendo que lá se encontra armazenado o valor '40.625'.

Nota: V = (-1)^(S) * (1.F) * 2 ^(E-127) no formato simples IEEE

Resolução

Mais uma pergunta clássica em vários exames desta disciplina. Mesmo assim continuam a aparecer algumas respostas tão disparatadas, que sugiro fortemente a quem assim responde que mude de curso e deixe trabalhar quem gosta e está interessado em informática.

Eis alguns exemplos, que por serem tão disparatados nem os ponho como alternativa de resposta, para não insultar a inteligência de quem lê este exame de auto-avaliação:

- como o i86 é little endian começa-se por inverter a ordem do número, isto é, de 40625 passa-se para 52640 e faz-se a sua codificação em hexadecimal (dando 5x4 bits) e colocando a zero os restantes 12 bits à esquerda para perfazer os 32 bits dum nº real...

- decompõe-se o valor em parte inteira e parte decimal; codifica-se em BCD a parte inteira e em binário a parte fraccionária; total: 12 bits; destes, o bit mais à esquerda é o do sinal, os 8 seguintes o expoente e os restantes 3 a mantissa...

- decompõe-se o valor em parte inteira e parte decimal; codifica-se para binário cada uma dessas partes, isto é, o valor 40 e o valor 625 (este dá um valor complicado com 10 bits); e depois juntam-se estes 2 números binários com o ponto decimal no meio...

Por ser tão simples nem se vão apresentar alternativas de resolução. Sugiro muito fortemente que tente fazer o exercício seguindo as sugestões, e que não se limite pura e simplesmente a seguir passivamente a sua resolução!

Eis a linha de raciocínio que deverá ser seguida:

- converter 40 para binário (usando por exemplo a técnica das sucessivas divisões; ou lembrando-se das potências de 2 e que 40= 32+8); isto dá...

- converter 0.625 para binário (usando por exemplo a técnica das sucessivas multiplicações; ou lembrando-se das potências negativas de 2 e que 0.625 vem dado por 0.5+0.125, ou ainda por 1/2+1/8)); isto dá...

- depois de ter 40.625 em binário, ajustar o ponto decimal de modo a se aproximar do formato da fórmula que a norma IEEE sugere para o cálculo de valores reais de precisão simples; isso dá...(confirmem o vosso resultado com 1.01000101x2^5)

- calcular agora os diversos campos do formato IEEE: sinal S positivo (0), expoente E tal que E-127=5, e a mantissa M ou parte fraccionária F os bits acima representados à direita do ponto decimal, encostados à esquerda a preenchidos a zero à direita até ao fim da palavra

- os 32 bits resultantes da operação anterior deverão conduzir ao resultado (confirme por favor) em hexadecimal, de 42 22 80 00

- como o i86 é little endian, o valor de x1 na stack, desde o início da variável (no endereço de menor valor), deverá ser de 00 80 22 42 (4 células)

Page 27: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

A pergunta seguinte...

Page 28: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. e) O código em assembly language resultante da tradução da instrução(selo-> s_reg_i) = i[3] ;

contém normalmente pelo menos 3 instruções, que servem para: colocar num registo o endereço da variável passada como parâmetro, colocar noutro registo o elemento do array, e copiar para a zona de memória, cujo início é apontado pelo 1º registo, o conteúdo do 2º registo. Embora no M68020 esta instrução do C possa ser implementada com apenas uma instrução em assembly language, apresente uma solução com 2 instruções. Indique claramente o significado dos símbolos que usar, mas não necessita de indicar os seus valores. O formato da instrução no M68020 é "MOVE.size <origem>,<destino>", e a sintaxe dos modos de endereçamento está na figura anexa.

Resolução

Este exercício pede uma leitura atenta e cuidada do enunciado, pois estão lá as várias sugestões para uma fácil resolução!

Vão ser apresentadas várias alternativas de início de resolução, umas retiradas integralmente de respostas ao exame, outras montagens de várias respostas; seleccione a que considerar mais correcta (como habitualmente, não se garante que exista uma resposta completamente certa):

R1. MOVE.L i[3], DnMOVE.L Dn, selo -> s_reg_i

R2. MOVE.W (i, A0, 3*2), D1MOVE.W D1, (selo, A0, s_reg_i)

R3. MOVE.W (M[SP+04], 0, 0), D0MOVE.W D0, (M[SP+0E], 0, 0)

R4. MOVE.L (selo, A0), A1MOVE.L (i+3*4, A0), (A1)

R5. MOVE.W (28, A7), D1MOVE.W D1, ([A7, 53] + 0 + 0)

Page 29: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. e) O código em assembly language resultante da tradução da instrução(selo-> s_reg_i) = i[3] ;

contém normalmente pelo menos 3 instruções, que servem para: colocar num registo o endereço da variável passada como parâmetro, colocar noutro registo o elemento do array, e copiar para a zona de memória, cujo início é apontado pelo 1º registo, o conteúdo do 2º registo. Embora no M68020 esta instrução do C possa ser implementada com apenas uma instrução em assembly language, apresente uma solução com 2 instruções. Indique claramente o significado dos símbolos que usar, mas não necessita de indicar os seus valores. O formato da instrução no M68020 é "MOVE.size <origem>,<destino>", e a sintaxe dos modos de endereçamento está na figura anexa.

R1. MOVE.L i[3], DnMOVE.L Dn, selo -> s_reg_i

De acordo com esta proposta, i[3] pode representar um modo de endereçamento que inclua a especificação para se chegar a esse elemento do array, ou é um símbolo que substitui um valor numérico. Pedia-se no enunciado que fosse indicado claramente o significado dos símbolos. Se a explicação era a primeira, esta resolução estava bastante incompleta e carecia de bastante mais detalhe; sendo um valor numérico, só poderá representar ou o valor da variável - que não é o caso - ou o endereço (numérico, absoluto) onde se encontra essa variável - o que também não se sabe.

Outro símbolo não explicado é o Dn. Deveria ter sido sugerido logo um dos 8 registos do tipo D.

Quanto ao símbolo selo -> s_reg_i os comentários a fazer são de índole idêntica ao que se fez para i[3].

Conclusão: este resultado tem bastantes incorrecções e/ou está bastante incompleto! No entanto está correcta a designação do tipo de operando a manipular: 4 bytes, do tipo L.

Estude melhor o capítulo 5. Addressing [Goor] e tente de novo...

Page 30: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. e) O código em assembly language resultante da tradução da instrução(selo-> s_reg_i) = i[3] ;

contém normalmente pelo menos 3 instruções, que servem para: colocar num registo o endereço da variável passada como parâmetro, colocar noutro registo o elemento do array, e copiar para a zona de memória, cujo início é apontado pelo 1º registo, o conteúdo do 2º registo. Embora no M68020 esta instrução do C possa ser implementada com apenas uma instrução em assembly language, apresente uma solução com 2 instruções. Indique claramente o significado dos símbolos que usar, mas não necessita de indicar os seus valores. O formato da instrução no M68020 é "MOVE.size <origem>,<destino>", e a sintaxe dos modos de endereçamento está na figura anexa.

R2. MOVE.W (i, A0, 3*2), D1MOVE.W D1, (selo, A0, s_reg_i)

Embora faltem aqui as explicações para os símbolos, é fácil extrair essa informação, no pressuposto que A0 contém o apontador para o activation record: i é o deslocamento relativo a A0 até ao início do array (o valor deve ser negativo), selo é o deslocamento relativo a A0 até ao campo que contém o apontador para a estrutura, e s_reg_i é o deslocamento desde o início da estrutura record até ao 1º campo dessa estrutura que contém um valor inteiro.

Esta resposta tem erros sintáticos (consulte a tabela fornecida com os modos de endereçamento do M68020 e estude a coluna Syntax): se foi escolhido o 1º modo 6, então o erro é mais grave, por ter substituido uma referência complexa - Xn - por apenas um valor numérico; se foi escolhido o modo 5, então deveria ter junto as componentes numéricas fixas, indicando o seu relacionamento.

Contudo, se a instrução HLL fosse implementada por estes modos de endereçamento no M68020, o resultado é que ... o valor de i[3] iria ser escrito no campo do parâmetro explícito do activation record, e não era isso que se pretendia! E ainda... os valores inteiros são representados apenas por 16 bits no M68020, ocupando apenas 1/2 registo e usando apenas metade da ALU??

Estude melhor o enunciado - estão lá sugestões - e se necessário leia outra vez o capítulo 5. Addressing [Goor], e tente fazer este exercício de novo. Depois escolha nova alternativa...

Page 31: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. e) O código em assembly language resultante da tradução da instrução(selo-> s_reg_i) = i[3] ;

contém normalmente pelo menos 3 instruções, que servem para: colocar num registo o endereço da variável passada como parâmetro, colocar noutro registo o elemento do array, e copiar para a zona de memória, cujo início é apontado pelo 1º registo, o conteúdo do 2º registo. Embora no M68020 esta instrução do C possa ser implementada com apenas uma instrução em assembly language, apresente uma solução com 2 instruções. Indique claramente o significado dos símbolos que usar, mas não necessita de indicar os seus valores. O formato da instrução no M68020 é "MOVE.size <origem>,<destino>", e a sintaxe dos modos de endereçamento está na figura anexa.

R3. MOVE.W (M[SP+04], 0, 0), D0MOVE.W D0, (M[SP+0E], 0, 0)

Esta resolução contém vários erros:

- de sintaxe: consulte a tabela fornecida com os modos de endereçamento do M68020 e estude a coluna Syntax; - de representação de variáveis: os valores inteiros são representados apenas por 16 bits no M68020, ocupando apenas 1/2 registo e usando apenas metade da ALU?? - de notação: o M68020 tem algum registo chamado SP? O registo que é usado implicitamente com essa função é o A7; contudo a maioria dos assemblers do M68k aceitam o símbolo SP e atribuem-no automaticamente ao A7; - de conceito de activation record e sua implementação no M68020 (estude a secção 8.4 Function support by the MC68020): os frame pointers servem essencialmente para funcionarem de registo de base no acesso aos parâmetros e às variáveis locais, e não o SP (no MSP era o SP porque não havia outro registo que funcionasse como frame pointer; - de uso dos modos de endereçamento (estude o capítulo 5. Addressing [Goor]): de acordo com estas instruções não iria ser capaz de escrever no campo int da estrutura selo...

Estude melhor a matéria e tente de novo...

Page 32: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. e) O código em assembly language resultante da tradução da instrução(selo-> s_reg_i) = i[3] ;

contém normalmente pelo menos 3 instruções, que servem para: colocar num registo o endereço da variável passada como parâmetro, colocar noutro registo o elemento do array, e copiar para a zona de memória, cujo início é apontado pelo 1º registo, o conteúdo do 2º registo. Embora no M68020 esta instrução do C possa ser implementada com apenas uma instrução em assembly language, apresente uma solução com 2 instruções. Indique claramente o significado dos símbolos que usar, mas não necessita de indicar os seus valores. O formato da instrução no M68020 é "MOVE.size <origem>,<destino>", e a sintaxe dos modos de endereçamento está na figura anexa.

R4. MOVE.L (selo, A0), A1MOVE.L (i+3*4, A0), (A1)

Esta resolução parece equilibrada. Porquê?

O enunciado começa por sugerir 3 instruções, para depois dizer que é possível fazer com apenas 1, mas que apenas se pretende uma solução com 2. Objectivo disto: lembrar que o M68020 é poderoso neste domínio, mas que é conveniente retirar algumas complexidades ao problema. Como? Sugerindo uma abordagem semelhante à que seria tomada com o i86, evitando usar os modos complexos (no modo 6) que contêm endereçamentos indirectos à memória e requerem registo de indexação com factor de escala; poucos compiladores usam estes modos de endereçamento complexos.

Ao apresentar as 3 instruções que poderiam ser usadas e ao pedir que se usassem apenas 2, estava-se a sugerir que, das 3 instruções apresentadas, se juntassem as 2 primeiras, as 2 últimas, ou a 1ª e a última. Juntar as 2 primeiras não faz sentido, bem como juntar a 1ª e a última. Repare que a 1ª instrução (das 3) vai buscar o endereço da estrutura selo (que é o mesmo que o do seu 1º campo) e coloca-o num registo; fica-se assim com o apontador para o operando destino da instrução em HLL logo num registo! Isto vai permitir que a 2ª instrução do M68020 se limite a ir buscar o valor de i[3] - modo de endereçamento por registo de base, o modo 5 - e o armazene na posição de memória pretendida, apontada pelo registo que foi carregado na 1ª instrução - modo de endereçamento por registo indirecto! E fica o problema resolvido.

Alguns detalhes: a variável inteira é efectivamente representada por 32 bits no M68020; os símbolos selo e i representam respectivamente os deslocamentos relativos a A0 do apontador da estrutura selo no activation record e do início do array i.

A pergunta seguinte...

Page 33: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. e) O código em assembly language resultante da tradução da instrução(selo-> s_reg_i) = i[3] ;

contém normalmente pelo menos 3 instruções, que servem para: colocar num registo o endereço da variável passada como parâmetro, colocar noutro registo o elemento do array, e copiar para a zona de memória, cujo início é apontado pelo 1º registo, o conteúdo do 2º registo. Embora no M68020 esta instrução do C possa ser implementada com apenas uma instrução em assembly language, apresente uma solução com 2 instruções. Indique claramente o significado dos símbolos que usar, mas não necessita de indicar os seus valores. O formato da instrução no M68020 é "MOVE.size <origem>,<destino>", e a sintaxe dos modos de endereçamento está na figura anexa.

R5. MOVE.W (28, A7), D1MOVE.W D1, ([A7, 53] + 0 + 0)

Esta resolução contém alguns erros:

- de sintaxe: consulte a tabela fornecida com os modos de endereçamento do M68020 e estude a coluna Syntax; - de representação de variáveis: os valores inteiros são representados apenas por 16 bits no M68020, ocupando apenas 1/2 registo e usando apenas metade da ALU??- de conceito de activation record e sua implementação no M68020 (estude a secção 8.4 Function support by the MC68020): os frame pointers servem essencialmente para funcionarem de registo de base no acesso aos parâmetros e às variáveis locais, e não o SP/A7 (no MSP era o SP porque não havia outro registo que funcionasse como frame pointer; - de uso dos modos de endereçamento no M68020 (estude a secção 5.2 Addressing modes [Goor]): veja melhor como se especifica o registo de indexação Xn.

De qualquer modo existem maneiras mais simples de implementar aquela instrução HLL em instruções do M68020...

Estude melhor a matéria e tente de novo...

Page 34: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. f) A 2ª instrução no i86 poderia ser "LEA BX, i[3]". De acordo com o formato de instrução apresentado na figura anexa, represente esta instrução em binário.

Sugestão: Se não fez a alínea c), construa a parte relevante do activation record, i.e., com as variáveis locais.

Resolução

Um dos erros mais comuns que se encontra ao corrigir um exame é devido à não leitura atenta do enunciado do problema. Com este exercício ocorreu o mesmo, nomeadamente nos seguintes casos:

- o processador indicado é o i86 e não o i386! O campo SIB no formato de instrução só aparece em instruções específicas do i386 ou seus sucessores;

- a apresentação do símbolo i[3] neste exercício, em sequência do exercício anterior, era intencional: sabe-se o valor do índice do array, pelo que não é necessário tê-lo em registo.

A 1ª parte do problema consistia assim em identificar qual o modo de endereçamento do i86 mais adequado para implementar este exercício; a partir daí era quase imediato a construção da instrução em binário. Qual o modo que lhe parece mais adequado (de respostas do exame):

R1. M[BP + DISP16]

R2. M[BP + DISP8]

R3. M[BP + DI + DISP8]

Page 35: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. f) A 2ª instrução no i86 poderia ser "LEA BX, i[3]". De acordo com o formato de instrução apresentado na figura anexa, represente esta instrução em binário.

R1. M[BP + DISP16]

De acordo com esta proposta e com o resultado da alínea c), a instrução associada deveria ser:

LEA BX, [BP].(-19)

Em princípio parece correcta - isto é o resultado esperado coincide com o obtido - mas faz sentido ter um deslocamento de 16 bits para armazenar um valor que o compilador sabe ser inferior a 128?

Pense melhor e tente de novo...

Page 36: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. f) A 2ª instrução no i86 poderia ser "LEA BX, i[3]". De acordo com o formato de instrução apresentado na figura anexa, represente esta instrução em binário.

R2. M[BP + DISP8]

De acordo com esta proposta e com o resultado da alínea c), a instrução associada deveria ser:

LEA BX, [BP].(-19)

Está correcta a resposta. E como representá-la em binário?

R21. Usando apenas 2 bytes

R22. Usando apenas 3 bytes

R23. Usando mais de 3 bytes

Page 37: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. f) A 2ª instrução no i86 poderia ser "LEA BX, i[3]". De acordo com o formato de instrução apresentado na figura anexa, represente esta instrução em binário.

R2. M[BP + DISP8]

R21. Usando apenas 2 bytes

Um para o campo OPCODE e outro para o campo MODE. E onde colocaria o valor de DISP8?

Pense melhor e tente de novo...

Page 38: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. f) A 2ª instrução no i86 poderia ser "LEA BX, i[3]". De acordo com o formato de instrução apresentado na figura anexa, represente esta instrução em binário.

R2. M[BP + DISP8]

R22. Usando apenas 3 bytes

E chega!

LEA BX, [BP].(-19)

O 1º byte para o campo OPCODE: 6 bits com o código da instrução (não fornecido), o bit seguinte para indicar que o operando source é o que está em memória (valor não fornecido), e o último byte para indicar ue o operando é uma word (valor não fornecido).

O 2º byte para o campo MODE, que contém informação dos 2 operandos: um em registo (BX), campo de 3 bits REG (o valor em binário pode ser obtido da última coluna da tabela fornecida com os modos de endereçamento do 8086 e 80286); o outro na memória, dado pela expressão indicada na opção R2: daqui obtém-se os valores de MOD e R/M, a partir dessa mesma tabela.

O 3º byte contém o valor do deslocamento, -19, em complemento para 2.

A pergunta seguinte...

Page 39: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. f) A 2ª instrução no i86 poderia ser "LEA BX, i[3]". De acordo com o formato de instrução apresentado na figura anexa, represente esta instrução em binário.

R2. M[BP + DISP8]

R23. Usando mais de 3 bytes

O 1º byte seria para o campo PREFIX.

O 2º byte seria para o campo OPCODE.

O 3º byte seria para o campo MODE.

O 4º byte seria para o campo DISPLACEMENT.

O 5º byte seria para o campo IMMEDIATE.

E podia-se continuar por aqui se mais houvesse... Não acha que há aqui campos a mais?

Pense melhor e tente de novo...

Page 40: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

*1. f) A 2ª instrução no i86 poderia ser "LEA BX, i[3]". De acordo com o formato de instrução apresentado na figura anexa, represente esta instrução em binário.

R3. M[BP + DI + DISP8]

Esta proposta baseia-se no princípio de que o valor do índice do array se encontra no registo DI. Se assim fosse, esta seria a alternativa mais correcta. Contudo, já se referiu atrás que não há necessidade de tal neste problema, e, assim sendo, por que razão complicar mais o problema?

Tente de novo...

Page 41: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. g) Pretende-se acrescentar ao instruction set do MAC-1 uma nova instrução equivalente ao LEA do i86 (ver alínea f)), com o seguinte comportamento: "ac= sp + x". Considerando que a busca e descodificação da instrução já está no microcódigo, construa em MAL a parte do microcódigo que executa esta nova instrução na microarquitectura do MIC-2.

Resolução

Para além dos habituais disparates sempre presentes em exames, houve na resposta a este exercício um padrão composto por 3 alternativas distintas de resolução do problema. Seleccione aquela com que melhor se identifica:

R1. a := band (ir, amask) ;ac := sp + a ; goto 0 ;

R2. Modificar R1 de modo a incluir uma leitura da memória (apontada por sp+x) para ac

R3.ir := band (ir, amask) ;ir := ir + sp ;ac := ir ;goto 0 ;

Page 42: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. g) Pretende-se acrescentar ao instruction set do MAC-1 uma nova instrução equivalente ao LEA do i86 (ver alínea f)), com o seguinte comportamento: "ac= sp + x". Considerando que a busca e descodificação da instrução já está no microcódigo, construa em MAL a parte do microcódigo que executa esta nova instrução na microarquitectura do MIC-2.

R1. a := band (ir, amask) ;ac := sp + a ; goto 0 ;

O enunciado pedia claramente o microprograma para a microarquitectura do MIC-2 !

Acha que MIC-2 suporta este microprograma? Já que optou por esta resolução, sugiro que, como penitência, identifique todas as modificações que deveria introduzir para corrigir este microprograma (deverá encontrar pelo menos 3).

E depois tente de novo...

Page 43: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. g) Pretende-se acrescentar ao instruction set do MAC-1 uma nova instrução equivalente ao LEA do i86 (ver alínea f)), com o seguinte comportamento: "ac= sp + x". Considerando que a busca e descodificação da instrução já está no microcódigo, construa em MAL a parte do microcódigo que executa esta nova instrução na microarquitectura do MIC-2.

R2. Modificar R1 de modo a incluir uma leitura da memória (apontada por sp+x) para ac

Para quê?

O comportamento especificado no enunciado faz alguma referência em aceder a memória?

Pense melhor e tente de novo...

Page 44: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. g) Pretende-se acrescentar ao instruction set do MAC-1 uma nova instrução equivalente ao LEA do i86 (ver alínea f)), com o seguinte comportamento: "ac= sp + x". Considerando que a busca e descodificação da instrução já está no microcódigo, construa em MAL a parte do microcódigo que executa esta nova instrução na microarquitectura do MIC-2.

R3.ir := band (ir, amask) ;ir := ir + sp ;ac := ir ;goto 0 ;

Esta alternativa parece adequada para o MIC-2 - pelo menos não entra em conflito com a sua microarquitectura.

Contudo não é recomendada: vai alterar o valo de ir, embora sem consequências; esta resolução poderia ser modificada se a microinstrução ac:=ir fosse a primeira (e as restantes adaptadas de acordo).

Esta proposta encontra-se ainda incompleta. Que lhe falta?

A indicação de que cada microinstrução irá ocupar uma célula da memória do microprograma, através da numeração das linhas (que não deverá começar com o nº 0, uma vez que aí se encontra a parte do microprograma que faz o fetch da instrução...).

A pergunta seguinte...

Page 45: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. h) O registo MAR do CPU do MAC-1 é o único que pode escrever no Address Bus, não havendo necessidade que as saídas dos seus FF's sejam colocados em tri-state. Represente esquematicamente 1 bit deste registo (i.e., apenas um dos FF's), indicando explicitamente a proveniência e destino de cada sinal ligado ao FF.

Resolução

Pretende-se com este exercício que se identifique a origem/destino de cada um dos sinais que ligam a um dos 16 FF (tipo D) que constituem o MAR. Os sinais que estão em causa são: a entrada D, o sinal de clock, CLK, e a saída Q.

De acordo com a figura fornecida - uma microarquitectura associada ao MAC-1 - é possível identificar os sinais que se ligam aos FF's. Várias foram as respostas que apareceram no exame; seleccione a que lhe parecer mais adequada:

R1. Liga-se a D o sinal vindo do latch B, ao CLK o sinal de clock, e Q ao barramento de endereços

R2. Liga-se a D o sinal vindo do latch B, ao CLK o sinal de clock, e Q e o sinal MAR proveniente da microinstrução ao barramento de endereços (usando um buffer tri-state)

R3. Liga-se a D o sinal vindo do latch B, ao CLK o sinal de clock e o sinal MAR proveniente da microinstrução (usando uma gate AND), e Q ao barramento de endereços

R4. Liga-se a D o sinal vindo do latch B e o sinal MAR proveniente da microinstrução (usando uma gate AND), ao CLK o sinal de clock, e Q ao barramento de endereços

Page 46: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. h) O registo MAR do CPU do MAC-1 é o único que pode escrever no Address Bus, não havendo necessidade que as saídas dos seus FF's sejam colocados em tri-state. Represente esquematicamente 1 bit deste registo (i.e., apenas um dos FF's), indicando explicitamente a proveniência e destino de cada sinal ligado ao FF.

R1. Liga-se a D o sinal vindo do latch B, ao CLK o sinal de clock, e Q ao barramento de endereços

Tem lógica, mas... donde vem o sinal de clock?

Vamos supor que sabe que é o sinal correspondente ao 3º sub-ciclo de clock; então isto quer dizer que em todos os ciclos de clock o valor que se encontra no latch B é colocado no barramento de endereços... Acha que está correcto?

Pense melhor e tente de novo...

Page 47: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. h) O registo MAR do CPU do MAC-1 é o único que pode escrever no Address Bus, não havendo necessidade que as saídas dos seus FF's sejam colocados em tri-state. Represente esquematicamente 1 bit deste registo (i.e., apenas um dos FF's), indicando explicitamente a proveniência e destino de cada sinal ligado ao FF.

R2. Liga-se a D o sinal vindo do latch B, ao CLK o sinal de clock, e Q e o sinal MAR proveniente da microinstrução ao barramento de endereços (usando um buffer tri-state)

Usando um buffer tri-state? Para quê? O enunciado não diz: não havendo necessidade que as saídas dos seus FF's sejam colocados em tri-state?

Leia sempre bem o enunciado e não faça disparates destes!

Tente de novo...

Page 48: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. h) O registo MAR do CPU do MAC-1 é o único que pode escrever no Address Bus, não havendo necessidade que as saídas dos seus FF's sejam colocados em tri-state. Represente esquematicamente 1 bit deste registo (i.e., apenas um dos FF's), indicando explicitamente a proveniência e destino de cada sinal ligado ao FF.

R3. Liga-se a D o sinal vindo do latch B, ao CLK o sinal de clock e o sinal MAR proveniente da microinstrução (usando uma gate AND), e Q ao barramento de endereços

De acordo com esta proposta, apenas durante o ciclo máquina em que o sinal MAR proveniente da microinstrução está activo (e sabe em que circunstâncias é que tal sucede? Pense e depois confirme no fim se acertou!), é que um novo valor vai ser escrito no FF (proveniente do latch B). Isto é, apenas quando se verifica a condição MAR=Verdadeiro e clock na transição de 0 para 1. Após essa operação de escrita (que vai ocorrer no 3º sub-ciclo do clock) é que o novo valor vai ficar disponível no barramento de endereços. Precisamente o que se pretendia!

Já se lembrou quando é que o sinal de MAR está activo? Sempre que a microinstrução contiver a indicação (aqui descrita em MAL) de mar:=reg.

A pergunta seguinte...

Page 49: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. h) O registo MAR do CPU do MAC-1 é o único que pode escrever no Address Bus, não havendo necessidade que as saídas dos seus FF's sejam colocados em tri-state. Represente esquematicamente 1 bit deste registo (i.e., apenas um dos FF's), indicando explicitamente a proveniência e destino de cada sinal ligado ao FF.

R4. Liga-se a D o sinal vindo do latch B e o sinal MAR proveniente da microinstrução (usando uma gate AND), ao CLK o sinal de clock, e Q ao barramento de endereços

De acordo com esta opção, apenas quando o sinal de MAR está activo (no valor 1) é que o valor que está no latch B é escrito no FF. E quando MAR não está activo (no valor 0)? O que é que acontece? Pense um pouco antes de continuar a ler...

Quando MAR está a 0, o valor da saída da gate AND é ... 0. Isto é, sempre que o sinal do 3º sub-ciclo de clock sofre uma transição de 0 para 1, o valor que é escrito no FF é... 0! Por outras palavras, em cada ciclo máquina em que o sinal de MAR proveniente da microinstrução não é activado, o registo MAR coloca no barramento de endereços o valor 0 em todas as linhas. Acha que está correcto?

Pense melhor e tente de novo...

Page 50: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. i) Este programa vai ser escrito numa impressora ligada ao computador através duma porta paralela, de acordo com o esquema de ligação da figura anexa. Identifique e caracterize sumariamente todos os sinais que ligam o CPU ao controlador de portas paralelas.

Resolução

Pretendia-se com esta pergunta avaliar a capacidade de leitura e interpretação de dados técnicos relativos ao funcionamento dum dado interface dum computador (que eram as figuras fornecidas, que tinham já sido previamente analisadas nas aulas...). A maioria das respostas andou por lá perto, mas há uma vergonhosa que não resisto a mostrar, só para que veja como o tempo dum docente é desperdiçado a avaliar um aluno (por acaso uma aluna...) que se enganou no curso:

“Para que haja transferência de dados do computador a um periférico (neste caso a impressora) tem que haver um controlador entre a transferência. O caracter é enviado do computador; mas como são 8 bits, há a UART que tem por finalidade separar em um bit de cada vez para o controlador, este por sua vez envia bit a bit para o periférico que contém outra UART para reconstruir os 8 bits e assim sai o caracter respectivo na impressora.”

Regessando ao trabalho sério; começemos por identificar os sinais: seleccione a alternativa mais adequada de entre as respostas dos seus colegas:

R1. Os sinais são: /RD, /WR, D7-D0, A0-A1, /CS

R2. Os sinais são: /STB, /INIT, /ERROR, PE, SLCT, BUSY, /ACKNLG, DATA1..DATA7

R3. Os sinais são os indicados em R1 mais um sinal

Page 51: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. i) Este programa vai ser escrito numa impressora ligada ao computador através duma porta paralela, de acordo com o esquema de ligação da figura anexa. Identifique e caracterize sumariamente todos os sinais que ligam o CPU ao controlador de portas paralelas.

R1. Os sinais são: /RD, /WR, D7-D0, A0-A1, /CS

A resposta mais lógica e mais fácil de acertar! Correcto... mas incompleto!

Falta efectivamente um sinal. Qual será?

Veja melhor as figuras que foram fornecidas, pense um pouco como deverá funcionar este controlador de porta paralela, e quando souber a resposta confirme-a em R3.

Page 52: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. i) Este programa vai ser escrito numa impressora ligada ao computador através duma porta paralela, de acordo com o esquema de ligação da figura anexa. Identifique e caracterize sumariamente todos os sinais que ligam o CPU ao controlador de portas paralelas.

R2. Os sinais são: /STB, /INIT, /ERROR, PE, SLCT, BUSY, /ACKNLG, DATA1..DATA7

O diagrama fornecido que tinha como título Ex.: construção do interface Centronics mostrava claramente as ligações entre o i8255A (controlador de portas paralelas) e o connector de 25 pinos para ligar à impressora, com indicação dos nomes dos sinais que estão nesse conector para ligar à impressora.

E É ESSA LISTA DE SINAIS QUE ME RESPONDE COMO SENDO OS SINAIS QUE LIGAM O CPU AO CONTROLADOR DE PORTAS??

A habitual desculpa do nervosismo não pega! Isto é falta de concentração e falta de cuidado a ler as perguntas!

Concentre-se e tente de novo...

Page 53: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. i) Este programa vai ser escrito numa impressora ligada ao computador através duma porta paralela, de acordo com o esquema de ligação da figura anexa. Identifique e caracterize sumariamente todos os sinais que ligam o CPU ao controlador de portas paralelas.

R3. Os sinais são os indicados em R1 mais um sinal

Correcto. Mas sabe qual é esse sinal extra?...

Basta olhar para uma das figuras fornecidas; existe lá um sinal com uma legenda: xxxx TO 8086 OR 8259A... E sabe também caracterizar esse sinal...

Vamos agora caracterizar os outros:

- /RD, /WR: servem para permitir que o controlador distinga uma operação de leitura duma de escrita num dos seus registos, pelo CPU;

- D7-D0: esta ligação ao barramento de dados é usado para transferir informação entre o CPU e o controlador (pode também ser usado para transferências directas para a memória, por exemplo);

- A0-A1: estas 2 linhas de endereço permitem seleccionar uma de 4 opções possíveis de registos dentro do controlador; por vezes estas linhas são usadas em conjunto com as de /RD e /WR para permitirem seleccionar um maior nº de registos; de notar que não têm que estar ligadas às linhas A0 e A1 do barramento de endereços (e porquê?);

- /CS: este sinal não está ligado directamente ao CPU, mas sim a um descodificador de endereços, que por sua vez recebe como input as linhas de endereço do barramento respectivo; não era indispensável responder com este sinal à pergunta do exame.

A pergunta seguinte...

Page 54: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. j) Pretende-se configurar o controlador de portas paralelas para o esquema de ligação da figura anexa. Mostre em binário o valor que deveria ser escrito no registo de configuração. Justifique todas as opções que tomar.

Resolução

A principal questão que se punha para a resolução deste problema tinha a ver com a identificação do modo de funcionamento das portas A (input) e B (output); a partir daqui deduzia-se a programação da porta C.

Veja a figura do interface Centronics que foi fornecida, e escolha a opção mais adequada:

R1. Porta A no modo 0 e porta B no modo 0

R2. Porta A no modo 0 e porta B no modo 1

R3. Porta A no modo 1 e porta B no modo 0

R4. Porta A no modo 1 e porta B no modo 1

Page 55: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. j) Pretende-se configurar o controlador de portas paralelas para o esquema de ligação da figura anexa. Mostre em binário o valor que deveria ser escrito no registo de configuração. Justifique todas as opções que tomar.

R1. Porta A no modo 0 e porta B no modo 0

O controlador de portas paralelas i8255A permite implementar algumas funções de handshaking características de interfaces desta natureza, simplificando o trabalho do CPU e evitando a inserção de circuitos de hardware extra.

Neste caso em particular o i8255A vai ser usado para enviar informação do computador para o exterior; os sinais de handshaking que daria jeito serem implementados no i8255A e que satifizessem os requisitos de timings da impressora são os relacionados com a indicação de que o i8255A tem o buffer de saída cheio e pronto para ser enviado para a impressora, que a impressora já recebeu o caracter e avisar o CPU para enviar o próximo caracter. Por outras palavras, se o i8255A pudesse satisfazer estes requesitos, então uma das portas funcionaria com handshake, isto é, usaria o modo 1.

Ora, isso é possível... Donde esta opção não é a correcta...

Tente de novo...

Page 56: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. j) Pretende-se configurar o controlador de portas paralelas para o esquema de ligação da figura anexa. Mostre em binário o valor que deveria ser escrito no registo de configuração. Justifique todas as opções que tomar.

R2. Porta A no modo 0 e porta B no modo 1

O controlador de portas paralelas i8255A permite implementar algumas funções de handshaking características de interfaces desta natureza, simplificando o trabalho do CPU e evitando a inserção de circuitos de hardware extra.

Neste caso em particular o i8255A vai ser usado para enviar informação do computador para o exterior; os sinais de handshaking que daria jeito serem implementados no i8255A e que satifizessem os requisitos de timings da impressora são os relacionados com a indicação de que o i8255A tem o buffer de saída cheio e pronto para ser enviado para a impressora, que a impressora já recebeu o caracter e avisar o CPU para enviar o próximo caracter. Por outras palavras, se o i8255A pudesse satisfazer estes requesitos, então uma das portas funcionaria com handshake, isto é, usaria o modo 1.

Mas qual das portas? Logicamente a relacionada com a prinicipal função do i8255A neste interface: a porta que leva os caracteres para a impressora, que é a porta B. Isto é, esta opção está correcta! Apenas um detalhe: os requisitos de timing da impressora são incompatíveis com as especificações do i8255A num dos sinais de handshake: na indicação que o buffer está cheio, e que corresponde em linhas gerais ao sinal de /STB esperado pela impressora. Este sinal vai ter que ser gerado por software, usando um bit duma das outras portas para o efeito.

E então o resto? Existem mais sinais que são necessários para o interface entre o computador e a impressora: mais 4 sinais de input e 2 sinais de output (incluindo o referido no parágrafo anterior). Isto significa que tanto se pode usar a porta A como a parte superior da porta C para qualquer um daqueles conjuntos de sinais. A opção presente na figura mostra que se optou por usar a porta A como input (mas sem qualquer função de handshake, logo em modo 0) e a parte superior de C como output.

Está então resolvido o problema; falta completar a justificação dos valores a atribuir a cada bit (pedido com realce no enunciado):

- D7=1 : para seleccionar este registo de controlo em vez do outro (que apenas serve para escrever o valor 0 ou 1 em cada uma das portas de 1 bit do bloco C); - D6-D5= 00 : porta A em modo 0; - D4=1 : porta A input - D3=0 : parte superior de C como output; - D2=1 : porta B em modo 1; - D1=0 : porta B output; - D0=x : parte inferior de C associada ao handshake da porta B.

E está concluída a parte teórica do exame. Foi difícil?Se não foi, então porque razão ainda anda por aqui?!!!

Vamos ver a parte prática agora... ou se já a fez, vamos sair daqui...

Page 57: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. j) Pretende-se configurar o controlador de portas paralelas para o esquema de ligação da figura anexa. Mostre em binário o valor que deveria ser escrito no registo de configuração. Justifique todas as opções que tomar.

R3. Porta A no modo 1 e porta B no modo 0

O controlador de portas paralelas i8255A permite implementar algumas funções de handshaking características de interfaces desta natureza, simplificando o trabalho do CPU e evitando a inserção de circuitos de hardware extra.

Neste caso em particular o i8255A vai ser usado para enviar informação do computador para o exterior; os sinais de handshaking que daria jeito serem implementados no i8255A e que satifizessem os requisitos de timings da impressora são os relacionados com a indicação de que o i8255A tem o buffer de saída cheio e pronto para ser enviado para a impressora, que a impressora já recebeu o caracter e avisar o CPU para enviar o próximo caracter. Por outras palavras, se o i8255A pudesse satisfazer estes requesitos, então uma das portas funcionaria com handshake, isto é, usaria o modo 1.

Ora, isso é possível... Mas não parece que a porta que necessita de handshake seja a A...

Tente de novo...

Page 58: Auto-avaliação Experimental em SLACgec.di.uminho.pt/discip/Lesi/slac9495/autoav-jul.doc  · Web view(selo-> s_reg_i) = i[3] ; contŽm normalmente pelo menos 3 instru ›es, que

Universidade do Minho

1. j) Pretende-se configurar o controlador de portas paralelas para o esquema de ligação da figura anexa. Mostre em binário o valor que deveria ser escrito no registo de configuração. Justifique todas as opções que tomar.

R4. Porta A no modo 1 e porta B no modo 1

O controlador de portas paralelas i8255A permite implementar algumas funções de handshaking características de interfaces desta natureza, simplificando o trabalho do CPU e evitando a inserção de circuitos de hardware extra.

Neste caso em particular o i8255A vai ser usado para enviar informação do computador para o exterior; os sinais de handshaking que daria jeito serem implementados no i8255A e que satifizessem os requisitos de timings da impressora são os relacionados com a indicação de que o i8255A tem o buffer de saída cheio e pronto para ser enviado para a impressora, que a impressora já recebeu o caracter e avisar o CPU para enviar o próximo caracter. Por outras palavras, se o i8255A pudesse satisfazer estes requesitos, então uma das portas funcionaria com handshake, isto é, usaria o modo 1.

Uma das portas sim... Mas não parece que a porta A também necessite de handshake...

Tente de novo...