Manual P3

p3simManual_PT

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 41

DownloadManual P3
Open PDF In BrowserView PDF
Manual do Simulador do Processador P3

Guilherme Arroz
José Monteiro
Arlindo Oliveira

Instituto Superior Técnico
Lisboa, Portugal
Fevereiro 2005

Conteúdo
1 Introdução

3

2 Arquitectura do Processador P3
2.1 Registos . . . . . . . . . .
2.2 Bits de Estado . . . . . . .
2.3 Memória . . . . . . . . . .
2.4 Entradas/Saídas . . . . . .
2.5 Interrupções . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

3
3
4
4
4
5

3 Assembler
3.1 Evocação . . . . . . . . . .
3.2 Conjunto de Instruções . .
3.3 Constantes . . . . . . . . .
3.4 Modos de Endereçamento
3.5 Etiquetas . . . . . . . . . .
3.6 Comentários . . . . . . . .
3.7 Pseudo-Instruções . . . . .
3.8 Instruções Assembly . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

6
6
6
7
8
9
9
9
11

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

18
18
18
19
21
21
21
22
22
23
23
23
25
25
26
26
27
28
29

4 Simulador
4.1 Evocação . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Ambiente . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.1 Menus . . . . . . . . . . . . . . . . . . . . . .
4.2.2 Contadores de Instrução e Ciclos de Relógio
4.2.3 Registos . . . . . . . . . . . . . . . . . . . . .
4.2.4 Conteúdo da Memória . . . . . . . . . . . . .
4.2.5 Programa Desassemblado . . . . . . . . . . .
4.2.6 Comandos de Execução e Interrupção . . . .
4.3 Depuração . . . . . . . . . . . . . . . . . . . . . . . .
4.4 Unidade de Controlo . . . . . . . . . . . . . . . . . .
4.4.1 Registos Internos à Unidade de Controlo . .
4.4.2 Botão Clock . . . . . . . . . . . . . . . . . . .
4.5 Micro-Programação . . . . . . . . . . . . . . . . . . .
4.6 Dispositivos de Entrada e Saída . . . . . . . . . . . .
4.6.1 Janela Texto . . . . . . . . . . . . . . . . . . .
4.6.2 Janela Placa . . . . . . . . . . . . . . . . . . .
4.6.3 Temporizador . . . . . . . . . . . . . . . . . .
4.6.4 Máscara de Interrupções . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

A Formatos das Instruções Assembly

31

B Conteúdo das ROMs de Controlo

35

2

1 Introdução
Este documento descreve a operação do simulador para o processador P3 . Este programa
permite simular a nível funcional o processador descrito nos Capítulos 11 e 12 do livro:
Introdução aos Sistemas Digitais e Microprocessadores
G. Arroz, J. Monteiro e A. Oliveira
IST Press, 1a Edição, 2005
O simulador P3 é constituído por dois programas, pelo simulador propriamente dito,
p3sim , e por um assembler, p3as . O programa p3as converte programas descritos na linguagem assembly daquele processador para um ficheiro objecto. Uma vez convertido para
este formato objecto, o programa pode ser carregado para o simulador p3sim . O simulador
p3sim permite não só a execução normal e passo-a-passo do programa, mas também a execução de apenas um ciclo de relógio. Este modo de funcionamento é útil para se observar a
evolução passo-a-passo do micro-código. De forma a tornar mais interessante a interacção
com o micro-processador, foram definidos um conjunto de dispositivos de entrada e saída.
Em particular, este simulador emula todas as entradas e saídas da placa DIO5 da Digilent,
Inc, utilizada nas aulas de laboratório da disciplina de Arquitectura de Computadores da
Licenciatura em Engenharia Informática e de Computadores do Instituto Superior Técnico.
Este documento está dividido em três partes. Na primeira parte introduz-se a arquitectura do processador P3 . Na segunda parte, descreve-se a utilização do assembler p3as . Na
terceira parte, é apresentado o simulador p3sim .

2 Arquitectura do Processador P3
2.1

Registos

O processador P3 contém os seguintes registos visíveis ao programador:
R0-R7 : registos de uso genérico. O registo R0 não pode ser alterado e tem sempre o valor
0.
PC : program counter, contém o endereço da próxima instrução a executar. Não pode ser
acedido directamente com instruções assembly, sendo alterado apenas com instruções de controlo da sequência de execução.
SP : stack pointer, apontador para o topo da pilha. É utilizado também de forma indirecta, podendo apenas ser manipulado directamente (para a sua inicialização)
através de uma instrução MOV SP, R[1-7] .
RE : registo de estado, registo onde estão guardados os bits de estado (flags) do processador, descritos na secção seguinte. Também não existem instruções para manipular
este registo directamente.
Todos estes registos são inicializados a 0 após um reset do processador.

3

2.2

Bits de Estado

Do ponto de vista do programador, existem 5 bits de estado, ou flags, neste processador. Os
bits de estado estão guardados nos 5 bits menos significativos do registo RE , contendo os
restantes bits deste registo o valor 0.
O significado dos bits de estado, do bit de menor para o de maior peso do registo RE , é:
O : overflow ou excesso, indica que o resultado da última operação aritmética excede a
capacidade do operando destino. Por outras palavras, o resultado não pode ser representado em complemento para 2 com o número de bits disponíveis no operando
destino, ficando este, portanto, com um valor incorrecto.
N : negative ou sinal, indica que o resultado da última operação foi negativo, o que em
complemento para 2 é equivalente a dizer que o bit mais significativo do operando
destino ficou a 1.
C : carry ou transporte, indica que a última operação gerou um bit de transporte para além
da última posição do operando destino. Também pode ser modificado por software
através das instruções STC , CLC e CMC .
Z : zero, indica que o resultado da última operação foi 0.
E : enable interrupts, habilita ou não as interrupções, conforme for 1 ou 0. Este é o único bit
de estado que só é alterado por software, através das instruções ENI e DSI .

2.3

Memória

O espaço de memória endereçável é de 64k palavras (barramento de endereços de 16 bits),
em que cada palavra é de 16 bits (largura do barramento de dados). O acesso a uma posição de memória pode ser feito com qualquer instrução, usando o modo de endereçamento
apropriado.

2.4

Entradas/Saídas

O espaço de entradas e saídas (I/O) é memory mapped. Os endereços de memória a partir de
FF00h estão reservados para o espaço de entradas/saídas. Assim, qualquer instrução pode
ter acesso a um qualquer dispositivo de entrada/saída que esteja mapeado neste espaço
superior de memória do processador.
No caso do presente simulador, os dispositivos de entrada/saída disponíveis são:
• janela de texto: dispositivo que fornece uma interface com o teclado e monitor do
computador. Tem 4 portos de interface:
– leitura, endereço FFFFh : porto que permite receber caracteres teclados na janela
de texto;
– escrita, endereço FFFEh : porto que permite escrever um dado caracter na janela
de texto;
– estado, endereço FFFDh : porto que permite testar se houve alguma tecla premida
na janela de texto;
4

– controlo, endereço FFFCh : porto que permite posicionar o cursor na janela de
texto, posição esta onde será escrito o próximo caracter.
• botões de pressão: conjunto de 15 interruptores de pressão. A activação de cada um
destes botões gera uma interrupção com o correspondente vector de interrupção.
• interruptores, endereço FFF9h : conjunto de 8 interruptores cujo estado pode ser obtido
por leitura deste endereço.
• LEDs, endereço FFF8h : cada bit da palavra escrita neste porto define quais dos 16
LEDs estão ligados.
• display de 7 segmentos, endereços FFF0 , FFF1h , FFF2h e FFF3h : cada um destes portos de escrita controla um conjunto de 7 LEDs que formam um display.
• display de cristal líquido ou LCD: display de texto com 16 colunas e duas linhas. Tem 2
portos de escrita:
– endereço FFF5h : porto que permite escrever um dado caracter no display;
– endereço FFF4h : porto que permite posicionar o cursor no display, posição esta
onde será escrito o próximo caracter.
• máscara de interrupções, endereço FFFAh : posição de um filtro que permite seleccionar individualmente quais dos 16 primeiros vectores de interrupção (de 0 a 15) estão
habilitados. Após um reset, todos os bits da máscara de interrupção estão a 0.
• temporizador: dispositivo que fornece a geração de uma interrupção ao fim de um
intervalo de tempo real, especificado pelo utilizador. Tem 2 portos de interface:
– controlo, endereço FFF7h : porto que permite arrancar (colocando o bit menos
significativo a 1) ou parar (colocando esse bit a 0) o temporizador.
– valor de contagem, endereço FFF6h : porto que permite indicar o número de intervalos de 100ms ao fim do qual o temporizador gerará uma interrupção.
O controlo destes dispositivos é explicado em maior detalhe na Secção 4.6.

2.5

Interrupções

O simulador disponibiliza 15 botões para a geração de interrupções externas (para além
destas, o simulador tem apenas mais uma fonte de interrupções, o temporizador). Qualquer
destas interrupções provoca a activação de um sinal INT , ligado a um dos pinos externos
do processador. No final da execução de cada instrução, este sinal é testado para verificar se
existe alguma interrupção pendente. Nesse caso, são efectuados dois testes:
• o bit de estado E (enable interrupts) tem que estar activo.
• o bit da máscara de interrupções correspondente a este vector de interrupção tem que
estar activo.

5

Caso estas duas condições se verifiquem, é chamada a rotina de serviço dessa interrupção,
determinada pelo vector de interrupção, lido do barramento de dados. Os endereços das
rotinas de interrupção encontram-se na Tabela de Vectores de Interrupção, uma tabela com
256 posições guardada em memória a partir do endereço FE00h . Assim, o contador de
programa PC é carregado com o valor da posição de memória M[FE00h+vector]
.
Por omissão, o vector de interrupção associado a cada um dos 15 botões de interrupção
é simplesmente o índice do botão. Porém, este pode ser alterado pelo utilizador através da
interface do simulador. Esta interface permite também desabilitar individualmente cada um
dos botões de interrupção.
O vector de interrupção associado ao temporizador é o 15, e este é fixo.
A chamada à rotina de serviço da interrupção guarda o registo RE na pilha e desabilita as
interrupções (E =0). É da responsabilidade do programador salvaguardar qualquer registo
que seja modificado nesta rotina. A rotina deve ser terminada com a instrução RTI que repõe
o valor de RE a partir da pilha.

3 Assembler
3.1

Evocação

O modo de evocação do assembler p3as é simplesmente:
$ p3as

.as

O nome do ficheiro assembly tem que ter extensão .as . Caso não haja erros de assembly, são
gerados dois ficheiros:
.exe

: ficheiro com o código binário, pronto a ser executado no simulador p3sim .

.lis

: ficheiro com o valor atribuído às referências usadas no programa assembly.

3.2

Conjunto de Instruções

As instruções assembly aceites pelo assembler p3as são as apresentadas na Tabela 11.4 do
livro. Para além destas instruções, o assembler reconhece um conjunto de comandos (chamados de pseudo-instruções, Tabela 11.16 do livro) que, embora não gerem código binário,
permitem reservar espaço para variáveis ou tornar o código mais legível. O total de instruções reconhecidas pelo p3as encontram-se na Tabela 1, agrupadas por classes.
A condição .cond nas instruções de salto condicional (BR. cond, JMP. cond e CALL. cond)
pode ser uma de:
O , NO : bit de estado excesso (overflow)
N , NN : bit de estado sinal (negative)
C , NC : bit de estado transporte (carry)
Z , NZ : bit de estado zero são atendidas (enable)
I , NI : bit que indica se existe alguma interrupção pendente
P , NP : resultado positivo (Z ∧ N)
6

