Minerva

Neander-X

Apresentação


     Apresentamos aqui um simulador didático para o processador NEANDER-X, um processador compatível com a 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 nesse simulador 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 virtuais 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;
  • Acumulador de 8 bits (AC);
  • Apontador de instruções de 8 bits (PC);
  • Registrador de código de condição com 2 bits: negativo (N) e zero (Z).

   O NEANDER é um computador muito simples, desenvolvido apenas para fins didáticos. Processadores modernos são muito mais complexos que NEANDER. Entretanto, mesmo processadores utilizados nas mais sofisticadas estações de trabalho são baseados nos conceitos elementares que você aprender com o NEANDER.

          O NEANDER-X 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 do processador NEANDER como ferramenta de ensino. Estão disponíveis versões tanto para o sistema operacional Windows e Linux. O código fonte está disponível mediante solicitação.

        O NEANDER só possui um modo de endereçamento: o modo direto (muitas vezes também chamado de absoluto). No modo de endereçamento direto, 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 NEANDER-X foi estendido para ter mais dois modos de endereçamento: imediato e indireto. Maiores detalhes podem ser vistos  na seção 3.

  1. Diagrama em Blocos

       A seguir apresentamos o diagrama em blocos do processador NEANDER:


Diagrama em Blocos do Neander

 

  1. Listagem geral 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 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                                       4

  3                                    0

Código

Não utilizados

endereço direto

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 não têm instruções associadas.

Código binário

Instrução

Descrição

0000

NOP

nenhuma operação

0001

STA ender

armazena acumulador (store)

0010

LDA ender

carrega acumulador (load)

0011

ADD ender

Soma

0100

OR ender

operação lógica “ou”

0101

AND ender

operação lógica “e”

0110

NOT

inverte (complementa) acumulador

1000

JMP ender

desvio incondicional (jump)

1001

JN ender

desvio condicional (jump on negative)

1010

JZ ender

desvio condicional (jump on zero)

1011

JNZ ender

desvio condicional (jump on not zero)

1100

IN ender

operação  de entrada no dispositivo “ender”

1101

OUT ender

operação de saída no dispositivo “ender”

1110

LDI imed

carrega o valor imediato imed no acumulador

1111

HLT

término da execução (halt)

'NOP' código 0

        O comando NOP não realiza nenhuma operação.  É  usado  apenas para  gastar  tempo.

'STA ender' código 1

        O comando STA guarda o acumulador na posição de memória indicada pelo operando ender.

'LDA ender' código 2

        O comando LDA atribui ao acumulador o conteúdo da posição de memória indicada pelo operando ender.

'ADD ender' código 3

        O comando ADD soma ao acumulador o conteúdo de uma posição de memória indicada pelo operando ender.

'OR ender'  código 4

        O 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

        O 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

        O comando NOT inverte os bits do acumulador.

'JMP ender' código 8

        O comando JMP (jump) desvia a execução do programa para o endereço indicado pelo operando ender.

'JN ender'  código 9

        O 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

        O comando JZ (jump if 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 11

        O comando JNZ (jump if 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

        O comando IN (input) traz para o acumulador o valor lido num dispositivo externo indicado pelo operando ender.  No Neander-X os dispositivos são: chaves (endereço 0) e o  status de "dado disponível" das chaves (endereço 1).

'OUT ender' código 13

        O comando OUT (output) descarrega o conteúdo do acumulador em um dispositivo externo indicado pelo operando ender.  No Neander-X o único dispositivo disponível é um visor  (endereço 0).

'LDI imed' código 14

        O comando LDI (load immediate) carrega no acumulador o valor dado pelo operando imed.

'HLT' código 15

        O comando HLT (halt) para a máquina.

Modos de Endereçamento:

- imediato

     O segundo byte da instrução é o operando.

     A única instrução que usa este modo de endereçamento é a LDI.

- direto

     O segundo byte da instruçã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ê-lo pela letra "@" (arrôba)

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.

  1. 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 imed

        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é-carregar o PC com o endereço inicial de execução do programa.

DS imed

        A pseudo-instrução DS (define storage) reserva um número de palavras na memória definido pelo valor imed.

DB imed

        A pseudo-instrução DB (define bytes) carrega esta palavra com o valor dado pelo operando imed.                   

  1. Exemplos de programação

        Vamos considerar, como exemplo, um programa que realiza a soma de 3 posições consecutivas da memória e armazena o resultado numa quarta posição. Inicialmente, devem ser escolhidas a área de dados e a área de programa, ou seja, a localização das instruções e dados na memória. Não existem critérios para essa escolha, mas deve ser observado que área de programa não pode invadir a área de dados e vice-versa. Ou seja, para esse programa, foi escolhida uma 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 início do programa posição 0 (0H)

Área de dados 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 possível seria:

Simbólico

Comentários

X EQU 128  
Y EQU 129
W EQU 130
Z EQU 131


; Endereço da variável X     definido como 128
; Endereço da variável Y definido como 129
; Endereço da variável W definido como 130
; Endereço da variável Z definido como 131


ORG 0
LDA X
ADD Y
ADD W
STA Z
HLT


; 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.

  1. Download

Existem versões binárias tanto para o sistema operacional Windows (Neanderwin) como para Linux (Neanderlin), tanto de 32 como de 64 bits, que estão disponíveis, junto com o código fonte, no repositório Sourceforge.

  1. E-book

Este mini-livro eletronico apresenta alguns exemplos de uso em linguagem de montagem sobre o Neander-X:

O Simulador Neander-X: Para o Ensino de Arquitetura de Computadores

  1. Autores

  Os autores são pesquisadores e professores da UFRJ e podem ser contactados pelo endereço a seguir.


 José Antônio Borges  (antonio2 at nce dot ufrj dot br)


 Gabriel P. Silva ( gabriel at dcc dot ufrj dot br)


Última Atualização: 8.Fev.2009