Processador Neander
1
Introdução
Processador didático extremamente simples
Autores
Raul Weber (UFRGS) e Taisy Weber (UFRGS)
Simulador (moodle)
NeanderWin (free)
[Link]
Windows e Linux
Livro de referência
“Fundamentos de arquitetura
de computadores”
Raul Fernando Weber
Série de livros didáticos da UFRGS
2
Introdução
Características gerais
Barramentos de endereços/dados de 8 bits
Modelo de Von Neumann (espaço de endereçamento único)
Endereça até 256 (28) posições de memória (dados e programa)
Cada endereço corresponde a um byte da memória (byte addressing)
Registradores
Propósito geral
1 acumulador (AC) (8 bits) 8
Arquitetura baseada em acumulador 8
Específicos
1 apontador de programa (PC) (8 bits)
1 registrador de instruções (IR) (8 bits)
Códigos de condição (flags)
N: negativo (1 bit)
Z: zero (1 bit)
3
Conjunto de instruções (ISA)
11 instruções
end: endereço de memória
4
Conjunto de instruções (ISA)
11 instruções Acesso à memória
end: endereço de memória
5
Conjunto de instruções (ISA)
11 instruções Lógicas/aritméticas
end: endereço de memória
6
Conjunto de instruções (ISA)
11 instruções Desvio/Salto
end: endereço de memória
7
Conjunto de instruções (ISA)
Ações efetuadas por cada instrução
MEM: memória
AC: acumulador
Característica de
arquitetura
baseada em
acumulador.
Acumulador é
operando
implícito
8
Conjunto de instruções (ISA)
Formato das instruções
O Neander possui instruções de um ou dois bytes
8 bits
7 4 3 0
• Instruções de 1 byte
– NOT, NOP e HLT Código Don’t care
8 bits
• Instruções de 2 bytes 7 4 3 0
– STA, LDA, ADD, OR, Código Don’t care Byte 1
AND, JMP, JN e JZ
Endereço Byte 2
9
Conjunto de instruções (ISA)
Formato das instruções
O Neander possui instruções de um ou dois bytes
MEMÓRIA
Exemplo:
Montador
LDA 127 (Assembler) 0
ADD 128
1
NOT
HLT 2
3
4
5
6
7
10
Conjunto de instruções (ISA)
Formato das instruções
O Neander possui instruções de um ou dois bytes
MEMÓRIA
Exemplo:
Montador
LDA 127 (Assembler) 0 0010xxxx
ADD 128 LDA 127
1 01111111
NOT
HLT 2 0011xxxx
ADD 128
3 10000000
4 0110xxxx NOT
5 1111xxxx HLT As instruções
6 ocupam 6 bytes
na memória
7
11
Conjunto de instruções (ISA)
Modos de endereçamento
São diferentes maneiras de especificar a localização do(s)
operando(s) de uma instrução
Neander suporta somente modo direto (absoluto)
Instruções: LDA, STA, ADD, OR e AND
Endereço que segue a instrução aponta diretamente a posição de
memória a ser acessada (leitura/escrita)
MEMÓRIA
Exemplo:
LDA 6 0 LDA
1 6
Endereço do operando
2
AC ← MEM(6) 3
4
5
AC ← 100
6 100
Conjunto de instruções (ISA)
Modos de endereçamento
Instruções de salto/desvio: JMP, JN e JZ
Endereço que segue a instrução aponta diretamente o
endereço da próxima instrução a ser executada
MEMÓRIA
Exemplo: 0 JMP
JMP 5
1 5
LDA 45
NOT 2 LDA
STA 32 3 45
HLT
4 NOT
5 STA
6 32
7 HLT
Conjunto de instruções (ISA)
Modos de endereçamento
Instruções de salto/desvio: JMP, JN e JZ
Endereço que segue a instrução aponta diretamente o
endereço da próxima instrução a ser executada
MEMÓRIA
Exemplo: 0 JMP
JMP 5 Execução:
1 5 JMP 5
LDA 45
NOT 2 LDA STA 32
STA 32 HLT
3 45
HLT
4 NOT
5 STA As instruções
ocupam 8 bytes
6 32
na memória
7 HLT
Conjunto de instruções (ISA)
Códigos de condição (flags)
O Neander possui flip-flops para armazenar os códigos de
condição N e Z gerados pela ULA, os quais são utilizados
pelas instruções JZ e JN
Estes flip-flops são atualizados somente pela execução
das instruções lógicas/aritméticas (ADD, NOT, AND e OR)
e a instrução de acesso à memória LDA
Referem-se ao valor atual do registrador acumulador (AC)
N: negativo considerando a codificação em complemento de 2 (MSb = 1)
As demais instruções do ISA não alteram estes flip-flops
As instruções de salto condicional JN e JZ dependem do
valor dos flags N e Z, respectivamente
JN: jump if N = 1 (AC < 0, codificação em complemento de 2)
JZ: jump if Z = 1 (AC = 0)
Caso a condição de salto seja falsa (N=0 ou Z=0), a próxima
instrução a ser executada é aquela imediatamente após a instrução
de salto (JN ou JZ)
Conjunto de instruções (ISA)
Códigos de condição (flags)
Instrução de desvio condicional JN
Exemplo: trecho de programa MEMÓRIA
... 9 ... Execução se N = 1:
JN 15 ...
10 JN
LDA 45 JN 15
NOT 11 15 STA 32
Execução se N = 0:
STA 32 12 LDA HLT
...
HLT
JN 15 13 45
LDA 45
14 NOT
NOT
STA 32 15 STA
HLT 16 32
17 HLT
Programação assembly
A linguagem assembly do processador Neander
é baseada no seu ISA
NOP, STA, LDA, ADD, OR, AND, NOT, JMP, JN, JZ, HLT
Linguagens assembly são sempre case
insensitive
ADD = Add = add
A tradução do programa assembly em código
binário (linguagem de máquina) é feita pelo
montador (assembler)
O simulador NeanderWin realiza a montagem e
a simulação de programas assembly
Programação assembly
Exemplo 1: Versão 1
Programa que soma o conteúdo de 3 posições de
memórias consecutivas (128, 129 e 130) e armazena
o resultado na posição seguinte (131)
LDA 128 ; Acumulador (AC) recebe conteúdo do endereço 128
ADD 129 ; Conteúdo do AC é somado ao conteúdo do endereço 129
ADD 130 ; Conteúdo do AC é somado ao conteúdo do endereço 130
STA 131 ; Valor do AC é armazenado no endereço 131
HLT ; Pára o processador
MEMÓRIA
127 ...
128 1
129 2
Comentários sintáticos (inútil) 130 3
131
132 ...
Programação assembly
Exemplo 1: Versão 1
Programa que soma o conteúdo de 3 posições de
memórias consecutivas (128, 129 e 130) e armazena
o resultado na posição seguinte (131)
LDA 128 ; AC ← MEM(128)
ADD 129 ; AC ← AC + MEM(129)
ADD 130 ; AC ← AC + MEM(130)
STA 131 ; MEM(131) ← AC
HLT ; Pára o processador
Comentários sintáticos são
inúteis porque são sempre
iguais, independente da
finalidade do programa
Comentários sintáticos (inútil)
Programação assembly
Exemplo 1: Versão 1
Programa que soma o conteúdo de 3 posições de
memórias consecutivas (128, 129 e 130) e armazena
o resultado na posição seguinte (131)
LDA 128 ; Lê o primeiro valor
ADD 129 ; Soma o primeiro valor com o segundo valor
ADD 130 ; Soma os três valores
STA 131 ; Armazena o resultado do somatório na posição seguinte
HLT ; Pára o processador
Comentários semânticos
Programação assembly
Exemplo 1: Versão 1
Gerar código hexadecimal relativo ao programa abaixo
Considerar don’t care como 0s
Montador
LDA 128 (Assembler)
ADD 129
ADD 130
STA 131
HLT
Programação assembly
Exemplo 1: Versão 1
Gerar código hexadecimal relativo ao programa abaixo
Considerar don’t care como 0s
MEMÓRIA
Montador 0 00100000
LDA 128 (Assembler) 20h 80h (LDA 128)
1 10000000
ADD 129
ADD 130 2 00110000
30h 81h (ADD 129)
STA 131 3 10000001
HLT
4 00110000
30h 82h (ADD 130)
5 10000010
6 00010000
10h 83h (STA 131)
7 10000011
8 11110000 F0h (HLT)
Programação assembly
Exemplo 1: Versão 1
NeanderWin