Pseudo

Aritméticas

Lógicas

Deslocamento

ORIG
EQU
WORD
STR
TAB

NEG
INC
DEC
ADD
ADDC
SUB
SUBB
CMP
MUL
DIV

COM
AND
OR
XOR
TEST

SHR
SHL
SHRA
SHLA
ROR
ROL
RORC
ROLC

Controlo

BR
BR. cond
JMP
JMP. cond
CALL
CALL. cond
RET
RETN
RTI
INT

Transfer.

Genéricas

MOV
MVBH
MVBL
XCH
PUSH
POP

NOP
ENI
DSI
STC
CLC
CMC

Tabela 1: Conjunto de instruções do P3 .
Estas combinações permitem testar cada uma destas condições e realizar o salto caso a condição seja a 1 ou a 0, respectivamente.
As instruções aritméticas assumem os operandos em formato de complemento para 2.
As excepções a esta regra são a multiplicação e a divisão que assumem números sem sinal.
No caso destas duas operações, terá que ser o programador a ter o cuidado de manipular o
sinal à parte.
Neste conjunto, há instruções de 0, 1 e 2 operandos. Nas instruções de 2 operandos, um
deles tem que ser necessariamente um registo. O outro operando pode ter diversos modos
de endereçamento, como se explica em seguida. Os detalhes do funcionamento de cada
instrução (a operação realizada e os bits de estado alterados) são também apresentados mais
adiante.

3.3

Constantes

O facto do processador P3 ser um processador de 16 bits define os valores máximos possíveis
de especificar para uma constante. Assim, o intervalo válido para inteiros positivos será de
0 a 216 − 1 e para inteiros em complemento para 2 de −215 a +215 − 1.
Valores constantes podem ser especificados de três formas no código assembly:
Valor numérico em binário: para uma constante numérica ser interpretada em binário deve
ser terminada com a letra b ; são válidos valores entre -100000000000000b
e
1111111111111111b
.
Valor numérico em octal: para uma constante numérica ser interpretada em octal deve ser
terminada com a letra o ; são válidos valores entre -100000o e 177777o .
Valor numérico em decimal: qualquer valor inteiro entre -32768 e 65535 . Pode opcionalmente ser terminada com a letra d , embora tal seja assumido quando nenhuma outra
base for indicada;
Valor numérico em hexadecimal: para uma constante numérica ser interpretada em hexadecimal deve ser terminada com a letra h ; são válidos valores entre -8000h e FFFFh .
Caracter alfanumérico: um caracter entre plicas, por exemplo, ’g’ , é convertido para o seu
código ASCII.
7

Notar, no entanto, que o uso de constantes no meio do código assembly (ou de qualquer
outra linguagem de programação) é extremamente desaconselhável. Em vez disso, deve-se
usar o comando EQU para definir constantes (ver Secção 3.7). Esta prática, por um lado, torna
o código mais legível, pois o símbolo associado à constante, se convenientemente escolhido,
dá uma pista sobre a acção que se está a tomar, e, por outro lado, permite uma actualização
mais fácil do código, pois constantes que estão associadas não têm que ser alteradas em
vários sítios dentro do código (porventura falhando-se alguma), mas simplesmente na linha
do comando EQU .

3.4

Modos de Endereçamento

Os operandos usados nas instruções assembly podem ter 7 modos de endereçamento, a seguir
indicados. O significado dos símbolos usados nesta secção é:
op:
operando;
Rx :
registo Rx . O processador tem 8 registos visíveis para o programador,
portanto 0 ≤ x ≤ 7, em que R0 é sempre igual a 0;
W:
constante de valor W (de 16 bits);
M[y] : referência à posição de memória com endereço y ;
PC :
registo contador de programa (program counter);
SP :
registo do apontador para o topo da pilha (stack pointer)
Endereçamento por Registo

op = Rx

O valor do operando é o conteúdo do registo Rx .
Endereçamento por Registo Indirecto

op = M[Rx]

O valor do operando é o conteúdo da posição de memória cujo endereço é o conteúdo do
registo Rx .
Endereçamento Imediato

op = W

O valor do operando é W . Naturalmente, este modo não pode ser usado como operando
destino.
Endereçamento Directo

op = M[W]

O valor do operando é o conteúdo da posição de memória com o endereço W .
Endereçamento Indexado

op = M[Rx+W]

O valor do operando é o conteúdo da posição de memória com o endereço resultante da
soma de W com o conteúdo de Rx , Rx+W . Nota: a versão W+Rx não é aceite pelo assembler.
Endereçamento Relativo

op = M[PC+W]

O valor do operando é o conteúdo da posição de memória com o endereço resultante da
soma de W com o conteúdo de PC , PC+W . Nota: a versão W+PC não é aceite pelo assembler.

8

Endereçamento Baseado

op = M[SP+W]

O valor do operando é o conteúdo da posição de memória com o endereço resultante da
soma de W com o conteúdo de SP , SP+W . Nota: a versão W+SP não é aceite pelo assembler.
Na utilização destes modos de endereçamento, há as seguintes restrições:
- no caso das instruções com 2 operandos, para um deles tem que ser necessariamente
usado o endereçamento por registo.
- o modo imediato não pode ser usado como operando destino, por razões óbvias.
- as instruções MUL e DIV , por usarem como destino ambos os operandos (ver descrição
adiante), não podem usar o modo imediato em nenhum dos operandos. Além disso,
os dois operandos não devem ser o mesmo devido a limitações na arquitectura do
processador que provoca que parte do resultado se perca.

3.5

Etiquetas

Para referenciar uma dada posição de memória, pode-se colocar uma etiqueta (label) antes da
instrução que vai ficar nessa posição. A etiqueta consiste num nome (conjunto de caracteres
alfanuméricos, mais o caracter ’_ ’, em que o primeiro não pode ser um algarismo) seguida
de ’: ’. Por exemplo,
VoltaAqui:

INC

R1

Se agora se quiser fazer um salto para esta instrução, pode-se usar:
BR VoltaAqui
em vez de se calcular o endereço em que a instrução INC R1 ficará depois da assemblagem.
Para facilitar a leitura do código assembly, convenciona-se que estas etiquetas são palavras capitalizadas todas juntas: primeira letra de cada palavra em maiúsculas e restantes em
minúsculas, como no exemplo anterior VoltaAqui .
O valor atribuído às etiquetas pode ser consultado no ficheiro com a extensão .lis ,
gerado quando da execução do p3as .

3.6

Comentários

Um comentário começa com o caracter ’; ’, que indica ao assembler que todo o texto que se
segue nessa linha deverá ser ignorado no processo de tradução do código assembly.

3.7

Pseudo-Instruções

Chama-se pseudo-instruções ao conjunto de comandos reconhecidos pelo assembler que não
são instruções assembly, mas que permitem dar ao assembler um conjunto de informações e
directivas necessárias para a sua correcta execução ou para simplificar a sua utilização. A
função das pseudo-instruções é, por um lado, controlar a forma como o código é gerado
(por exemplo, indicando as posições de memória onde colocar o executável ou reservando
posições de memória para dados), por outro lado, permitir definir símbolos (constantes ou
posições de memória) que tornam o código mais legível e mais fácil de programar. Nesta
secção descrevem-se as pseudo-instruções usadas pelo assembler p3as .
9

ORIG
Formato: ORIG



Função: o comando ORIG permite especificar no campo 
a primeira posição de
memória em que um bloco de programa ou dados é carregado em memória. Este comando
pode aparecer várias vezes no código, permitindo que se definam blocos em diferentes zonas
de memória.
EQU
Formato: 

EQU



Função: o comando EQU permite associar um valor const a um símbolo . Convenciona-se
que estes símbolos são palavras todas em maiúsculas, com uso possível do caracter de separação ’_’, por exemplo, NUM_LINHAS .
Nota: Este comando associa um nome a uma constante. Isto permite que, no código assembly,
em vez de um valor numérico que em geral não dá muita informação, se use um nome que
pode indicar que tipo de acção se está a tomar nesse ponto do código. Adicionalmente, permite que numa posterior alteração baste alterar a linha do comando EQU para que a alteração
se propague pelo código todo.
WORD
Formato: 

WORD



Função: o comando WORD permite reservar uma posição de memória para conter uma variável do programa assembly, associando a essa posição o nome especificado em  .
O campo const indica o valor a que essa posição de memória deve ser inicializada. Convenciona-se que estas etiquetas são palavras capitalizadas todas juntas: primeira letra de
cada palavra em maiúsculas e restantes em minúsculas, por exemplo CicloInterno
.
STR
Formato: 

STR

’’|[,’’|]

Função: o comando STR coloca em posições de memória consecutivas o texto que estiver
entre plicas ou o valor de  . No caso de  , o código ASCII de cada caracter
entre plicas fica numa posição de memória (portanto usa tantas posições de memória quantos os caracteres em  ). Podem-se usar mais do que um parâmetro, separados por
vírgulas, sendo feita a sua concatenação em memória. 
fica com o endereço do
primeiro caracter. A convenção para os nomes destas etiquetas é o mesmo que para WORD .
TAB
Formato: 

TAB



Função: o comando TAB reserva o número de posições de memória especificados no campo
 sem as inicializar com qualquer valor. 
fica com o endereço da primeira posição. A convenção para os nomes destas etiquetas é o mesmo que para WORD e
STR .
10

3.8

Instruções Assembly

As instruções assembly válidas para o micro-processador P3 são apresentadas em seguida
por ordem alfabética. É indicado o formato da instrução, a função realizada e as flags alteradas (Z, zero; C, carry ou transporte; N, negative ou sinal; O, overflow ou excesso; E, enable das
interrupções).

ADD
Formato: ADD

op1,

Flags: ZCNO

op2

Acção: op1 ← op1 + op2, soma a op1 o valor de op2.

ADDC
Formato: ADDC

op1,

Flags: ZCNO

op2

Acção: op1 ← op1 + op2 + C, igual a ADD excepto que soma mais um caso o bit de estado
transporte esteja a 1.

AND
Formato: AND

op1,

Flags: ZN

op2

Acção: op1 ← op1 ∧ op2. Faz o AND lógico bit-a-bit dos dois operandos.

BR
Flags: Nenhuma

Formato: BR 

Acção:
PC ← PC + , branch, salto relativo incondicional para

posições de memória à frente (ou atrás, se 
for negativo) da posição actual. O valor de 
tem que estar compreendido entre
-32 e 31. Normalmente 
é especificado com uma etiqueta.

BR.cond
Formato: BR. cond

Flags: Nenhuma



Acção: salto relativo condicional baseado no valor de um dada condição. As versões disponíveis são:
Condição
Verdade
Falso

Transporte

BR.C
BR.NC

Sinal

BR.N
BR.NN

Excesso

BR.O
BR.NO

Zero

BR.Z
BR.NZ

Interrupção

BR.I
BR.NI

Positivo

BR.P
BR.NP

Caso a condição se verifique, a próxima instrução a ser executada será a do endereço
PC + 
(PC ← PC + ). Caso contrário, funciona como um
NOP . O valor de 
tem que estar compreendido entre -32 e 31. Normalmente 
é especificado com uma etiqueta.
11

