Você está na página 1de 21

Guia de Utilização do Simulador YASS

O uso de simuladores em matérias relacionadas a arquitetura e organização de computadores


permite que os estudantes possam acompanhar o funcionamento de computadores em seu
interior, o que seria difícil de outra forma.

Os objetivos básicos de um simulador para este fim é endereçar os seguintes aspectos dos
componentes de baixo nível da arquitetura de um computador:

 Conjunto de instruções
 Registradores
 Modos de endereçamento de instruções e dados
 Interrupções e exceções

Ele também deve endereçar as interações entre estes elementos.

Detalhes do Simulador

O simulador que utilizamos é o YASS, desenvolvido pelo Professor Besim Mustafa na


Universidade de Edge Hill. Ele pode ser obtido no seguinte site: http://www.teach-sim.com/.

A janela principal do Simulador YASS contém as informações sobre os componentes da CPU


virtual

Os componentes da CPU simulada estão divididos em quatro áreas:

 Instruções
 Registradores genéricos
 Registradores especiais
 Pilha

O simulador é baseado em uma arquitetura RISC com um pipeline de cinco estágios.

Página 1 de 21
Figura 1 Janela principal do simulador

Janela de instruções

A janela de instruções contém as instruções dos programas carregados na memória. As


instruções são exibidas em formato de baixo nível (nível de linguagem de montagem), ao invés
de formato binário, para maior clareza.

Cada instrução possui três endereços: PAdd (endereço


físico), LAdd (endereço lógico)e endereço base. Todas
as instruções de um mesmo programa têm o mesmo
endereço base. O endereço físico é o endereço que é
efetivamente ocupado pela instrução na memória
principal e o endereço lógico é o endereço ocupado
em relação à base. O endereço lógico é usado para
desvios condicionais.

Figura 2 Instruções

Página 2 de 21
Registradores Especiais

Figura 3 Registradores especiais

A área de registradores especiais exibe os registradores com funções específicas:

Registrador Função
PC Program Counter. Contém o endereço da próxima instrução a ser executada.
IR Instruction Register. Contém a instrução em execução
SR Status Register. Contém informações relacionadas ao resultado da última
instrução executada.
SP Stack Pointer. Indica o endereço do topo da pilha.
BR Base Register. Contém o endereço base atual.
MAR Memory Address Register. Contém o endereço de memória sendo acessado.
MDR Memory Data Register. Contém os dados que estão sendo transferidos entre
a CPU e a memória.

Além dos registradores, existem três flags, que podem assumir apenas os valores 0 e 1:

Status Bit Função


OV Overflow. Usado ára indicar
Z Zero
N Negative. Usado para indicar que o valor é negativo.

Página 3 de 21
Registradores genéricos

Esta área exibe os registradores genéricos, que


são referenciados pelas diversas instruções em
sua execução e utilizados para armazenar os
valores necessários.

Os registradores podem ter os tamanhos de 8, 16,


32 e 64 bits. O tamanho dos registradores
determina a quantidade de registradores
genéricos disponíveis, indo de 8 para 8 bits (de
R00 a R07) até 64 para 64 bits (R00 a R63).

A coluna Value exibe o valor atual de cada


registrador. É possível alterar os valores durante a
execução, bem como estabelecer watchpoints.

Figura 4 Registradores Genéricos

Página 4 de 21
Pilha

A pilha armazena valores temporários durante a


execução, em um formato LIFO (last in – first out). Os
valores podem ser inseridos na fila através da
instrução PSH (push) e retirados dela através da
instrução POP.

Figura 5 Pilha

Página 5 de 21
Criando programas

Para utilizar o simulador, é necessário submeter um programa para execução. Existem duas
formas de fazer isso: criando um programa a partir do conjunto de instruções ou em uma
criando o programa em linguagem de alto e posteriormente compilando-o.

Criando um programa a partir do conjunto de instruções

Para criar um programa, é necessário selecionar um nome e um endereço de memória base


para ele.

Figura 6 Identificação do programa

O endereço base de memória é o endereço físico inicial que será ocupado pelo programa. Ele
será usado como referência para as instruções que irão compor o programa. Uma determinada
posição de memória só pode ser ocupada por um programa, portanto se estiver trabalhando
com vários programas, deve se tomar cuidado para não ocorrer nenhuma sobreposição.

Uma vez selecionado o nome e endereço base, clique em ADD para criar seu programa.

Figura 7 Criando um novo programa

O programa recém-criado será adicionado à lista de programas:

Página 6 de 21
Figura 8 Lista de Programas

A lista de programas apresenta os controles necessários para eliminar ou duplicar um


programa, além de informar todos os programas carregados na memória e seus endereços
base.

Agora o programa está criado, mas ainda não tem nenhuma instrução.

