Você está na página 1de 0

5-1

Captulo
CINCO
Computador hipottico Ahmes
O computador AHMES
1
foi criado com intenes didticas, para possibilitar a
implementao de rotinas aritmticas simples (como adio e subtrao) e a programao de
rotinas relativamente complexas (como multiplicao e diviso). compatvel com o
NEANDER, mas apresenta instrues extras para facilitar a execuo de operaes
aritmticas.
5. 1 Caractersticas
O computador AHMES tem as seguintes caractersticas:
Largura de dados e endereos de 8 bits.
Dados representados em complemento de dois.
1 acumulador de 8 bits (AC), onde armazenado o resultado das operaes.
1 apontador de programa de 8 bits (PC), que indica qual a prxima instruo a ser
executada.
1 registrador de estado com 5 cdigos de condio: negativo (N), zero (Z), carry
out (vai-um) (C), borrow out (empresta-um) (B) e overflow (estouro) (V).
5. 2 Modos de endereamento
O AHMES s possui um modo de endereamento: o modo direto. Neste modo, a palavra
que segue o cdigo da instruo contm, nas instrues de manipulao de dados, o
endereo do operando (Figura 5.1). Nas instrues de desvio, o endereo contido na
instruo corresponde ao endereo da prxima instruo.
endereo
memria
operando
instruo
Figura 5.1 - Modo de endereamento direto