CALL
Formato: CALL

Flags: Nenhuma



Acção: M[SP] ← PC, SP ← SP - 1, PC ← , chamada a subrotina com início em
 . O endereço da instrução seguinte ao CALL é colocado na pilha e é feito uma
salto para a subrotina. Normalmente 
é especificado com uma etiqueta.
CALL.cond
Formato: CALL. cond

Flags: Nenhuma



Acção: chamada condicional a uma subrotina baseado no valor de um dado bit de estado.
As versões disponíveis são:
Condição
Verdade
Falso

Transporte

CALL.C
CALL.NC

Sinal

CALL.N
CALL.NN

Excesso

CALL.O
CALL.NO

Zero

CALL.Z
CALL.NZ

Interrupção

CALL.I
CALL.NI

Positivo

CALL.P
CALL.NP

Caso a condição se verifique, comporta-se como uma instrução CALL . Caso contrário, funciona como um NOP . Normalmente 
é especificado com uma etiqueta.
CLC
Flags: C

Formato: CLC
Acção: clear C, coloca o bit de estado transporte a 0.
CMC

Flags: C

Formato: CMC
Acção: complementa o valor do bit de estado transporte.
CMP
Formato: CMP

op1,

Flags: ZCNO

op2

Acção: compara os operandos op1 e op2, actualizando os bits de estado. Efectua a mesma
operação que SUB op1, op2 sem alterar nenhum dos operandos. É habitualmente seguida
no programa por uma instrução BR. cond, JMP. cond ou CALL. cond
COM
Formato: COM

Flags: ZN

op

Acção: op ← op, faz o complemento bit-a-bit de op.
DEC
Formato: DEC

Flags: ZCNO

op

Acção: op ← op - 1, decrementa op em uma unidade.

12

DIV
Formato: DIV

op1,

Flags: ZCNO

op2

Acção: executa a divisão inteira de op1 por op2, deixando o resultado em op1 e o resto em
op2. Assume operandos sem sinal. O bit de estado O fica a 1 no caso de divisão por 0. Os
bit de estado C e N ficam sempre a 0. Uma vez que ambos os operandos são usados para
guardar o resultado, nenhum deles pode estar no modo imediato. Pela mesma razão, os
dois operandos não devem ser o mesmo pois parte do resultado será perdido.
DSI
Flags: E

Formato: DSI
Acção: disable interrupts, coloca o bit de estado E a 0, inibindo assim as interrupções.
ENI

Flags: E

Formato: ENI

Acção: enable interrupts, coloca o bit de estado E a 1, permitindo assim as interrupções.
INC
Formato: INC

Flags: ZCNO

op

Acção: op ← op + 1, incrementa op em uma unidade.
INT
Formato: INT

Flags: EZCNO

const

Acção: M[SP] ← RE, SP ← SP - 1, M[SP] ← PC, SP ← SP - 1, RE ← 0, PC ← M[FE00h+const],
gera uma interrupção com o vector const . Este vector tem que estar compreendido entre
0 e 255. Esta interrupção ocorre sempre, independentemente do valor do bit de estado E ,
enable interrupts.
JMP
Formato: JMP

Flags: Nenhuma



Acção: PC ← , jump, salto absoluto incondicional para a posição de memória com
o valor  . Normalmente 
é especificado com uma etiqueta.
JMP.cond
Formato: JMP. cond

Flags: Nenhuma



Acção: salto absoluto condicional baseado no valor de um dada condição. As versões disponíveis são:
Condição
Verdade
Falso

Transporte

JMP.C
JMP.NC

Sinal

JMP.N
JMP.NN

Excesso

JMP.O
JMP.NO
13

Zero

JMP.Z
JMP.NZ

Interrupção

JMP.I
JMP.NI

Positivo

JMP.P
JMP.NP

Caso a condição se verifique, a próxima instrução a ser executada será a apontada por

(PC ← ). Caso contrário, funciona como um NOP . Normalmente

é especificado com uma etiqueta.
MOV
Formato: MOV

op1,

Flags: Nenhuma

op2

Acção: op1 ← op2, copia o conteúdo de op2 para op1 .
Para além dos modos de endereçamento comuns a todas as instruções (conforme Secção 3.4),
esta instrução permite ler e escrever no registo apontador da pilha SP , mas apenas em conjunção com o modo de endereçamento por registo: MOV SP, Rx e MOV Rx, SP . A primeira
destas instruções será necessária no início de todos os programas que utilizem a pilha.
MUL
Formato: MUL

op1,

Flags: ZCNO

op2

Acção: op1|op2 ← op1 × op2, multiplica op1 por op2 , assumindo-os como números sem sinal. Como o resultado necessita de 32 bits são usados os dois operandos para o guardar:
op1 fica com o 16 mais significativos e op2 com os 16 menos significativos. O bit de estado
Z é actualizado de acordo com o resultado, os restantes ficam a 0. Uma vez que ambos os
operandos são usados para guardar o resultado, nenhum deles pode estar no modo imediato. Pela mesma razão, os dois operandos não devem ser o mesmo pois parte do resultado
será perdido.
MVBH
Formato: MVBH

op1,

Flags: Nenhuma

op2

Acção: op1 ← (op1 ∧ 00FFh) ∨ (op2 ∧ FF00h), copia o octeto de maior peso de op2 para o
octeto de maior peso de op1 .
MVBL
Formato: MVBL

op1,

Flags: Nenhuma

op2

Acção: op1 ← (op1 ∧ FF00h) ∨ (op2 ∧ 00FFh), copia o octeto de menor peso de op2 para o
octeto de menor peso de op1 .
NEG
Formato: NEG

Flags: ZCNO

op

Acção: op ← -op, troca o sinal (complemento para 2) do operando op .
NOP
Flags: Nenhuma

Formato: NOP
Acção: no operation, não altera nada.

14

OR
Formato: OR op1,

Flags: ZN

op2

Acção: op1 ← op1 ∨ op2, faz o OR lógico bit-a-bit dos dois operandos.
POP
Formato: POP

Flags: Nenhuma

op

Acção: SP ← SP + 1, op ← M[SP], copia o valor do topo da pilha para op e reduz o tamanho
desta.
PUSH
Formato: PUSH

Flags: Nenhuma

op

Acção: M[SP] ← op, SP ← SP - 1, coloca op no topo da pilha.
RET
Flags: Nenhuma

Formato: RET

Acção: SP ← SP + 1, PC ← M[SP], retorna de uma subrotina. O endereço de retorno é obtido
do topo da pilha.
RETN
Formato: RETN

Flags: Nenhuma

const

Acção: SP ← SP + 1, PC ← M[SP], SP ← SP + const, retorna de uma subrotina libertando
const posições do topo da pilha. Esta instrução permite retornar de uma subrotina retirando automaticamente parâmetros que tenham sido passados para essa subrotina através
da pilha. O valor de const tem que estar compreendido entre 0 e 1023 (10 bits).
ROL
Formato: ROL

op,

Flags: ZCN

const

Acção: rotate left, faz a rotação à esquerda dos bits de op o número de vezes indicado por
const . Mesma operação que o deslocamento simples,SHL , mas os bits da esquerda não se
perdem, sendo colocados nas posições mais à direita de op . O valor de const tem que estar
compreendido entre 1 e 16.
ROLC
Formato: ROLC

op,

Flags: ZCN

const

Acção: rotate left with carry, mesma operação que ROL , mas envolvendo o bit de estado transporte: o valor de C é colocado na posição mais à direita de op e o bit mais à esquerda de op
é colocado em C . O valor de const tem que estar compreendido entre 1 e 16.

15

ROR
Formato: ROR

op,

Flags: ZCN

const

Acção: rotate right, faz a rotação à direita dos bits de op o número de vezes indicado por
const . Mesma operação que o deslocamento simples, SHR , mas os bits da direita não se
perdem, sendo colocados nas posições mais à esquerda de op . O valor de const tem que
estar compreendido entre 1 e 16.
RORC
Formato: RORC

op,

Flags: ZCN

const

Acção: rotate right with carry, mesma operação que ROR , mas envolvendo o bit de estado
transporte: o valor de C é colocado na posição mais à esquerda de op e o bit mais à direita
de op é colocado em C . O valor de const tem que estar compreendido entre 1 e 16.
RTI
Flags: EZCNO

Formato: RTI

Acção: SP ← SP + 1, PC ← M[SP], SP ← SP + 1, RE ← M[SP], return from interrupt, retorna
de uma rotina de serviço a uma interrupção. O endereço de retorno e os bits de estado são
obtidos do topo da pilha, por esta ordem.
SHL
Formato: SHL

op,

Flags: ZCN

const

Acção: shift left, deslocamento à esquerda dos bits de op o número de vezes indicado por
const . Os bits mais à esquerda de op são perdidos e é colocado 0 nas posições mais à direita. O bit de estado transporte fica com o valor do último bit perdido. O valor de const tem
que estar compreendido entre 1 e 16.
SHLA
Formato: SHLA

op,

Flags: ZCNO

const

Acção: shift left arithmetic, mesma operação que SHL , mas actualizando os bits de estado
correspondentes às operações aritméticas. Permite realizar de forma expedita uma multiplicação de op por 2n . O valor de const tem que estar compreendido entre 1 e 16.
SHR
Formato: SHR

op,

Flags: ZCN

const

Acção: shift right, deslocamento à direita dos bits de op o número de vezes indicado por
const . Os bits mais à direita de op são perdidos e são colocados 0 nas posições mais à esquerda. O bit de estado transporte fica com o valor do último bit perdido. O valor de const
tem que estar compreendido entre 1 e 16.

16

SHRA
Formato: SHRA

op,

Flags: ZCNO

const

Acção: shift right arithmetic, deslocamento à direita dos bits de op , mas mantendo o bit de
sinal. Os bits mais à direita de op são perdidos, mas os bits mais à esquerda mantêm o valor
anterior. O bit de estado transporte fica com o valor do último bit perdido. Permite realizar
de forma expedita uma divisão de op por 2n . const entre 1 e 16.

STC
Flags: C

Formato: STC
Acção: set C, coloca o bit de estado transporte a 1.

SUB
Formato: SUB

op1,

Flags: ZCNO

op2

Acção: op1 ← op1 - op2, subtrai a op1 o valor de op2.

SUBB
Formato: SUBB

op1,

Flags: ZCNO

op2

Acção: op1 ← op1 - op2 - C, igual a SUB excepto que subtrai mais um caso o bit de estado
transporte esteja a 1.

TEST
Formato: TEST

op1,

Flags: ZN

op2

Acção: testa o bits dos operandos op1 e op2, actualizando os bits de estado. Efectua a mesma
operação que AND op1, op2 sem alterar nenhum dos operandos.

XCH
Formato: XCH

op1,

Flags: Nenhuma

op2

Acção: exchange op1/op2, op1 ← op2, op2 ← op1, troca os valores de op1 e op2 .

XOR
Formato: XOR

op1,

Flags: ZN

op2

Acção: op1 ← op1 ⊕ op2. Faz a operação lógica EXCLUSIVE - OR bit-a-bit dos dois operandos.

17

4 Simulador
4.1

Evocação

O modo de evocação do simulador p3sim é simplesmente:
$ p3sim

[.exe]