Para editar o programa, devemos selecionar a aba Edit Program e clicar o botão Add New para
adicionar uma nova instrução.

Figura 9 Adicionando instruções ao programa

Ao clicar nos botões de adição de instruções, será exibida a janela com todas as instruções
suportadas pelo simulador, organizadas em categorias.

Página 7 de 21
Figura 10 Janela de instruções

A relação de instruções e suas funções estão no final deste documento, na seção Conjunto de
Instruções.

Dependendo da natureza da instrução ela pode não necessitar de nenhum operador, ou pode
precisar de um ou dois. Os operadores podem ser valores numéricos literais, endereços de
memória ou registradores.

Página 8 de 21
Figura 11 Parâmetros para a instrução MOV

Após identificar os parâmetros para a instrução, basta clicar em NEW para adicionar a
instrução e seus parâmetros serão acrescentados à lista de instruções do programa.

Página 9 de 21
Figura 12 Instrução adicionada à relação para execução

O processo deve ser repetido para todas as instruções que comporão o programa. Ao final do
processo, as instruções estarão relacionadas na ordem que serão executadas.

Página 10 de 21
Figura 13 Programa teste completo

Para executar o programa em memória, basta utilizar os controles de execução.

Figura 14 Controle de execução do programa

O botão STEP irá executar uma instrução apenas, o botão RUN irá executar o programa inteiro.
O controle deslizando seleciona a velocidade com que as instruções serão executadas e o
botão RESET PROGRAM faz o programa retornar para sua condição inicial.

Página 11 de 21
Criando um programa a partir da linguagem de alto nível

O simulador YASS contém um compilador para uma linguagem de alto nível que reproduz
recursos de linguagens com C e BASIC. Para acessar o compilador, basta clicar no botão
COMPILER na tela principal.

Figura 15 Acesso ao compilador

No tela do compilador temos a janela Program Input, onde o programa em código fonte pode
ser editado livremente.

Figura 16 Entrada de programa

Os programas podem ser salvos e carregados em arquivos formato txt, sem formatação.

Os comandos aceitos pela linguagem constam desse guia na seção Referência da linguagem,
mas também podem ser acessados pelo botão PROGRAM HELPER.

Página 12 de 21
Figura 17 Programa exemplo

Uma vez que o programa tenha sido inserido, basta clicar no botão COMPILE para traduzir o
código fonte para o conjunto de instruções correspondente.

Figura 18 Clique para compilar o programa

O andamento da compilação será exibido na janela COMPILER PROGRESS, bem como possíveis
erros de sintaxe.

Figura 19 Andamento da compilação

Página 13 de 21
Uma vez que os erros de compilação sejam eliminados, será criado o programa em linguagem
de baixo nível equivalente ao código fonte.

Figura 20 O programa exemplo compilado

Para carregar o programa compilado em memória e executá-lo, basta clicar no botão RUN.

Figura 21 Clique para executar o programa

A partir daí o processo de execução ocorre da mesma forma que com os programas que são
submetidos no formato de instruções.

Página 14 de 21
Conjunto de Instruções

Instruções de movimentação de dados

Instrução Descrição
MOV Movimenta dados para um registrador ou um registrador para outro.
Ex: MOV #2, R01 - movimenta o número 2 para o registrador R01,
MOV R01, R03 movimenta o conteúdo doo registrador R01 para o registrador
R03
LDB Carrega um byte da memória para um registrador

LDW Carrega uma palavra (dois bytes) da memória para um registrador

STB Armazena um byte de um registrador para a memória

STW Armazena uma palavra (2 bytes) de um registrador para a memória.

PSH Coloca um dado no topo da pilha.


Ex: PSH #6 coloca o valor 6 no topo da pilha
PSH R03 coloca o conteúdo do registrador R03 no topo da pilha.
POP Remove o dado do topo da pilha para um registrador.
Ex: POP R05 remove o valor armazenado no topo da pilha para o registrador
R05.
SWP Troca os valores de dois registradores.

Instruções aritméticas

Instrução Descrição
ADD Soma um valor para um registrador ou soma o conteúdo de registradores.
Ex.: ADD #3, R02 Soma o número 3 ao conteúdo do registrador R02,
armazenando o resultado em R02.
ADD R01, R02 Soma conteúdo do registrador R01 ao conteúdo do registrador
R02, armazenando o resultado em R02.
SUB Subtrai um valor de um registrador ou um registrador de outro.

MUL Multiplica um valor por um registrador ou um registrador por outro.

DIV Divide um valor por um registrador ou um registrador por outro.

INC Incrementa o valor do registrador em 1

DEC Decrementa o valor do registrador em 1

Página 15 de 21
Instruções de controle