1
Este computador simulado foi batizado em homenagem ao escriba Ahmes, do antigo Egito (1650 A.C.),
autor de uma srie de papiros contendo regras que possibilitavem clculos aritmticos complexos, como o
clculo de rea de polgonos e manipulao de fraes.
5-2
5. 3 Conjunto de instrues
O conjunto de instrues de AHMES compreende 24 instrues, codificadas atravs de um
byte de cdigo (Tabela 5.1). Note-se que, na maioria das vezes, os quatro bits mais
significativos so suficientes para definir completamente a instruo.
Cdigo binrio
(relevante)
Cdigo binrio
(com zeros)
Cdigo
hexadecimal
Cdigo
decimal
Instruo
(mnemnico)
0000 xxxx 0000 0000 0 0 0 NOP
0001 xxxx 0001 0000 1 0 16 STA end
0010 xxxx 0010 0000 2 0 32 LDA end
0011 xxxx 0011 0000 3 0 48 ADD end
0100 xxxx 0100 0000 4 0 64 OR end
0101 xxxx 0101 0000 5 0 80 AND end
0110 xxxx 0110 0000 6 0 96 NOT
0111 xxxx 0111 0000 7 0 112 SUB end
1000 xxxx 1000 0000 8 0 128 JMP end
1001 00xx 1001 0000 9 0 144 JN end
1001 01xx 1001 0100 9 4 148 JP end
1001 10xx 1001 1000 9 8 152 JV end
1001 11xx 1001 1100 9 C 156 JNV end
1010 00xx 1010 0000 A 0 160 JZ end
1010 01xx 1010 0100 A 4 164 JNZ end
1011 00xx 1011 0000 B 0 176 JC end
1011 01xx 1011 0100 B 4 180 JNC end
1011 10xx 1011 1000 B 8 184 JB end
1011 11xx 1011 1100 B C 188 JNB end
1110 xx00 1110 0000 E 0 224 SHR
1110 xx01 1110 0001 E 1 225 SHL
1110 xx10 1110 0010 E 2 226 ROR
1110 xx11 1110 0011 E 3 227 ROL
1111 xxxx 1111 0000 F 0 240 HLT
Tabela 5.1 - Conjunto de instrues do AHMES
A primeira coluna da Tabela 5.1 indica, em binrio, quais so os bits relevantes da
codificao. Somente os bits indicados em zero e em um so relevantes para identificar a
instruo. Os bits marcados com um x so irrelevantes (dont care), ou seja, seu valor no
interfere na decodificao da instruo. Por simplicidade, todos os x sero substitudos por
zeros, como pode ser visto nas demais colunas.
A ltima coluna indica o mnemnico da instruo, ou seja, uma sigla de duas ou trs letras
que visa facilitar a compreenso da instruo por um ser humano. Para o computador estes
mnemnicos so desnecessrios, uma vez que ele sempre trabalha com cdigos binrios.
Note-se inclusive que os prprios cdigos hexadecimal e decimal tambm s so usados para
a convenincia humana.
A Tabela 5.2 mostra a execuo de cada instruo, tal como ela realizada pelo computador.
Nesta tabela, AC representa o acumulador, PC representa o program counter (apontador
de instrues), end indica um endereo de memria, MEM(end) o contedo da posio de
memria endereada por end, e N, V, Z, C e B indicam os cdigos de condio negativo,
overflow, zero, carry e borrow, respectivamente.
As instrues podem ser divididas em diversas classes ou categorias, de acordo com a sua
funo principal. As instrues STA e LDA formam o grupo de movimentao de dados, ou
seja, so responsveis por levar os dados de e para a memria. As instrues ADD e SUB so
as instrues aritmticas, e as instrues OR, AND e NOT formam o grupo das instrues
5-3
lgicas, uma vez que usam operaes da lgebra booleana (mas manipulando oito bits de
cada vez, e no um s bit). As instrues JMP, JN, JP, JV, JNV, JZ, JNZ, JC, JNC, JB e JNB so
as instrues de desvio, e nelas end corresponde ao endereo de desvio, ou seja, qual o
endereo da prxima instruo a ser executada. As instrues SHR, SHL, ROR e ROL so as
instrues de deslocamento.
Instruo Execuo Comentrio
NOP nenhuma operao nenhuma operao
STA end MEM(end) AC armazena acumulador na memria (store)
LDA end AC MEM(end) carrega acumulador da memria (load)
ADD end AC AC + MEM(end) soma
OR end AC AC or MEM(end) ou lgico
AND end AC AC and MEM(end) e lgico
NOT AC NOT AC inverte (complementa) acumulador
SUB end AC AC MEM(end) subtrao
JMP end PC end desvio incondicional (jump)
JN end IF N=1 THEN PC end desvio condicional (jump if negative)
JP end IF N=0 THEN PC end desvio condicional (jump if positive)
JV end IF V=1 THEN PC end desvio condicional (jump if overflow)
JNV end IF V=0 THEN PC end desvio condicional (jump if not overflow)
JZ end IF Z=1 THEN PC end desvio condicional (jump if zero)
JNZ end IF Z=0 THEN PC end desvio condicional (jump if non-zero)
JC end IF C=1 THEN PC end desvio condicional (jump if carry)
JNC end IF C=0 THEN PC end desvio condicional (jump if not carry)
JB end IF B=1 THEN PC end desvio condicional (jump if borrow)
JNB end IF B=0 THEN PC end desvio condicional (jump if not borrow)
SHR CAC(0); AC(i-1)AC(i); AC(7) 0 deslocamento para direita (shift right)
SHL CAC(7); AC(i)AC(i-1); AC(0)0 deslocamento para esquerda (shift left)
ROR CAC(0); AC(i-1)AC(i); AC(7)C rotao para direita (rotate right)
ROL CAC(7); AC(i)AC(i-1); AC(0)C rotao para esquerda (rotate left)
HLT Interrompe o processamento trmino de execuo - (halt)
Tabela 5.2 - Aes executadas
5. 4 Cdigos de condio
A unidade lgica e aritmtica de AHMES fornece os seguintes cdigos de condio, que so
usados pelas instrues de desvio condicional (conforme Tabela 5.2):
N - (negativo) : sinal do resultado, interpretado como complemento de dois
1 - resultado negativo
0 - resultado positivo
Z - (zero) : indica resultado igual a zero, interpretado como complemento de dois
1 - resultado igual a zero
0 - resultado diferente de zero
V - (overflow) : indica estouro de representao aps uma instruo de soma ou
subtrao, interpretando os operandos e o resultado como complemento
de dois
1 - houve estouro de representao do resultado
0 - no houve estouro (resultado est correto)
C - (carry) : indica a existncia de um vai-um aps uma operao de soma
1 - ocorreu vai-um
5-4
0 - no ocorreu vai-um
B - (borrow) : indica a existncia de um empresta-um aps uma operao de subtrao
1 - ocorreu empresta-um
0 - no ocorreu empresta-um
As instrues do AHMES afetam os cdigos de condio conforme indicado na Tabela 5.3.
Note-se que somente as instrues aritmticas, lgicas e de deslocamento (alm da instruo
LDA) afetam os cdigos de condio. As instrues de desvio (e a instruo STA), apesar de
testarem este cdigos, no os alteram.
Instruo Cdigos alterados
NOP nenhum
STA end nenhum
LDA end N, Z
ADD end N, Z, V, C
OR end N, Z
AND end N, Z
NOT N, Z
SUB end N, Z, V, B
JMP end desvio incondicional - nenhum
Jxxx end desvios condicionais - nenhum
SHR N, Z, C
SHL N, Z, C
ROR N, Z, C
ROL N, Z, C
HLT nenhum
Tabela 5.3 - Cdigos de condio ajustados
Observao: como o AHMES um computador com propsitos didticos, os seus cdigos
de condio no correspondem exatamente queles encontrados em um computador real.
Assim, por exemplo, borrow (B) e carry (C) so normalmente reunidos em um nico cdigo
de condio, chamado simplesmente de carry.
5. 5 Manipulao aritmtica
Nos trechos de programas apresentados a seguir e nos captulos seguintes ser utilizada a
notao simblica, com mnemnicos no lugar de cdigos decimais ou hexadecimais. No
simulador AHMES, entretanto, a codificao dever necessariamente ser realizada em forma
numrica. Esta restrio tambm possui caracter didtico, para que a linguagem de
mquina do computador seja bem exercitada.
5. 5. 1 Aritmtica em complemento de dois
AHMES trabalha naturalmente com complemento de dois (os seus componentes de hardware
foram projetados para isto). Assim, somas e subtraes so realizadas diretamente atravs
das instrues de ADD e SUB. Os cinco cdigos de condio (N, Z, V, C e B) tambm
refletem diretamente o resultado destas instrues.
Para inverter o sinal de nmero, existem duas possibilidades. Seja a o nmero a ter seu
sinal trocado. Ento tem-se:
1. Realizar a operao 0 a, atravs da operao SUB. Isto exige carregar zero no
acumulador e depois subtrair o nmero a. O resultado est no acumulador.
5-5
2. Realizar a operao not(a) + 1. Isto utiliza a troca de sinal em complemento de um (que
inverte todos os bits do nmero, e implementado atravs da operao NOT) e a
seguir soma um para obter o complemento de dois:
not(a) = a 1 (em complemento de um)
not(a) + 1 = a 1 + 1 = a (em complemento de dois)
Sobre os cdigos de condio, algumas observaes importantes devem ser feitas:
1. Carry (C) e overflow (V) no so sinnimos. Conforme foi visto na seo 2.6, em
aritmtica de complemento de dois podem ocorrer as quatro combinaes possveis:
sem carry nem overflow, somente carry, somente overflow e tanto carry como
overflow. Isto pode ser verificado com um programa simples, como ilustrado a seguir.
LDA 128 % primeiro operando est na posio 128
ADD 129 % segundo operando est na posio 129
HLT % resultado est no acumulador
Experimente agora com diversos pares de operandos nos endereos 128 e 129:
1.1: 7 e 5, 15 e 12, 100 e 26, 110 e 17. Em todos estes casos, a soma no produz nem
carry nem overflow.
1.2: 7 e 251 (-5 em complemento de dois), 15 e 244 (-12 em complemento), 100 e 230
(-26), 110 e 239 (-17). Nestes casos, a soma produz carry (C=1), mas no overflow
(V=0). Isto indica que o resultado est correto. O mesmo ocorre para 249 e 251 (-7 e -
5 em complemento de dois), 241 e 244 (-15 e -12 em complemento de dois), 156 e
230 (-100 e -26), 146 e 239 (-110 e -17).
1.3: 127 e 5, 116 e 12, 100 e 28, 110 e 120. Nestes casos, no produzido carry
(C=0), mas ocorre overflow (V=1). Em todos os casos exemplificados, os operandos
so positivos, mas o resultado negativo, o que indica estouro de representao.
1.4: 128 e 251 (-128 e -5 em complemento de dois), 241 e 136 (-15 e -120 em
complemento de dois), 156 e 226 (-100 e -30), 146 e 238 (-110 e -18). Nestes casos,
ocorre tanto carry (C=1) como overflow (V=1). Em todos os casos exemplificados, os
operandos so negativos, mas o resultado positivo, o que indica estouro de
representao.
2. O sinal de carry, em mltiplas somas, cumulativo. Isto significa que, quando se
somam trs ou mais parcelas, o nmero de vai-uns deve ser contado, para determinar
qual a quantidade final (ou seja, se ocorreu um vai-dois, vai-trs, etc)
3. O sinal de overflow, em mltiplas somas, deve ser analisado cuidadosamente. Se o
overflow ocorrer um nmero mpar de vezes, ento garantido que ocorreu overflow
no resultado final. Se entretanto ocorrer overflow um nmero par de vezes, isto no
significa necessariamente que ocorreu estouro da representao do resultado final.
Seja, por exemplo, 127 + 1 + -1. Em complemento de dois, tem-se 01111111 +
00000001 + 11111111. A soma das duas primeiras parcelas resulta em 10000000,
com indicao de overflow. A soma seguinte, 1000000 + 11111111, resulta em
011111111, tambm com indicao de overflow. Neste caso, o resultado final est
correto (127 em decimal), e os dois sinais de overflow anulam-se mutuamente. No
caso de 127 + 127 + 127 + 127, entretanto, tambm ocorre overflow duas vezes, mas
o resultado final (252 em decimal, ou seja, -4) est incorreto, ou seja, realmente
ocorreu overflow.
4. O sinal de borrow o inverso do carry. Isto pode ser verificado comparando-se uma
operao de subtrao com uma adio com o complemento do subtraendo, ou seja, no
5-6
lugar de a b realiza-se a + not (b) + 1. Como pode ser visto na tabela abaixo, o carry
resultante sempre o inverso do borrow:
a + not(b) + 1 r carry a b r borrow
0 1 1 0 1 0 0 0 0
0 0 1 1 0 0 1 1 1
1 1 1 1 1 1 0 1 0
1 0 1 0 1 1 1 0 0
Assim, se o carry for um, significa que o borrow zero, e vice-versa. Isto pode ser
observado comparando-se o borrow (B) da operao 5 7 atravs de uma instruo
de SUB com o carry (C) gerado pela operao 5 + (-7) atravs de uma instruo de
ADD. Note-se que o AHMES gera carry e borrow em instrues distintas - o borrow
o da ltima operao de SUB, e o carry e o da ltima operao de ADD ou de
deslocamento. Assim, no AHMES, os indicadores de carry e borrow (C e B) no
possuem nenhuma relao entre si.
5. 5. 2 Aritmtica de inteiros positivos
Apesar de projetado para trabalhar com nmeros em complemento de dois, AHMES (e
tambm todos os processadores que utilizam complemento de dois) tambm pode manipular
nmeros inteiros positivos. As operaes de adio e subtrao (instrues ADD e SUB)
podem ser utilizadas sem restries ou modificaes, mas os cdigos de condio devem ser
analisados de forma diversa, conforme indicado a seguir:
1. O cdigo de sinal (N) no tem mais significado.
2. O cdigo de overflow (V) tambm perde o significado e no deve ser utilizado.
3. Os cdigos de carry (C) e borrow (B) mantm o seu significado original, e passam
adicionalmente a indicar tambm estouro de representao. Isto significa que a
indicao de carry aps uma soma (C=1 aps ADD) e borrow aps uma subtrao
(B=1 aps SUB) so sinnimos de estouro de representao.
4. O cdigo de zero (Z) mantm seu significado.
5. 5. 3 Aritmtica em complemento de um
A aritmtica em complemento de um em si bem semelhante de complemento de dois; a
diferena bsica est na representao de nmero negativos, que possuem a quantidade 1 a
mais. Isto permite que um computador projetado com aritmtica em complemento de dois
tambm possa manipular, com relativa facilidade, nmeros em complemento de um.
Conforme visto na seo 2.3.3, a soma de dois nmeros em complemento de um requer uma
eventual correo do resultado, atravs da soma do carry:
0 LDA 128 % primeiro operando est na posio 128
2 ADD 129 % segundo operando est na posio 129
4 JNC 8 % se no houve carry, resultado est correto
6 ADD 130 % posio 130 contm a constante 1
8HLT % resultado est no acumulador
De maneira anloga, a subtrao de dois nmeros em complemento de um tambm requer
uma eventual correo do resultado, subtraindo-se o borrow se este for um:
0 LDA 128 % primeiro operando est na posio 128
2 SUB 129 % segundo operando est na posio 129
5-7
4 JNB 8 % se no houve borrow, resultado est
correto
6 SUB 130 % posio 130 contm a constante 1
8HLT % resultado est no acumulador
Os cdigos de condio devem ser interpretados de maneira um pouco diversa:
1. O cdigo de zero (Z) somente detecta o zero positivo (00000000); o zero negativo
(11111111) deve ser testado parte e convertido para o zero positivo.
2. Os cdigos de sinal (N), carry (C), borrow (B) e overflow (V) mantm o seu
significado original, mas devem ser analisados aps a correo do resultado, ou seja,
aps as duas operaes de ADD ou SUB.
5. 5. 4 Aritmtica em sinal/magnitude
Um computador projetado para aritmtica em complemento de dois no manipula facilmente
nmeros em sinal/magnitude. As operaes de soma e subtrao necessitam de grandes
ajustes para serem efetuadas; no basta o simples uso das instrues de ADD e SUB. Alm
disto, os cdigos de condio no so de grande ajuda:
1. O cdigo de zero (Z) somente detecta o zero positivo (00000000); o zero negativo
(10000000) deve ser testado a parte.
2. O cdigo de overflow (V) no tem significado e no deve ser utilizado.
3. Os cdigos de carry (C) e borrow (B) tambm perdem seu significado original.
4. O cdigo de sinal (N) mantm seu significado e pode ser utilizado.
Basicamente o bit de sinal e os bits de magnitude devem ser isolados e tratados
separadamente. Para esta separao, podem ser utilizadas mscaras, como indicado na rotina
abaixo:
LDA 128 % operando est na posio 128
AND 131 % posio 131 contem 10000000 (para isolar o sinal)
STA 129 % posio 129 recebe o sinal
LDA 128 % carrega novamente o operando
AND 132 % posio 132 contem 01111111 (para isolar a magnitude)
STA 130 % posio 130 recebe os sete bits da magnitude
Uma vez isolados, sinal e magnitude podem ser manipulados individualmente, conforme a
tabela 2.4 do captulo 2, seo 2.3.2. Um eventual estouro de representao pode ser
detectado atravs do oitavo bit da magnitude (o bit de sinal do AHMES). Se este bit for
ligado aps uma soma, isto indica que a magnitude necessita de oito bits para ser
representada, ou seja, no pode mais ser representada somente com sete bits.
Aps a realizao da operao desejada, os bits de sinal e magnitude devem ser novamente
reunidos. Assumindo-se a mesma ocupao de memria do trecho de programa anterior,
tem-se a seguinte rotina:
LDA 130 % carrega a magnitude (oitavo bit em zero)
OR 129 % inclui o bit de sinal (no oitavo bit; demais esto em zero)
STA 128 % armazena o operando na posio 128

Você também pode gostar