em que .exe
é o executável gerado pelo assembler p3as que se pretende simular.
Os parêntesis rectos indicam que o ficheiro .exe é opcional, o programa a simular
pode também ser carregado através da interface do simulador.
Para sair do simulador deve-se escolher a opção Sai do menu Ficheiro.

4.2

Ambiente

A evocação do simulador lança uma janela como a representada na Figura 1.

Figura 1: Interface do simulador.
Nesta janela existem 6 secções diferentes que se explicam em seguida, no sentido de cima
para baixo na janela.
18

4.2.1 Menus
Na parte superior da janela existem 5 menus que se abrem quando seleccionados: Ficheiro,
Definições, Comandos, Depuração e Ver. Qualquer destes menus pode ser mantido aberto seleccionando a primeira linha (a tracejado).
As opções de cada menu são as seguintes:
• Ficheiro:
as opções deste menu estão relacionadas com a manipulação de ficheiros, quer para
leitura quer para escrita.
Carrega Programa permite carregar para o simulador um novo programa gerado pelo
p3as .
Escreve Memória escreve para um ficheiro o conteúdo actual da memória. O ficheiro
gerado é texto com uma posição de memória por cada linha, com endereço e conteúdo dessa posição. Todos estes valores são de 16 bits e estão em hexadecimal.
Carrega Memória carrega directamente algumas posições de memória. O ficheiro de
entrada deve ser em texto, com o mesmo formato gerado pelo comando Escreve
Memória, uma posição de memória por cada linha, com endereço e conteúdo dessa
posição. Podem especificar-se o número de posições que se quiser e a sua ordem
não é importante. Todos estes valores têm que estar em hexadecimal e ser de 16
bits.
Carrega ROM de Controlo permite alterar ao conteúdo da ROM da unidade de controlo. Esta opção é útil para modificar o micro-programa das instruções. O ficheiro de entrada deve ser texto, com uma posição de memória por linha. Em
cada linha deve constar o endereço da posição a alterar (a ROM tem um barramento de endereços de 9 bits, portanto 512 posições de memória) e o novo valor
a colocar nessa posição (cada posição desta ROM tem 32 bits), tudo em hexadecimal.
Carrega ROM A permite alterar ao conteúdo da ROM que faz o mapeamento de instruções. A ROM A é endereçada com o campo do código da instrução assembly presente no registo de instrução, colocando à saída o endereço de início da
micro-rotina que realiza esta instrução na ROM de Controlo. Esta opção é útil
para acrescentar novas instruções ou modificar o micro-programa de instruções
já existentes. O ficheiro de entrada deve ser texto, com uma posição de memória
por linha. Em cada linha deve constar o endereço da posição a alterar (esta ROM
tem 64 posições) e o novo valor a colocar nessa posição (cada posição desta ROM
tem 9 bits), tudo em hexadecimal.
Carrega ROM B permite alterar ao conteúdo da ROM que faz o mapeamento do modo
de endereçamento. A ROM B é endereçada com o campo do modo de endereçamento da instrução assembly presente no registo de instrução, de acordo com a
Figura 12.8 do livro, colocando à saída o endereço da sub-micro-rotina na ROM
de Controlo que lê/escreve os operandos de acordo com esse modo. Esta opção
é útil para acrescentar ou modificar os modos de endereçamento existentes. O
ficheiro de entrada deve ser texto, com uma posição de memória por linha. Em

19

cada linha deve constar o endereço da posição a alterar (esta ROM tem 16 posições) e o novo valor a colocar nessa posição (cada posição desta ROM tem 9 bits),
tudo em hexadecimal.
Sai saída do programa, perdendo-se toda a informação sobre o contexto da simulação.
• Definições:
menu com opções de configuração do próprio simulador.
Define IVAD define quais os vectores de interrupção associado a cada um dos botões
de interrupção. Permite ainda desabilitar individualmente cada botão de interrupção. As alterações só têm efeito após se pressionar em Guarda.
Zona de Memória permite alterar qual a gama de posições de memória visualizadas
na secção da memória (ver Secção 4.2.4).
Zona de Programa permite alterar o número de posições de memória visualizadas na
secção de programa desassemblado (ver Secção 4.2.5).
• Comandos:
os comandos deste menu são os mesmos que os descritos na Secção 4.2.6. A razão
da duplicação é que por vezes pode ser útil ter este menu fixo numa janela pequena e
independente.
• Depuração:
neste menu estão um conjunto de opções que facilitam a depuração de programas.
Pontos de Paragem esta opção lista os pontos de paragem (ou breakpoints, endereços
onde a execução do programa pára) que estão definidos. Para apagar todos os
pontos de paragem basta clicar em Apaga Todos. Para apagar um determinado
ponto de paragem deve-se clicar sobre ele (quer nesta janela quer na do programa)
e depois clicar em Apaga. Para definir um novo ponto de paragem numa dada
linha do código, deve-se seleccionar essa linha na janela do programa e depois
clicar em Adiciona.
Escreve Registo permite alterar directamente o conteúdo dos registos. O valor deve
estar em hexadecimal.
Escreve Memória permite alterar directamente uma posição de memória. Os valores
do endereço e conteúdo devem estar em hexadecimal. Importante: se se alterar
o conteúdo de uma posição correspondente ao código, a janela de programa não
será actualizada (não há uma nova desassemblagem do programa), e, portanto,
haverá alguma inconsistência.
• Ver:
este menu tem opções para activar/desactivar janelas ou informação extra no simulador.
Ver Controlo estende ou reduz a interface do simulador, permitindo visualizar informação interna da unidade de controlo. Este modo de funcionamento é descrito
na Secção 4.4.

20

Ver ROMs cria ou elimina uma janela que mostra o conteúdo de cada posição de memória das três ROMs da unidade de controlo: ROM de mapeamento A, ROM de
mapeamento B e ROM de Controlo.
Janela Texto cria ou elimina a janela de entrada e saída de texto. Como descrito na
Secção 4.6.1, as entradas/saídas para esta janela estão mapeadas nos endereços
FFFCh a FFFFh . Portanto, leituras e escrita para esta gama de endereços controlam este dispositivo de acordo com o descrito nessa secção.
Janela Placa cria ou elimina a janela de entrada e saída que emula a placa DIO5 da
Digilent, com:
–
–
–
–
–

um display LCD, com 16 colunas e duas linhas;
4 displays de 7 segmentos;
16 LEDs individuais;
8 interruptores;
15 botões de pressão (na placa DIO5, existe um 16o botão que não está a ser
utilizado com o P3 ).

Os endereços de controlo para estes dispositivos estão descritos na Secção 4.6.2.
4.2.2 Contadores de Instrução e Ciclos de Relógio
Por baixo dos menus, existe uma secção que mostra o número de instruções e o número de
ciclos de relógio que decorreram desde que se efectuou o último reset ao processador.
4.2.3 Registos
A secção imediatamente abaixo à esquerda indica o valor actual de cada registo da unidade
de processamento. São apresentados os registos de uso genérico (R0 a R7 ), o contador de
programa PC (program counter) e o apontador para o topo da pilha SP (stack pointer). Todos
os valores estão em hexadecimal, com 16 bits.
Estão também indicados os bits de estado (flags) do sistema (cujo valor é, naturalmente,
0 ou 1): O , excesso ou overflow; C , transporte ou carry; N , sinal ou negative; Z , zero; e E , enable
interrupt.
4.2.4 Conteúdo da Memória
Nesta secção é mostrado o conteúdo das diferentes posições de memória. Por razões de
eficiência, não é possível ter acesso a todas as posições de memória simultaneamente. Assim,
optou-se por dar acesso a duas zonas diferentes da memória, o que se traduz na divisória
ao meio desta secção. Inicialmente, a parte de cima aponta para a zona de memória onde
tipicamente estão os dados e a parte de baixo para a zona da pilha e tabela de interrupção,
com os valores:
parte de cima:
parte de baixo:

início
8000h
FD00h

21

fim
81FFh
FEFFh

posições
512
512

Pelo menu Definições, é possível definir o endereço de início e o número de posições de
memória a visualizar em cada uma destas zonas. Um aumento do número de posições a
visualizar torna a execução do simulador mais lenta.
Em cada linha são apresentadas 8 posições de memória consecutivas. O endereço da primeira destas posições é o primeiro número da linha. Os seguintes 8 valores são o conteúdo
dessas posições. Mais uma vez, todos os valores estão em hexadecimal e são de 16 bits.
No final de cada linha estão os 8 caracteres com os códigos ASCII das posições de memória
dessa linha. Caso o valor não corresponda ao código ASCII de um caracter alfa-numérico, é
usado o caracter ’. ’.
4.2.5 Programa Desassemblado
Na secção em baixo à esquerda é apresentado o programa desassemblado. Sempre que um
novo programa é carregado para o simulador, é feita a sua desassemblagem. Este processo
consiste em interpretar os valores binários do ficheiro de entrada e imprimir a instrução
assembly que lhes corresponde. Notar que não se tem acesso às etiquetas usadas no ficheiro
assembly original, logo todos os valores são numéricos.
A barra escura indica a próxima instrução a ser executada. No entanto, esta pode ser
colocada em qualquer instrução, clicando em cima dela. Isto permite que seja aí colocado um
ponto de paragem, através da opção Pontos de Paragem do menu Depuração. As instruções
com pontos de paragem são antecedidas no código com o sinal ’» ’. Para se remover um
ponto de paragem pode-se clicar sobre essa instrução e fazer Apaga na mesma opção do
menu Depuração.
Quando o programa se está a executar e pára num dado ponto de paragem, tal é assinalado pela cor vermelha da barra de selecção.
4.2.6 Comandos de Execução e Interrupção
No canto inferior direito estão os comandos que controlam a execução do programa:
Instrução – executa uma única instrução assembly.
Corre – reinicia o programa e executa-o indefinidamente ou até parar num ponto de paragem. O utilizador pode parar o programa em qualquer altura clicando no botão Parar.
Reinicia – faz reset ao processador, colocando todos os registos a 0, excepto o PC que é
colocado com o valor do endereço de início do programa.
Continua – continua a execução do programa a partir da instrução corrente. Este botão
transforma-se num botão Parar permitindo ao utilizador parar a execução do programa
em qualquer altura.
Refresca – actualiza a janela do programa sem parar a sua execução, mostrando o conteúdo
da memória e dos registos na altura em que se clicou neste botão.

22

4.3

Depuração

Tipicamente, as ferramentas disponíveis para ajudar na depuração de um programa em assembly são muito limitadas. A funcionalidade destas ferramentas é replicada no simulador
p3sim .
Para testar a funcionalidade de uma secção do código, começa-se por colocar um ponto
de paragem (como indicado atrás) no início dessa secção e dá-se o comando Corre. Após a
sua paragem, executa-se o programa passo-a-passo, verificando se o fluxo do programa é
o previsto e se depois de cada instrução os registos, bits de estado e posições de memória
foram alterados de acordo com o esperado. Caso tal não aconteça, é possível que se tenha
que repetir este procedimento para se tentar perceber porque que é que o comportamento
do programa é diferente do esperado.
Por vezes é desejável criar artificialmente as condições que se quer testar. Para isso
podem-se carregar os registos/posições de memória com os valores necessários para o teste
que se pretende.
Basicamente, são estes os procedimentos a seguir. Portanto, a não ser que se tenha uma
intuição muito apurada para depuração de programas assembly que dê uma ideia muito boa
de onde o erro poderá estar a surgir, é vivamente recomendado que o teste dos programas
seja feito módulo a módulo. Só depois de os módulos terem sido testados separadamente
sob condições típicas e se ter bastante confiança no seu correcto funcionamento é que se deve
começar a juntá-los e a testá-los em conjunto.