Instrução Descrição
JMP Pula para um endereço de instrução incondicionalmente.
Ex.: JMP 100 desvia o fluxo de execução para a instrução localizada no
endereço 100.
JLT Pula para um endereço se menor que (após a última comparação)

JGT Pula para um endereço se maior que (após a última comparação)

JEQ Pula para um endereço se igual (após a última comparação)

JNE Pula para um endereço se diferente (após a última comparação)

CAL Pula para o endereço de uma sub-rotina

RET Retorna de uma sub-rotina

SWI Interrupção de software

HLT Interrompe a simulação

Comparação

Instrução Descrição
CMP Compara um valor com um registrador ou um registrador com outro.

Ex: CMP #5, R02 – Compara o valor 5 com o conteúdo do registrador R02.
CMP R01, R03 – Compara o conteúdo dos registadores R01 e R03.
Obs.:
Se R01 = R03, então a flag Z será ligada
Se R01 < R03, então nenhuma a flag será ligada
Se R01 > R03, então a flag N será ligada

Instruções de entrada e saída

Instrução Descrição
IN Recebe um dado (se disponível) de um dispositivo de entrada

OUT Envia um dado para um dispositivo de saída

Página 16 de 21
Referência da Linguagem de programação

A linguagem de programação suportada no YASS não suporta nenhum linguagem de


programação formal como Java ou C, mas uma linguagem limitada para fins didáticos apenas.

Program
Declaração de início do programa. Deve ser finalizado com um END. O par program / end
delimita o programa.

Formato

PROGRAM <nome do programa>

SUB <nome da subrotina> [([BYREF] <parâmetros>])] [FROM [STATIC] LIB "<biblioteca>"]

[ <comandos da subrotina> | <vazio> ]

END SUB

END

Library
Define uma biblioteca que poderá

Formato

LIBRARY <nome da biblioteca>

SUB <nome da subrotina> [([BYREF] <parâmetros>])] [EXPORT]

[ <comandos> | <vazio> ]

END SUB

END

If then
Comando condicional.

Formato

Página 17 de 21
IF {<condição> | TRUE | FALSE} THEN

END IF

If then else
Comando condicinal com “senão”.

Formato

IF {<condição> | TRUE | FALSE} THEN

ELSE

END IF

While
Comando de loop. Executa um conjunto de comandos enquanto uma condição for verdadeira.

Formato

WHILE {<condição> | TRUE | FALSE}

WEND

For
Comando de loop. Executa um conjunto de comandos enquanto uma condição for verdadeira.

Formato

FOR <expressão inicial> TO <expressão final> [STEP <incremento>]

NEXT

Select
Executa comandos selecionados a partir do conteúdo de uma variável.

Formato

SELECT <variável índice>

Página 18 de 21
CASE <valor de seleção>

[CASE < valor de seleção >]

CASE ELSE

END SELECT

Do
Executa um conjunto de comandos enquanto uma condição for verdadeira.

Formato

DO

LOOP [WHILE {<put condition here> | TRUE | FALSE}]

Break
Interrompe um loop.

Formato

BREAK

Continue
Retorna para o início de um loop.

Formato

CONTINUE

Sub
Declaração de um subrotina

Formato

[INLINE] SUB <nome da subrotina> [([[BYREF] <parâmetros>]) {[AS THREAD [PRIORITY


<prioridade>]] [SYNCHRONISE [BUSYWAIT]]} | INTR <número da interrupção> | EXCEPTION ]

[ <comandos da subrotina> ]

END SUB

Página 19 de 21
Fun
Declaração de função

Formato

FUN <nome da função> ([[BYREF] <parâmetros>]) [SYNCHRONISE [BUSYWAIT]]

[ <comandos da função> ]

END FUN [= {<expressão de retorno> | TRUE | FALSE}]

Call
Chama uma função ou subrotina.

Formato

CALL <nome da função ou subrotina > [(<parâmetros>)]

Read
Lê um valor da entrada padrão.

Formato

READ [NOWAIT] (<nome da variável>)

Write
Escreve uma o resultado de uma expressão para a saída padrão.

Formato

{WRITE (<expressão>,...)| WRITELN [(<expressão>,...)]}

Var
Declara uma variável.

Formato

VAR <nome da variável> {INTEGER | BOOLEAN | BYTE | STRING(<tamanho do string>) |


ARRAY(tamanho do array) {INTEGER | BOOLEAN | BYTE}

Página 20 de 21
Atribuição
Para atribuir valores, usa-se o símbolo =.

Formato

<variável>=<expressão>

Expressões Lógicas
E e OU booleanos podem ser expressos de duas formas.

Formato

<expressão> { AND | OR } <expressão>

<expressão> { & | | } <expressão>

Comentários
Use o símbolo % para delimitar os comentários do programa

Formato

% [<Comentário>] [ % ]

Página 21 de 21

Você também pode gostar