Vous êtes sur la page 1sur 3

EXERCCIO Uso de um Knob and Switch Simulator para:

Para mais detalhes sobre o K&S Simulator, veja The Knob & Switch Computer: An Incremental Machine Simulator for BreadthBased CS Courses - http://users.dickinson.edu/~braught/kands/kands.html .

Criar uma sequencia de Fibonacci usando um loop FINITO isto , gerando um nmero definido de termos da sequencia. Contexto da execuo desenvolvida: o usurio deve inicialmente colocar na posio de memria 20 o nmero de termos a gerar e ento comandar a execuo do programa. A cada ciclo do programa (a cada vez que a instruo 0 executada) um novo elemento da sequencia de Fibonacci colocado no Registrador 2. Por favor, note que na soluo apresentada o algoritmo no est validando se os parmetros usados como entrada excedem as limitaes da arquitetura do simulador, o que poder resultar em erros como, por exemplo, overflow ou sobreposio de memria.
O simulador para uso neste exerccio est disponvel em http://www.ulbra.inf.br/moodle/file.php/36/Programas/Simulador_KeS/computer.html .

RESOLUO DO EXERCCIO: Esta soluo nasceu de um exerccio mais simples, em que uma sequencia de Fibonacci era gerada usando apenas os registradores e em um loop infinito. Use o simulador para testar esta soluo simplificada: Inicialize os Registradores: R0 = 0, R1 = 1, R2 = 0. Entre com as instrues, comeando no endereo de memria 0: Endereo Instruo 0 ADD R2 R1 R0 1 MOVE R0 R1 2 MOVE R1 R2 3 BRANCH 0 Sete a velocidade da animao a seu gosto, clique em executar, e divirta-se. Ver que a cada ciclo do programa ou seja, a cada vez que a instruo 0 executada um novo termo da sequencia de Fibonacci aparece no Registrador 2. Bem, este algoritmo simples funciona, mas tem a bvia deficincia mesmo para um exerccio de Introduo Arquitetura de Computadores, de no ter fim, ser um loop infinito. Entregue a si mesmo, fatalmente terminar por um erro de overflow. Vamos incluir um controle do nmero de termos de Fibonacci a ser gerados. Este nmero dever ser setado pelo usurio, usando a posio de memria 20. Note que nosso programa s utiliza at a posio 11, mas deixamos uma margem de segurana para que pudesse crescer... Para executar o exerccio nesta verso melhorada: Inicialize os Registradores: R0 = 0; R1 = 1; R2 = 0; R3 = 0 (R0, R1 e R2 so usados para gerar Fibonacci e R3 serve como contador de termos gerados). Inicialize as variveis (posies de memria) utilizadas: 20 = nmero de termos a gerar 21 = 1 (constante usada para incrementar um contador) 22 no precisa ser inicializada, mas ser usada pelo programa para armazenar temporariamente R0.

Tela mostrando as posies de memria inicializadas; neste caso, sero gerados os 5 primeiros termos da sequencia de Fibonacci (5 na posio 20). O 1 na posio 21 obrigatrio, ele que incrementa o contador.

Entre com as instrues, comeando no endereo de memria 0: Endereo Instruo Comentrios 0 ADD R2 R1 R0 ALGORITIMO... 1 MOVE R0 R1 ... QUE GERA... 2 MOVE R1 R2 ... A FIBONACCI! 3 STORE 22 R0 SALVA R0 - VOU US-LO PARA INCREMENTAR O CONTADOR E DEPOIS PARA TEST-LO 4 LOAD R0 20 CARREGA O NMERO DE TERMOS A GERAR NO R0 5 SUB R0 R3 R0 SUBTRAI CONTADOR DO NUMERO DE TERMOS A GERAR 6 BZERO 11 TERMINA SE CONTADOR = NUMERO DE TERMOS 7 LOAD R0 21 CARREGA A CONSTANTE 1 NO R0 8 ADD R3 R0 R3 ADICIONA 1 AO CONTADOR EM R3 9 LOAD R0 22 RESTAURA O VALOR DE R0 PARA RETOMAR A GERAO DE FIBONACCI 10 BRANCH 0 RETORNA AO INICIO 11 HALT

Observao: Se no existir uma instruo HALT, a mquina tentar prosseguir a execuo pelos endereos de memria seguintes, por gravidade, mesmo que se trate de dados e no de instrues!

Tela do Simulador, mostrando o estado inicial:

DVIDAS E CONSIDERAES ADICIONAIS Pensamos em fazer uma verso que armazenasse a srie de Fibonacci na memria, mas esbarramos em algumas limitaes. Se so nossas (autor) ou da ferramenta, no conseguimos determinar e pedimos portanto o auxilio do Professor Dr. Mauricio Escobar! a) No h como adicionar uma constante a um registrador? Uma instruo tipo ADD Rx constante? b) No h como enderear (usar o contedo de um registrador, por exemplo) a memria "destino" numa instruo STORE? Uma instruo tipo STORE Rx Ry, onde Rx designa um registrador cujo contedo define o endereo de memria que receber o contedo de Ry? Sem isto nosso Assembler fica MUITO limitado... S podemos usar literais para endereos de memria? c) Como eu fao para manter o BUS C do simulador conectado memria principal? E como eu defino o endereo que ser usado nesta memria principal? Quero dizer, como no consegui escrever um STORE conforme descrevi no item anterior, tentei encontrar algum meio de manter a conexo do BUS C com a memria principal aberta, causando o armazenamento em memria do resultado da instruo efetuada. Mas aparentemente o estado desta conexo depende da instruo sendo executada; um ADD faz com que ela se feche, um LOAD ou STORE fazem com que se abra... Certo, professor? Mesmo o usando o simulador de ALU e Main Memory, onde eu posso controlar este bus, o nico modo que encontrei de designar o endereo de memria utilizado como destino foi marcando-o como Read/Write... Como eu poderia fazer isto usando Assembler, professor? (o simulador est em http://www.ulbra.inf.br/moodle/file.php/36/Programas/Simulador_KeS/dpandmem.html )