4.4

Unidade de Controlo

O simulador p3sim faz simulação ao nível do micro-código. Para se ter acesso à informação
interna da unidade de controlo (portanto informação que não está disponível a nível da
programação assembly) deve-se seleccionar a opção Ver controlo do menu Ver. Após esta
selecção a interface é estendida, ficando como mostra a Figura 2.
Em particular, temos mais uma secção na janela da interface com os registos internos da
unidade de controlo e mais um botão (Clock) na secção de comandos de execução.
4.4.1 Registos Internos à Unidade de Controlo
A secção que aparece entre os registos e o conteúdo da memória mostra os valores dos registos internos à unidade de controlo. São registos que não são vistos pelo programador, mas
que são usados pelos micro-programas das instruções do processador.
Os registos apresentados são:
R8-R13 – conjunto de 6 registos de 16 bits de uso genérico para os micro-programas. Destes,
os 3 últimos têm significados especiais pela maneira como são usados na estrutura dos
micro-programas do processador:
R11 : também chamado de SD (source data), pois na fase de operand fetch da instrução é
carregado com o valor do operando origem (source).
R12 : também chamado de EA (effective address), pois na fase de operand fetch da instrução é carregado com o endereço de memória onde eventualmente se vai buscar
um dos operandos (aquele que não é usado em modo registo) e, na fase de writeback, onde se guarda o resultado caso o operando destino esteja em memória.
23

Figura 2: Interface do simulador estendida com a informação de controlo.
R13 : também chamado de RD (result data), pois na fase de operand fetch da instrução é
carregado com o valor do operando destino e fica com o valor do resultado, a ser
usado na fase de write-back.
R14 – de facto, este é o registo apontador da pilha, SP , ou seja, o registo SP está no banco de
registos e corresponde ao R14 .
R15 – de igual forma, este é o registo contador de programa, PC .
CAR – control address register, contém o endereço da ROM de Controlo com a micro-instrução
a executar no próximo ciclo de relógio. Registo de 9 bits.
SBR – subroutine branch register, guarda o endereço de retorno quando se executa uma chamada a uma sub-rotina dentro de um micro-programa. Registo de 9 bits.
uI – micro-instruction, micro-instrução a ser executada no próximo ciclo de relógio. A microinstrução tem 32 bits.
IR – instruction register, contém a instrução assembly que está a ser executada. Registo de 16
bits.
INT – interrupt, indica se existe ou não uma interrupção pendente, tomando os valores 1 ou
0 respectivamente.
24

z , c – bits de estado zero e transporte à saída da ULA, invisíveis ao programador e, portanto,
apenas úteis na micro-programação. São actualizados todos os ciclos de relógio, ao
contrário dos bits de estado em assembly cuja actualização ou não é controlada pelo
micro-programa. Tomam os valores 0 ou 1.
4.4.2 Botão Clock
Este botão extra permite executar apenas um ciclo de relógio de cada vez. A sua utilidade é
permitir seguir o funcionamento de um micro-programa, micro-instrução a micro-instrução.
Para acabar a execução da instrução assembly actual pode usar-se o botão Instrução, que executa os ciclos de relógio necessários para chegar novamente ao início do ciclo de fetch.
Notar que o PC pode ficar momentaneamente numa zona inválida quando se carrega
no botão Clock, o que é indicado pela mensagem “A posição apontada pelo PC não contém uma
instrução válida”. Isto deve-se a que, nas instruções que ocupam duas posições de memória,
o PC possa ficar momentaneamente a apontar para a segunda posição de memória dessa
instrução, que não corresponde a uma instrução assembly. Uma vez lida essa posição de
memória, o PC é de novo incrementado, voltando a uma posição válida.

4.5

Micro-Programação

O simulador p3sim está desenvolvido de forma a permitir modificar o funcionamento das
instruções assembly do processador e mesmo introduzir novas instruções. Este processo envolve modificar algumas posições de memória das ROMs do processador: a ROM de Controlo e as ROMs de mapeamento, A e B. O conteúdo destas ROMs é apresentado no Anexo B.
A alteração de uma instrução pode, em princípio, ser feita modificando certas posições da
ROM de controlo. Para isso, tem que se analisar o micro-programa da instrução assembly a alterar e identificar quais as posições do micro-programa que devem ser alteradas. Basta então
criar um ficheiro de texto com uma linha por cada micro-instrução a alterar. Em cada linha
deve constar o endereço da ROM de controlo a alterar seguido do valor desejado para essa
posição, todos os valores em hexadecimal. Este ficheiro deve depois ser carregado usando o
opção Carrega ROM de Controlo do menu Ficheiro. O formato usado para as micro-instruções
está apresentado no Anexo B.
Para adicionar uma instrução, é necessário:
1. arranjar um código de instrução (opcode) único.
2. desenvolver o micro-programa para essa instrução.
3. arranjar um espaço livre na ROM de Controlo onde esse micro-programa vai ser colocado. No caso do p3sim , as posições livres são a partir do endereço 112h , inclusive.
4. carregar o micro-programa, conforme descrito no parágrafo anterior.
5. modificar a ROM de mapeamento A, colocando no endereço correspondente ao código
da instrução nova o endereço da ROM de Controlo onde se colocou o micro-programa,
usando o mesmo procedimento que o usado para a alteração da ROM de controlo.
O conteúdo das ROMs do processador pode ser confirmado seleccionando a opção Ver
ROMs do menu Ver.
25

Figura 3: Janela de interface de texto, com 24 linhas e 80 colunas.
A depuração do micro-programa pode ser feito seguindo passo-a-passo (que a este nível é equivalente a ciclo de relógio-a-ciclo de relógio) a sua execução com o botão Clock e
verificando o fluxo e as alterações que o micro-programa provoca nos diferentes registos.

4.6

Dispositivos de Entrada e Saída

O simulador disponibiliza um conjunto de dispositivos de entrada e saída através de duas
janelas que podem ser abertas através do menu Ver. Cada um destes dispositivos poderá ser
acedido por um ou mais portos. Sendo o espaço de endereçamento de IO mapeado no espaço
de endereçamento de memória, a cada porto corresponderá um endereço de memória. Estes
portos podem ser de leitura, de escrita ou de leitura e escrita. Escritas para portos só de
leitura são ignoradas. Leituras de portos de escrita retornam todos os bits a 1, ou seja, FFFFh .
4.6.1 Janela Texto
Esta janela, apresentada na Figura 3, permite uma interface a nível de texto, permitindo ler
caracteres do teclado e escrever caracteres para o monitor. Para aceder a este dispositivo
estão reservados 4 portos:
porto de leitura, endereço FFFFh : uma leitura deste porto retorna o código ASCII do caracter correspondente à última tecla premida sobre a janela de texto. Portanto, no caso
de se premir uma tecla antes da leitura da tecla anterior faz com que esta se perca. É
possível testar se existe alguma tecla para ler através do porto de estado. Uma leitura
deste porto sem que tenha havido uma tecla premida retorna o valor 0.
porto de escrita, endereço FFFEh : porto que permite escrever um dado caracter na janela
de texto. O caracter com o código ASCII igual ao valor escrito para este porto é ecoado
26

Figura 4: Janela de interface que emula a placa de entradas/saídas.
na janela. Esta janela mantém internamente um cursor onde este caracter é escrito.
Sempre que se faz uma escrita, este cursor avança. É possível posicionar-se o cursor
em qualquer ponto da janela através do porto de controlo.
porto de estado, endereço FFFDh : porto que permite testar se existe ou não algum caracter
para ler na janela de texto. Caso não haja, uma leitura deste porto retorna 0. Caso
entretanto tenha sido premida uma tecla, este porto retorna 1. Assim que esta tecla for
lida através do porto de leitura, este porto passa novamente a retornar 0.
porto de controlo, endereço FFFCh : porto que permite posicionar o cursor na janela de
texto, indicando onde será escrito o próximo caracter. Para tornar possível este posicionamento, tem que ser feita a sua inicialização, conseguida através da escrita do valor
FFFFh para este porto1 . Uma vez inicializado, o cursor pode ser posicionado numa
dada linha e coluna escrevendo para este porto um valor em que os 8 bits mais significativos indicam a linha (entre 0 e 23) e os 8 menos significativos a coluna (entre 1 e
80):
15

14

13

12

11

Linha

10

9

8

7

6

5

4

3

Coluna

2

1

0

4.6.2 Janela Placa
A Figura 4 apresenta a janela de interface que emula a placa DIO5 da Digilent, utilizada nas
aulas práticas da disciplina de Arquitectura de Computadores da Licenciatura em Engenharia Informática e de Computadores do IST. Esta disponibiliza os dispositivos que a seguir se
indica:
• 8 interruptores, endereço FFF9h : uma leitura deste endereço permite ler em simultâneo o estado do conjunto dos 8 interruptores. A cada interruptor corresponde um bit,
correspondendo ao interruptor da direita o bit menos significativo e ao da esquerda o
oitavo bit (os oito bits mais significativos vêm sempre a 0). Um interruptor para baixo
coloca o bit respectivo a 0 e para cima a 1.
1

Um efeito secundário desta inicialização é limpar todo o conteúdo da janela.

27

• LEDs, endereço FFF8h : conjunto de 16 LEDs cujo estado individual, ligado ou desligado, é definido por uma escrita para este porto. A cada LED correspondem 1 bit da
palavra de dados, sendo o LED da direita controlado pelo bit menos significativo e os
restantes LEDs por cada um dos restantes bits, por ordem.
• display de 7 segmentos, endereços FFF0 , FFF1h , FFF2h e FFF3h : cada um destes portos controla, da direita para a esquerda, um conjunto de 7 LEDs que formam um display. Os quatro bits menos significativos do valor escrito no porto determina o caracter
hexadecimal (0 a F ) que aparece no display respectivo.
• display LCD, endereços FFF4h e FFF5h : display com 16 colunas e 2 linhas de texto.
Uma escrita para o porto FFF5h faz ecoar o caracter em código ASCII estendido correspondente aos 8 bits menos significativos do valor escrito. O porto FFF4h é um porto
de controlo, em que os diferentes bits activos desencadeiam diferentes operações:
Bit
15
5
4
3a0

Acção
liga ou desliga o display LCD;
limpa o display LCD;
posiciona na linha 0 ou 1 o cursor (que indica a próxima posição a ser escrita);
posiciona o cursor na coluna especificada;

A escrita de um caracter não altera a posição do cursor, logo entre cada escrita é necessário actualizar a posição deste.
• 15 botões de pressão: estes não estão mapeados em memória, clicando num destes
botões é gerada uma interrupção no programa com o correspondente vector de interrupção. É possível desabilitar estes botões, seleccionando a opção Define IVAD no
menu Definições e clicar na respectiva caixa de selecção. É também aqui que se poder
alterar o vector associado a cada um destes 15 botões de interrupção, que, por omissão,
corresponde ao índice do botão.

