Neanderwin
NEANDERWIN O NeanderWln é um simulador da máquina Neander, definida no livro do Raul F. Weber (UFRGS), Fundamentos de Arquitetura de Computadores, Ed. Sagra Luzzatto. A máquina original foi estendida aqui para incluir algumas instruções para carga de dados imediatos no acumulador e operações de entrada e saída de dados para dois dispositivos mapeados em nosso simulador: um teclado e um visor. Algumas características do processador Neander são: Largura de dados e endereços de 8 bits Dados representados em complemento a dois instruções de 8 bits ( 2 bits: negativo (N) e
O NEANDER só poss OFIO p AC) 1 apontador de igo de condição com mento: o modo direto (muitas vezes também chamado de absoluto). No modo de endereçamento direto (Figura 4. 1), a palavra que segue o código da instrução contém, nas instruções de manipulação de dados, o endereço de memória do operando. Nas instruções de desvio, esse endereço corresponde à posição de memória onde está a próxima instrução a ser executada. O NEANDERWIN foi estendido para ter mais dois modos de endereçamento: imediato e indireto. Maiores detalhes serão mostrados mais adiante. ) Listagem eral das instruções As Instruções podem ter um ou dois bytes. Nas instruções com apenas um byte, os 4 bits mais significativos contém o código da operação. Nas instruções com dois by Sv. ‘ipe to View next page bytes, que no Neander são aquelas que fazem referência a um operando na memória, o segundo byte contém o endereço de memória deste operando. 7 Código 4 3 Não utilizados endereço direto O Nota: Os 4 bits de mais baixa ordem do primeiro byte são reservados para futuras expansões. Existem também dois códigos que nao têm instruções associadas. NOP’ código O O omando NOP é usado apenas para gastar tempo. ‘STA ender código 1 0 comando STA guarda o acumulador na posição de memória indicada pelo operando ender. ‘LDA ender’ código 2 0 comando LDA atribui ao acumulador o conteúdo da posição de memória indicada pelo operando ender. ‘ADD ender código 3 0 comando ADD soma ao acumulador o conteúdo de uma posição de memória indicada pelo operando ender. ‘OR ender’ código 4 0 comando OR realiza um “ou” lógico entre o acumulador e o conteúdo de uma posição de memória indicada pelo operando ender. ‘AND ender código 5 0 comando
AND realiza um “e” lógico entre o acumulador e o conteúdo de uma posição de memória indicada pelo operando ender. ‘NOT’ código 6 0 comando NOT inverte os bits do acumulador. ‘JMP ender código 8 0 comando JMP (jump) desvia a execução do programa para o endereço indicado pelo operando ender. ‘JN ender’ código 9 0 comando JN (jump if negative) desvia a execução do programa para o endereço indicado pelo operando ender, apenas quando a última operação realizada produziu um valor com o bit 7 ligado (negativo). ‘JZ ender’ código 10 0 comando JZ (jump if zero) desvia a ex 20F 10 valor com o bit 7 ligado (negativo).
JZ ender’ código 10 0 comando JZ (jump zero) desvia a execução do programa para o endereço indicado pelo operando ender, apenas quando a última operação realizada produziu um valor zero. ‘JNZ ender’ código 1 1 O comando JNZ (jump not zero) desvia a execução do programa para o endereço indicado pelo operando ender, apenas quando a última operação realizada produziu um valor diferente de zero. ‘IN ender’ código 12 0 comando IN (input) traz para o acumulador o valor lido num dispositivo externo indicado pelo operando ender.
No Neandennin os dispositivos são: chaves (endereço O) e o tatus de “dado disponível” das chaves (endereço 1). ‘OUT ender’ código 13 0 comando OUT (output) descarrega o conteúdo do acumulador em um dispositivo externo Indicado pelo operando ender. No Neanderwin o unico dispositivo disponível é um visor (endereço 0). ‘CDI imed’ código 14 2 O comando CDI (load immediate) carrega no acumulador o valor dado pelo operando imed. ‘HLT’ código 15 0 comando HLT (halt) para a máquina. Modos de Endereçamento: – mediato O segundo byte da instrução é o operando. A única instrução que usa este modo de endereçamento é a L Dl. direto O segundo byte da nstrução é o endereço de memória do operando. – indireto O segundo byte da instrução contém o endereço de memória onde está o endereço do operando (ou seja, o segundo byte da instrução é o endereço do ponteiro para o operando). Para indicar que um operando é indireto, deve-se precedê-l 30F 10 endereço do ponteiro para o operando). Para indicar que um operando é indireto, deve-se precedê-lo pela letra (arroba) 2) Comentários no programa Os comentários são começados por ponto e vírgula, e podem também ocorrer no final das linhas de instruções. ) Rótulos Um rótulo é um nome dado à próxima osição de memória. O nome é seguido por dois pontos. 4) Pseudo Instruções: ORG ender A pseudo-instrução ORG (origin) indica ao montador que a próxima instrução será colocado na posição ender de memória. var EQU med A pseudo-instrução EQU (equate) atribui um nome (rótulo) a um determinado valor. Esse comando é frequentemente usado para especificar variáveis que são posicionadas em um endereço específico de memória. Por exemplo para posicionar a variável x no endereço 100 use: X EQU 100 END ender A pseudo-instrução END indica que o programa fonte acabou.
O operando ender é usado para pré- arregar o PC com o endereço inicial de execução do programa. DS med A pseudo-instrução DS (define storage) resen,’a um número de palavras na memória definido pelo valor imed. 3 DB imed A pseudo-instruçao DB (define bytes) carrega esta palavra com o valor dado pelo operando imed. 5) Exemplos de representação de numeros Decimal: 30 Binário: 00110000b Hexadecimal: 30h Obs: Números hexadecimais maiores que 7Fh devem ser precedidos por um zero, p. ex.
OF3h Tabela de Instruções Código binário 0000 0001 0010 0011 0100 0101 0110 1000 1001 I Instruçao NOP STA ender LDA 10101011 11001101 1110 111 ender 10 011 0100 0101 0110 1000 1001 1010 1011 1100 1101 1110 AND ender NOT JMP ender JN ender JZ ender Instrução NOP STA ender LDA ender ADD ender OR ender AND ender NOT JMP enderJN ender JZ ender JNZ ender IN ender OUT ender CDI imed HLT Descrição nenhuma operação armazena acumulador (store) carrega acumulador (load) Soma operação lógica “ou” operação lógica “e” inverte (complementa) acumulador desvio incondicional (jump) desvio condicional (jump on negative) desvio condicional (jump on zero) desvio condicional (jump on not zero) operação de entrada no dispositivo “ender” operação de saída no dispositivo ender” carrega o valor imediato imed no acumulador término da execução (halt) Comentário nenhuma operação MEM(ender) C] AC AC MEM(ender) AC AC + MEM(enden AC AC or MEM(ender) AC O AC and MEM(ender) AC NOT AC PC ender if N = I then PC ender 1 then PC ender 4 JNZ ender IN ender OUT ender CDI imed HALT if Z = O then PC Cl ender AC Cl IN (ender) OUT(ender) n AC AC imed halt Códigos de condição: N – (negativo): sinal do resultado 1 resultado é negativo O — resultado não é negativo Z – (zero): indica resultado igual a zero 1 – resultado é igual a zero 0 – resultado iferente de zero As instruções lógicas e aritméticas (ADD, NOT, AND, OR) e a Instrução de transferência LDA afetam os códigos de condição N e Z. As demais instruções (STA JMP, JN, JZ, JNZ, IN, OUT, LDI, NOP e HLT) não alteram os códigos d 0 demais instruçoes (STA, JMP, JN, JZ, JNZ, IN, OUT, CDI, NOP e HLT) não alteram os códigos de condição. Ciclo de busca da instrução: RI MEM(PC) PC Cl PC + 1 Seqüência de operações para execução da instruçao: Instruçao: NOP Ciclo Busca Execuçao STA Busca Execuçao operaçoes RI MEM(PC) PC PC + 1 nenhuma RI U
MEM(PC) PC n PC+ 1 ender n MEM(PC) PC n + 1 MEM(ender) AC RI MEM(PC) PC PC+ 1 ender MEM(PC) PC +1 ACO MEM(ender) LDA Busca Execução 5 ADD OR AND RI MEM(PC) PC PC+ 1 ender MEM(PC) PC PC+I ACE] AC + MEM(enden RI MEM(PC) PC PC+ 1 ender MEM(PC) PC O + 1 AC n AC or MEM(ender) RI n MEM(PC) PC n + 1 ender n MEM(PC) PC PC + 1 AC AC and MEM(ender) RI MEM(PC) PC 1 ender MEM(PC) PC PC+IACC] notAC RI 6 0 MEM(PC) PC PC+ 1 ender MEM(PC) PC + 1 RI O MEM(PC) PC+I endern MEM(PC) PC n PC IRI n MEM(PC) PC n + 1 ender MEM(PC) PC ender RI MEM(PC) PC PC + 1 ender MEM(PC) IN (ender) RI MEM(PC) PC O PC + I ender MEM(PC) OUT (enden RI MEM(PC) PC PC + 1 ender MEM(PC) AC ender RI MEM(PC) PC n PC + 1 parar o processamento 7 Seqüências considerando operações de leitura e escrita na memória Instrução: NOP Ciclo Busca Operações REM C] PC Read; PC+I RI RDM Nenhuma REM PC Read; PC+ 1 RI RDM REM PC Read; PC O PC+ 1 REM RDM RDM AC wnte REM n PC Read; PC n PC+ 1 RI n RDM REM n PC Read; PC Cl PC+ 1 REM RDM read ACO RDM; atualiza N e Z REM PC Read; PC n RI RDM REM PC Read; PC 1 REM RDM read AC pC+1 AC + RDM; atualiza N e z Execução STA Busca Execução Busca 8 9 JN caso N = 0 JZ caso z = 1 Execução Busca
Execução JZ caso Z – – 0 Busca JNZ caso 1 JNZ caso O Execução IN Busca OUT 80F 10 alocação de memória de tal forma que o programa ocupe a metade inferior da memória e os dados a metade superior, como segue: Área de programa Área de dados início do programa posição O (OH) primeira parcela posição 128 (80H) segunda parcela posição 129 (81H) terceira parcela posição 130 (82H) resultado posição 131 (83H) O programa sena: Simbólico X EQU Y EQU W EQU Z EQU ORG LDA ADD ADD STA HLT OXYW Z 128 129 130 131 comentários Endereço da variável X definido como 128 ; Endereço da variável Y efinido como 129 ; Endereço da variável W definido como 130 ; Endereço da variável Z definido como 131 ; acumulador A recebe conteúdo de X ; conteúdo de A é somado ao conteúdo de Y ; conteúdo de A é somado ao conteúdo de W ; conteúdo de A é copiado para Z ; processador pára Esse programa pode ser editado em linguagem de montagem, depurado e executado usando o simulador/depurador NEANDERWIN, cujos comandos foram apresentados anteriormente. Conclusão NEANDER é um computador muito simples, desenvolvido apenas para fins didáticos. Processadores modernos são muito mais omplexos que NEANDER- Entretanto, mesmo processadores utilizados nas mais sofisticadas estações de trabalho são baseados nos conceitos elementares que você aprendeu com NEANDER.
O NEANDERWIN estende o conjunto de instruções do NEANDER e oferece uma interface de programação amigável, com a entrada do código em representação simbólica, com diversas facilidades para o programador, que tornam muito mais fácil o uso d simbólica, com diversas facilidades para o programador, que tornam muito mais fácil o uso do processador NEANDER como ferramenta de ensino. Estão disponíveis versões tanto para sistema operacional Windows e Linux. O código fonte está disponvel mediante solicitação. 1 Exercícios de programação usando o NEANDERWIN Os exercícios apresentados aqui são apenas uma amostra do que pode ser programado com NEANDERWIN. Na definição de novos problemas, o único cuidado que deve ser tomado é com a memória disponível para programa e dados, que compreende apenas 256 posições. Exceto onde explicitado, todos os números e endereços são representados na base decimal. 1 . Limpar o acumulador: faça 4 programas diferentes que zerem o acumulador. 2.
Somar duas variáveis de 8 bits: faça um programa ara somar duas variáveis representadas em complemento a dois e verifique se ocorreu “overfloW’. Indique a ocorrência de “overflow” da seguinte maneira: conteúdo = O quando não ocorreu overflow conteúdo = 1 quando ocorreu overflow 3. Subtrair duas variáveis: faça um programa para subtrair duas variáveis de 8 bits representadas em complemento de dois. O resultado deve aparecer na posição de memoria consecutiva às ocupadas pelas variáveis de entrada. 4. Comparação: determine qual a maior valor de um vetor com 10 elementos de 8 bits cada. Coloque os valores iniciais do vetor com uso das diretivas do montador. 0 DF 10