4.6.3 Temporizador
O simulador p3sim disponibiliza, ainda em conformidade com a placa DIO5, um dispositivo temporizador que permite definir intervalos de tempo real. O temporizador é controlado por dois portos:
• unidades de contagem, endereço FFF6h : uma escrita para este endereço define o número de unidades de contagem, cada com a duração de 100ms. Por exemplo, para se
ter um intervalo de 1s, deve ser escrito para endereço o valor 10. Uma leitura deste
endereço permite obter o valor actual de contagem;
• porto de controlo, endereço FFF7h : este porto permite dar início ou parar uma contagem por escrita, respectivamente, de um 1 ou um 0 no bit menos significativo (os
restantes bits são ignorados). Uma leitura deste endereço indica, no bit menos significativo, o estado do temporizador, em contagem ou parado.
A utilização normal deste dispositivo consiste em escrever no porto FFF6h o número de períodos de 100ms correspondente ao intervalo de tempo pretendido, seguido de uma escrita
28

do valor 1 no porto FFF7h . Deverá ser associada ao vector de interrupção 15 a rotina que
deverá tratar a indicação do final deste intervalo.
4.6.4 Máscara de Interrupções
Um último porto de saída, no endereço FFFAh , está associado à máscara de interrupções.
Esta máscara permite habilitar ou desabilitar cada um dos 16 primeiros vectores de interrupção individualmente, definido pela escrita de um padrão de bits a 1 e a 0, respectivamente.
Por exemplo, para apenas se habilitar as interrupções vindas do temporizador, deverá ser escrito para este endereço o valor 8000h . Uma leitura deste endereço indica a situação actual
da máscara.
A Tabela 2 resume o conjunto de dispositivos de entrada/saída do simulador p3sim .

29

Endereço
FFF0h

Dispositivo
Display 7 segmentos 0

FFF1h

Display 7 segmentos 1

FFF2h

Display 7 segmentos 2

FFF3h

Display 7 segmentos 3

FFF4h

LCD

FFF5h

LCD

FFF6h

Temporizador

FFF7h

Temporizador

FFF8h

LEDs

FFF9h

Interruptores

FFFAh

Máscara de interrupções

FFFCh

Janela de texto

FFFDh

Janela de texto

FFFEh

Janela de texto

FFFFh

Janela de texto

Descrição
Permite escrever no display de
7 segmentos mais à direita.
Só são considerados os 4 bits
menos significativos escritos
no endereço.
Idem para o display à esquerda do anterior.
Idem para o display à esquerda do anterior.
Idem para o display à esquerda do anterior.
Permite enviar sinais de controlo para o LCD.
Permite escrever um caracter
no LCD cujo código ASCII estendido foi escrito no endereço.
Valor do contador associado
ao temporizador.
Arranca ou pára o temporizador.
Permite acender os LEDs correspondentes ao valor em bináio que se escreve no endereço. O LED da direita corresponde ao bit menos significativo.
Permite ler, nos 8 bits menos significativos, o valor definido pela posição dos interruptores. O interruptor da direita corresponde ao bit menos significativo.
Permite definir os vectores de
interrupção habilitados, um
por cada bit da máscara.
Permite colocar o cursor
numa dada posição da janela.
Permite testar se houve alguma tecla primida.
Permite escrever um caracter
na janela.
Permite ler a última tecla primida.

Tabela 2: Resumo dos dispositivos de entrada e saída.
30

Acção
Escrita

Escrita
Escrita
Escrita
Escrita
Escrita

Leitura/Escrita
Leitura/Escrita
Escrita

Leitura

Leitura/Escrita
Escrita
Leitura
Escrita
Escrita

A Formatos das Instruções Assembly
Instruções de 0 operandos
NOP , ENI , DSI , STC , CLC , CMC , RET e RTI
16 bits
6 bits

Opcode

Instruções de 0 operandos com constante
RETN e INT
16 bits
6 bits

10 bits

Opcode

Constante

Instruções de 1 operando
NEG , INC , DEC , COM , PUSH e POP
16 bits
6 bits

2 bits

4 bits

Opcode

M

Reg_modo

W

Instruções de 1 operando com constante
SHR , SHL , SHRA , SHLA , ROR , ROL , RORC , ROLC

6 bits

16 bits
4 bits

2 bits

4 bits

Opcode

# posições

M

Reg_modo

W

31

Instruções de 2 operandos
CMP , ADD , ADDC , SUB , SUBB , MUL , DIV , TEST , AND , OR , XOR , MOV , MVBL , MVBH e XCH

6 bits

1 bit

16 bits
3 bits

S

Reg_reg

2 bits

4 bits

M

Reg_modo

6 bits

2 bits

4 bits

Opcode

M

Reg_modo

Opcode

W

Instruções de salto absoluto incondicional
JMP , CALL
16 bits

W

Instruções de salto absoluto condicional
JMP .cond, CALL. cond

6 bits

16 bits
4 bits

2 bits

4 bits

Opcode

Condição

M

Reg_modo

W

Instrução de salto relativo incondicional
BR
16 bits
6 bits

6 bits

Opcode

Deslocamento

Instrução de salto relativo incondicional
BR. cond

6 bits

16 bits
4 bits

6 bits

Opcode

Condição

Deslocamento

32

Codificação da condição de salto
Condição
Zero
Não zero
Transporte
Não transporte
Negativo
Não negativo
Excesso
Não excesso
Positivo
Não positivo
Interrupção
Não interrupção

Mnemónica
Z
NZ
C
NC
N
NN
O
NO
P
NP
I
NI

Código
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011

Códigos de Operação
Mnemónica
NOP
ENI
DSI
STC
CLC
CMC
RET
RTI
INT
RETN
NEG
INC
DEC
COM
PUSH
POP
SHR
SHL
SHRA
SHLA
ROR
ROL
RORC
ROLC

Código
000000
000001
000010
000011
000100
000101
000110
000111
001000
001001
010000
010001
010010
010011
010100
010101
011000
011001
011010
011011
011100
011101
011110
011111

Mnemónica
CMP
ADD
ADDC
SUB
SUBB
MUL
DIV
TEST
AND
OR
XOR
MOV
MVBH
MVBL
XCH
JMP
JMP.cond
CALL
CALL.cond
BR
BR.cond

33

Código
100000
100001
100010
100011
100100
100101
100110
100111
101000
101001
101010
101011
101100
101101
101110
110000
110001
110010
110011
111000
111001

Modos de Endereçamento
M
00
01
10
11

Endereçamento
Por registo
Por registo indirecto
Imediato
Indexado, directo, relativo ou baseado

Operação
op = RX
op = M[RX]
op = W
op = M[RX+W]

Selecção do operando com o modo de endereçamento
S
0
1

Operando
Destino
Origem

34

B Conteúdo das ROMs de Controlo
Em apêndice, inclui-se a listagem do conteúdo das ROMs da Unidade de Controlo do processador P3 . Estas ROMs podem ser modificadas conforme descrito na Secção 4.5 de forma
a acrescentar uma instrução assembly ou a alterar o comportamento de uma já existente.

ROM B
Endereco
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

-

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

Conteudo
0x00a
0x00b
0x00d
0x00f
0x02d
0x02f
0x02d
0x02f
0x013
0x017
0x01d
0x023
0x015
0x01a
0x020
0x028

Modo
F1R0
F1RI0
F1IM0
F1IN0
WBR0
WBM0
WBR0
WBM0
F2R0
F2RI0
F2IM0
F2IN0
F2RS0
F2RIS0
F2IMS0
F2INS0

35

ROM A
Endereco
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

-

000000
000001
000010
000011
000100
000101
000110
000111
001000
001001
001010
001011
001100
001101
001110
001111
010000
010001
010010
010011
010100
010101
010110
010111
011000
011001
011010
011011
011100
011101
011110
011111
100000
100001
100010
100011
100100
100101
100110
100111
101000
101001
101010
101011
101100
101101
101110
101111
110000
110001
110010
110011
110100
110101
110110
110111
111000
111001
111010
111011
111100
111101

62 - 111110
63 - 111111
Conteudo

Instrucao

0x032
0x033
0x037
0x03b
0x03e
0x040
0x044
0x047
0x04c
0x055
0x0
0x0
0x0
0x0
0x0
0x0
0x05b
0x05e
0x060
0x062
0x064
0x067
0x0
0x0
0x06a
0x071
0x078
0x07f
0x08c
0x093
0x09a
0x0a1
0x0c2
0x0b4
0x0b6
0x0b8
0x0ba
0x0cf
0x0dd
0x0c4
0x0bc
0x0be
0x0c0
0x0a8
0x0af
0x0aa
0x0ca
0x0
0x102
0x105
0x109
0x10d
0x0
0x0
0x0
0x0
0x0f9
0x0f8
0x0
0x0
0x0
0x0

NOP
ENI0
DSI0
STC0
CLC0
CMC0
RET0
RTI0
INT0
RETN0
Livre
Livre
Livre
Livre
Livre
Livre
NEG0
INC0
DEC0
COM0
PUSH0
POP0
Livre
Livre
SHR0
SHL0
SHRA0
SHLA0
ROR0
ROL0
RORC0
ROLC0
CMP0
ADD0
ADDC0
SUB0
SUBB0
MUL0
DIV0
TEST0
AND0
OR0
XOR0
MOV0
MVBH0
MVBL0
XCH0
Livre
JMP.C0
JMP
CALL.C0
CALL
Livre
Livre
Livre
Livre
BR.C0
BR
Livre
Livre
Livre
Livre

36

0x0
0x0

Livre
Livre

ROM de Controlo
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9

0

M5

S
R
1

S
R
2

I
A
K

FM

S
R
1

S
R
2

L
S

MCOND

CALU

M
A

M
B

M
2

M
R
B

RB

8

7

W
M

W
R

6

5

4

3

2

1

MD

M
A
D

RAD

MD

M
A
D

RAD

F

1

M5

C
C

L
I

L

CONST/NA

W
R

F

Figura 5: Formato das micro-instruções.

Endereco
000
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045

000h
001h
002h
003h
004h
005h
006h
007h
008h
009h
00ah
00bh
00ch
00dh
00eh
00fh
010h
011h
012h
013h
014h
015h
016h
017h
018h
019h
01ah
01bh
01ch
01dh
01eh
01fh
020h
021h
022h
023h
024h
025h
026h
027h
028h
029h
02ah
02bh
02ch
02dh

000000000b
000000001b
000000010b
000000011b
000000100b
000000101b
000000110b
000000111b
000001000b
000001001b
000001010b
000001011b
000001100b
000001101b
000001110b
000001111b
000010000b
000010001b
000010010b
000010011b
000010100b
000010101b
000010110b
000010111b
000011000b
000011001b
000011010b
000011011b
000011100b
000011101b
000011110b
000011111b
000100000b
000100001b
000100010b
000100011b
000100100b
000100101b
000100110b
000100111b
000101000b
000101001b
000101010b
000101011b
000101100b
000101101b

Conteudo
0x8060001f
0x400a009f
0x81c000d8
0x0008319e
0x04083f9e
0x000000b9
0x804200f8
0x00023099
0x000132bf
0x80100010
0x2031009d
0x0031009c
0x200138bd
0x00013ebd
0x200a009f
0x00013ebc
0x000a009f
0x0000009c
0x200138bd
0x0031009d
0x2031409b
0x0031009b
0x2031409d
0x0031009c
0x000138bd
0x2031409b
0x0031009c
0x000138bb
0x2031409d
0x00013ebd
0x000a009f
0x2031409b
0x00013ebb
0x000a009f
0x2031409d
0x00013ebc
0x000a009f
0x0000009c
0x000138bd
0x2031409b
0x00013ebc
0x000a009f
0x0000009c
0x000138bb
0x2031409d
0x00313a80

Etiqueta

Operacao

IF0
IF1
IH0
IH1
IH2
IH3
IH4
IH5
IH6
IH7
F1R0
F1RI0
F1RI1
F1IM0
F1IM1
F1IN0
F1IN1
F1IN2
F1IN3
F2R0
F2R1
F2RS0
F2RS1
F2RI0
F2RI1
F2RI2
F2RIS0
F2RIS1
F2RIS2
F2IM0
F2IM1
F2IM2
F2IMS0
F2IMS1
F2IMS2
F2IN0
F2IN1
F2IN2
F2IN3
F2IN4
F2INS0
F2INS1
F2INS2
F2INS3
F2INS4
WBR0

IR<-M[PC]
PC<-PC+1,
CAR<-ROMA[OP]
R8<-RE,
!EINT?CAR<-IF0
M[SP]<-R8,
SP<-SP-1
M[SP]<-PC,
SP<-SP-1,
IAK<-1
R9<-INTADDR
R8<-0200h
R9<-R9-R8
PC<-M[R9]
RE<-R0,
CAR<-IF0
RD<-R[IR1],
CAR<-SBR
EA<-R[IR1]
RD<-M[EA],
CAR<-SBR
RD<-M[PC]
PC<-PC+1,
CAR<-SBR
EA<-M[PC]
PC<-PC+1
EA<-EA+R[IR1]
RD<-M[EA],
CAR<-SBR
RD<-R[IR1]
SD<-R[IR2],
CAR<-SBR
SD<-R[IR1]
RD<-R[IR2],
CAR<-SBR
EA<-R[IR1]
RD<-M[EA]
SD<-R[IR2],
CAR<-SBR
EA<-R[IR1]
SD<-M[EA]
RD<-R[IR2],
CAR<-SBR
RD<-M[PC]
PC<-PC+1
SD<-R[IR2],
CAR<-SBR
SD<-M[PC]
PC<-PC+1
RD<-R[IR2],
CAR<-SBR
EA<-M[PC]
PC<-PC+1
EA<-EA+R[IR1]
RD<-M[EA]
SD<-R[IR2],
CAR<-SBR
EA<-M[PC]
PC<-PC+1
EA<-EA+R[IR1]
SD<-M[EA]
RD<-R[IR2],
CAR<-SBR
R[WBR]<-RD

37

0

046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111

02eh
02fh
030h
031h
032h
033h
034h
035h
036h
037h
038h
039h
03ah
03bh
03ch
03dh
03eh
03fh
040h
041h
042h
043h
044h
045h
046h
047h
048h
049h
04ah
04bh
04ch
04dh
04eh
04fh
050h
051h
052h
053h
054h
055h
056h
057h
058h
059h
05ah
05bh
05ch
05dh
05eh
05fh
060h
061h
062h
063h
064h
065h
066h
067h
068h
069h
06ah
06bh
06ch
06dh
06eh
06fh

000101110b
000101111b
000110000b
000110001b
000110010b
000110011b
000110100b
000110101b
000110110b
000110111b
000111000b
000111001b
000111010b
000111011b
000111100b
000111101b
000111110b
000111111b
001000000b
001000001b
001000010b
001000011b
001000100b
001000101b
001000110b
001000111b
001001000b
001001001b
001001010b
001001011b
001001100b
001001101b
001001110b
001001111b
001010000b
001010001b
001010010b
001010011b
001010100b
001010101b
001010110b
001010111b
001011000b
001011001b
001011010b
001011011b
001011100b
001011101b
001011110b
001011111b
001100000b
001100001b
001100010b
001100011b
001100100b
001100101b
001100110b
001100111b
001101000b
001101001b
001101010b
001101011b
001101100b
001101101b
001101110b
001101111b

0x80000200
0x83002d00
0x00003b1c
0x80000200
0x80000200
0x804010f8
0x000000d9
0x00143298
0x80100218
0x80400ff8
0x000000d9
0x00123298
0x80100218
0x00112098
0x010a0018
0x80000200
0x01002010
0x80000200
0x804004f8
0x000000d9
0x00163298
0x80100218
0x000a009e
0x00013cbf
0x80000200
0x000a009e
0x00013cbf
0x000a009e
0x00013cb8
0x80100218
0x000000d8
0x0008319e
0x00083f9e
0x8040fff8
0x00128098
0x804200f9
0x00023298
0x000130bf
0x80100010
0x000a009e
0x00013cbf
0x8043fff8
0x00128098
0x0000309e
0x80000200
0xe40000f8
0x03c23a98
0x7031309d
0xe4000000
0x73ca009d
0xe4000000
0x73c8009d
0xe4000000
0x7290009d
0xe4000000
0x00083b9e
0x80000200
0xe4000000
0x000a009e
0x70013cbd
0xe403c0f8
0x00128098
0x804040f9
0x03a0009d
0x00023298
0x80c06d00

WBR1
WBM0
WBM1
WBM2
NOP0
ENI0
ENI1
ENI2
ENI3
DSI0
DSI1
DSI2
DSI3
STC0
STC1
STC2
CLC0
CLC1
CMC0
CMC1
CMC2
CMC3
RET0
RET1
RET2
RTI0
RTI1
RTI2
RTI3
RTI4
INT0
INT1
INT2
INT3
INT4
INT5
INT6
INT7
INT8
RETN0
RETN1
RETN2
RETN3
RETN4
RETN5
NEG0
NEG1
NEG2
INC0
INC1
DEC0
DEC1
COM0
COM1
PUSH0
PUSH1
PUSH2
POP0
POP1
POP2
SHR0
SHR1
SHR2
SHR3
SHR4
SHR5

CAR<-IH0
S?CAR<-WBR0
(modo no outro)
M[EA]<-RD
CAR<-IH0
CAR<-IH0
R8<-0010h
R9<-RE
R8<-R8 or R9
RE<-R8,
CAR<-IH0
R8<-000fh
R9<-RE
R8<-R8 and R9
RE<-R8,
CAR<-IH0
R8<-not
R0
R8+1, flag C
CAR<-IH0
R0+R0, flag C
CAR<-IH0
R8<-0004
R9<-RE
R8<-R8 exor R9
RE<-R8,
CAR<-IH0
SP<-SP+1
PC<-M[SP]
CAR<-IH0
SP<-SP+1
PC<-M[SP]
SP<-SP+1
R8<-M[SP]
RE<-R8,
CAR<-IH0
R8<-RE
M[SP]<-R8,
SP<-SP-1
M[SP]<-PC,
SP<-SP-1
R8<-00ffh
R8<-IR and R8
R9<-0200h
R8<-R8-R9
PC<-M[R8]
RE<-R0,
CAR<-IF0
SP<-SP+1
PC<-M[SP]
R8<-03ffh
R8<-IR and R8
SP<-SP+R8
CAR<-IH0
R8<-0, SBR<-CAR+1,
CAR<-F1
R8<-R8-RD,
flags ZCNO
RD<-R8,
CAR<-WB
SBR<-CAR+1,
CAR<-F1
RD<-RD+1,
flags ZCNO, CAR<-WB
SBR<-CAR+1,
CAR<-F1
RD<-RD-1,
flags ZCNO, CAR<-WB
SBR<-CAR+1,
CAR<-F1
RD<-!RD,
flags ZN, CAR<-WB
SBR<-CAR+1,
CAR<-F1
M[SP]<-RD,
SP<-SP-1
CAR<-IH0
SBR<-CAR+1,
CAR<-F1
SP<-SP+1
RD<-M[SP],
CAR<-WB
R8<-03c0h,
SBR<-CAR+1,
CAR<-F1
R8<-R8 and IR
R9<-0040h
RD<-shr
RD, flags ZCN
R8<-R8-R9
!z?CAR<-SHR3

38

112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177

070h
071h
072h
073h
074h
075h
076h
077h
078h
079h
07ah
07bh
07ch
07dh
07eh
07fh
080h
081h
082h
083h
084h
085h
086h
087h
088h
089h
08ah
08bh
08ch
08dh
08eh
08fh
090h
091h
092h
093h
094h
095h
096h
097h
098h
099h
09ah
09bh
09ch
09dh
09eh
09fh
0a0h
0a1h
0a2h
0a3h
0a4h
0a5h
0a6h
0a7h
0a8h
0a9h
0aah
0abh
0ach
0adh
0aeh
0afh
0b0h
0b1h

001110000b
001110001b
001110010b
001110011b
001110100b
001110101b
001110110b
001110111b
001111000b
001111001b
001111010b
001111011b
001111100b
001111101b
001111110b
001111111b
010000000b
010000001b
010000010b
010000011b
010000100b
010000101b
010000110b
010000111b
010001000b
010001001b
010001010b
010001011b
010001100b
010001101b
010001110b
010001111b
010010000b
010010001b
010010010b
010010011b
010010100b
010010101b
010010110b
010010111b
010011000b
010011001b
010011010b
010011011b
010011100b
010011101b
010011110b
010011111b
010100000b
010100001b
010100010b
010100011b
010100100b
010100101b
010100110b
010100111b
010101000b
010101001b
010101010b
010101011b
010101100b
010101101b
010101110b
010101111b
010110000b
010110001b

0x70000000
0xe403c0f8
0x00128098
0x804040f9
0x03a2009d
0x00023298
0x80c07400
0x70000000
0xe403c0f8
0x00128098
0x804040f9
0x03e4009d
0x00023298
0x80c07b00
0x70000000
0xe403c0f8
0x00128098
0x0031209a
0x03e6009d
0x000000d9
0x0014329a
0x804040f9
0x00023298
0x80c082d9
0x804001f8
0x0012309a
0x0014329a
0xf010001a
0xe403c0f8
0x00128098
0x804040f9
0x03a8009d
0x00023298
0x80c08f00
0x70000000
0xe403c0f8
0x00128098
0x804040f9
0x03aa009d
0x00023298
0x80c09600
0x70000000
0xe403c0f8
0x00128098
0x804040f9
0x03ac009d
0x00023298
0x80c09d00
0x70000000
0xe403c0f8
0x00128098
0x804040f9
0x03ae009d
0x00023298
0x80c0a400
0x70000000
0xec000000
0x7031369d
0xec00fff8
0x00113099
0x0012329d
0x00123698
0x7014309d
0xec00fff8
0x00113099
0x0012309d

SHR6
SHL0
SHL1
SHL2
SHL3
SHL4
SHL5
SHL6
SHRA0
SHRA1
SHRA2
SHRA3
SHRA4
SHRA5
SHRA6
SHLA0
SHLA1
SHLA2
SHLA3
SHLA4
SHLA5
SHLA6
SHLA7
SHLA8
SHLA9
SHLA10
SHLA11
SHLA12
ROR0
ROR1
ROR2
ROR3
ROR4
ROR5
ROR6
ROL0
ROL1
ROL2
ROL3
ROL4
ROL5
ROL6
RORC0
RORC1
RORC2
RORC3
RORC4
RORC5
RORC6
ROLC0
ROLC1
ROLC2
ROLC3
ROLC4
ROLC5
ROLC6
MOV0
MOV1
MVBL0
MVBL1
MVBL2
MVBL3
MVBL4
MVBH0
MVBH1
MVBH2

CAR<-WB
R8<-03c0h,
SBR<-CAR+1,
R8<-R8 and IR
R9<-0040h
RD<-shl
RD, flags ZCN
R8<-R8-R9
!z?CAR<-SHL3
CAR<-WB
R8<-03c0h,
SBR<-CAR+1,
R8<-R8 and IR
R9<-0040h
RD<-shra
RD, flags ZCNO
R8<-R8-R9
!z?CAR<-SHRA3
CAR<-WB
R8<-03c0h,
SBR<-CAR+1,
R8<-R8 and IR
R10<-R0
RD<-shla
RD, flags ZCNO
R9<-RE
R10<-R10
or R9
R9<-0040h
R8<-R8-R9
R9<-RE,
!z?CAR<-SHLA3
R8<-1
R10<-R10
and R8
R10<-R10
or R9
RE<-R10,
CAR<-WB
R8<-03c0h,
SBR<-CAR+1,
R8<-R8 and IR
R9<-0040h
RD<-ror
RD, flags ZCN
R8<-R8-R9
!z?CAR<-ROR3
CAR<-WB
R8<-03c0h,
SBR<-CAR+1,
R8<-R8 and IR
R9<-0040h
RD<-rol
RD, flags ZCN
R8<-R8-R9
!z?CAR<-ROL3
CAR<-WB
R8<-03c0h,
SBR<-CAR+1,
R8<-R8 and IR
R9<-0040h
RD<-rorc
RD, flags ZCN
R8<-R8-R9
!z?CAR<-RORC3
CAR<-WB
R8<-03c0h,
SBR<-CAR+1,
R8<-R8 and IR
R9<-0040h
RD<-rolc
RD, flags ZCN
R8<-R8-R9
!z?CAR<-ROLC3
CAR<-WB
SBR<-CAR+1,
CAR<-F2
RD<-SD,
CAR<-WB
R8<-00ffh,
SBR<-CAR+1,
R9<-!R8
RD<-RD and R9
R8<-R8 and SD
RD<-RD or R8, CAR<-WB
R8<-00ffh,
SBR<-CAR+1,
R9<-!R8
RD<-RD and R8

39

CAR<-F1

CAR<-F1

CAR<-F1

CAR<-F1

CAR<-F1

CAR<-F1

CAR<-F1

CAR<-F2

CAR<-F2

178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243

0b2h
0b3h
0b4h
0b5h
0b6h
0b7h
0b8h
0b9h
0bah
0bbh
0bch
0bdh
0beh
0bfh
0c0h
0c1h
0c2h
0c3h
0c4h
0c5h
0c6h
0c7h
0c8h
0c9h
0cah
0cbh
0cch
0cdh
0ceh
0cfh
0d0h
0d1h
0d2h
0d3h
0d4h
0d5h
0d6h
0d7h
0d8h
0d9h
0dah
0dbh
0dch
0ddh
0deh
0dfh
0e0h
0e1h
0e2h
0e3h
0e4h
0e5h
0e6h
0e7h
0e8h
0e9h
0eah
0ebh
0ech
0edh
0eeh
0efh
0f0h
0f1h
0f2h
0f3h

010110010b
010110011b
010110100b
010110101b
010110110b
010110111b
010111000b
010111001b
010111010b
010111011b
010111100b
010111101b
010111110b
010111111b
011000000b
011000001b
011000010b
011000011b
011000100b
011000101b
011000110b
011000111b
011001000b
011001001b
011001010b
011001011b
011001100b
011001101b
011001110b
011001111b
011010000b
011010001b
011010010b
011010011b
011010100b
011010101b
011010110b
011010111b
011011000b
011011001b
011011010b
011011011b
011011100b
011011101b
011011110b
011011111b
011100000b
011100001b
011100010b
011100011b
011100100b
011100101b
011100110b
011100111b
011101000b
011101001b
011101010b
011101011b
011101100b
011101101b
011101110b
011101111b
011110000b
011110001b
011110010b
011110011b

0x00123699
0x7014329d
0xec000000
0x73c0369d
0xec000000
0x73c4369d
0xec000000
0x73c2369d
0xec000000
0x73c6369d
0xec000000
0x7292369d
0xec000000
0x7294369d
0xec000000
0x7296369d
0xec000000
0x73c2361d
0xec000000
0x7292361d
0x8340c900
0x8240c900
0x7000371c
0x70317680
0xec000000
0x00313a98
0x0031369d
0x0031309b
0x8000c600
0xec0010f8
0x000000da
0x0013b09a
0x00313a99
0x01f1209d
0x002c009b
0x8150d71a
0x0100329d
0x012c009d
0x00080098
0x80c0d400
0x012c009b
0x0200361d
0x8000c600
0xec0000d8
0x0000201b
0x80c0e300
0x804001f9
0x00143298
0x80100218
0x01c12099
0x0002361d
0x8140f500
0x00312098
0x000a0098
0x0122009b
0x8100ec00
0x0002361d
0x8100e700
0x002c009b
0x0102369d
0x8100f100
0x0000369d
0x01300010
0x002e0099
0x0020009b
0x00080098

MVBH3
MVBH4
ADD0
ADD1
ADDC0
ADDC1
SUB0
SUB1
SUBB0
SUBB1
AND0
AND1
OR0
OR1
XOR0
XOR1
CMP0
CMP1
TEST0
TEST1
WSD0
WSD1
WSD2
WSD3
XCH0
XCH1
XCH2
XCH3
XCH4
MUL0
MUL1
MUL2
MUL3
MUL4
MUL5
MUL6
MUL7
MUL8
MUL9
MUL10
MUL11
MUL12
MUL13
DIV0
DIV1
DIV2
DIV3
DIV4
DIV5
DIV6
DIV7
DIV8
DIV9
DIV10
DIV11
DIV12
DIV13
DIV14
DIV15
DIV16
DIV17
DIV18
DIV19
DIV20
DIV21
DIV22

R9<-R9 and SD
RD<-RD or R9, CAR<-WB
SBR<-CAR+1,
CAR<-F2
RD<-RD+SD,
flags ZCNO, CAR<-WB
SBR<-CAR+1,
CAR<-F2
RD<-RD+SD+C,
flags ZCNO, CAR<-WB
SBR<-CAR+1,
CAR<-F2
RD<-RD-SD,
flags ZCNO, CAR<-WB
SBR<-CAR+1,
CAR<-F2
RD<-RD-SD-C,
flags ZCNO, CAR<-WB
SBR<-CAR+1,
CAR<-F2
RD<-RD and SD, flags ZN, CAR<-WB
SBR<-CAR+1,
CAR<-F2
RD<-RD or SD, flags ZN, CAR<-WB
SBR<-CAR+1,
CAR<-F2
RD<-RD xor SD, flags ZN, CAR<-WB
SBR<-CAR+1,
CAR<-F2
RD<-RD-SD,
flags ZCNO, CAR<-WB
SBR<-CAR+1,
CAR<-F2
RD<-RD and SD, flags ZN, CAR<-WB
!S?CAR<-WSD3
(mode on RD)
!M0?CAR<-WSD3
(mode REG or IMM)
M[EA]<-SD,
CAR<-WB
(mode MEM)
R[!WBR]<-SD,
CAR<-WB
(mode REG)
SBR<-CAR+1,
CAR<-F2
R8<-RD
RD<-SD
SD<-R8
CAR<-WSD0
R8<-16,
SBR<-CAR+1,
CAR<-F2
R10<-RE
R10<-R10
and R8
(flag E)
R9<-RD
RD<-R0,
flags CNO (clear flags)
SD<-rorc
SD
RE<-R10,
!c?CAR<-MUL8
RD<-RD+R9,
flag C
RD<-rorc
RD, flag C
R8<-R8-1
!z?CAR<-MUL5
SD<-rorc
SD, flag C (C=0)
RD+SD, flag Z
CAR<-WSD0
R8<-RE,
SBR<-CAR+1,
CAR<-F2
SD<-SD+R0
!z?CAR<-DIV6
R9<-0001
(divisao
por 0!)
R8<-R8 or R9
RE<-R8,
CAR<-IH0
(O<-1)
R9<-R0+R0,
flags CNO (clear flag)
RD-SD
!c?CAR<-DIV24
(result=0)
R8<-R0
R8<-R8+1
SD<-shl
SD, flag C
c?CAR<-DIV15
RD-SD
c?CAR<-DIV10
SD<-rorc
SD
RD<-RD-SD,
flag C
c?CAR<-DIV20
RD<-RD+SD
(<0:repoe)
R0, flag C
(C<-0)
R9<-rolc
R9
SD<-shr
SD
R8<-R8-1

40

244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273

0f4h
0f5h
0f6h
0f7h
0f8h
0f9h
0fah
0fbh
0fch
0fdh
0feh
0ffh
100h
101h
102h
103h
104h
105h
106h
107h
108h
109h
10ah
10bh
10ch
10dh
10eh
10fh
110h
111h

(livre

011110100b
011110101b
011110110b
011110111b
011111000b
011111001b
011111010b
011111011b
011111100b
011111101b
011111110b
011111111b
100000000b
100000001b
100000010b
100000011b
100000100b
100000101b
100000110b
100000111b
100001000b
100001001b
100001010b
100001011b
100001100b
100001101b
100001110b
100001111b
100010000b
100010001b

do endereco

0x80c0ed00
0x00313a9b
0x0331329d
0x8000c600
0x83c00200
0x80403ff8
0x0013b099
0x804020fa
0x0012329a
0x80810000
0x00100098
0x00143099
0x0000329f
0x80000200
0xe4000000
0x00313a9f
0x80000200
0xe4000000
0x83c00200
0x00313a9f
0x80000200
0xe4000000
0x00083f9e
0x00313a9f
0x80000200
0xe4000000
0x83c00200
0x00083f9e
0x00313a9f
0x80000200
274

DIV23
DIV24
DIV25
DIV26
BR.C0
BR0
BR1
BR2
BR3
BR4
BR5
BR6
BR7
BR8
JMP0
JMP1
JMP2
JMP.C0
JMP.C1
JMP.C2
JMP.C3
CALL0
CALL1
CALL2
CALL3
CALL.C0
CALL.C1
CALL.C2
CALL.C3
CALL.C4

!z?CAR<-DIV16
SD<-RD
RD<-R9,
flags ZC
CAR<-WSD0
!COND?CAR<-IH0
R8<-003fh
R9<-R8 and RI
R10<-0020h
(teste
R10<-R10
and R9
z?CAR<-BR7
R8<-not
R8
R9<-R9 or R8
PC<-PC+R9
CAR<-IH0
SBR<-CAR+1,
CAR<-F1
PC<-RD
CAR<-IH0
SBR<-CAR+1,
CAR<-F1
!COND?CAR<-IH0
PC<-RD
CAR<-IH0
SBR<-CAR+1,
CAR<-F1
M[SP]<-PC,
SP<-SP-1
PC<-RD
CAR<-IH0
SBR<-CAR+1,
CAR<-F1
!COND?CAR<-IH0
M[SP]<-PC,
SP<-SP-1
PC<-RD
CAR<-IH0

ao 511)

41

do sinal)



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.2
Linearized                      : No
Page Count                      : 41
Producer                        : GNU Ghostscript 7.07
EXIF Metadata provided by EXIF.tools

Navigation menu