Artigo Original: Wilson Pilon
Números decimais, debug, aritmética hexa, convertendo de hexa para decimal, números hexa de cinco dígitos, convertendo de decimal para hexa, números negativos, bits/bytes/palavras e notação binária, complemento de dois (um tipo estranho de número negativo) são os tópicos abordados neste capítulo.
Vamos começar nossa jornada pela linguagem, como os computadores contam. Isso pode parecer muito simples. Afinal de contas, contamos até 11 começando em um e aumentando passo a passo: 1,2, 3, 4, 5, 6, 7, 8, 9, 10, 11.
Mas um computador não conta assim. Ao invés disso, ele conta até cinco da seguinte maneira: 1, 10, 11, 100, 101. Os números 10, 11 , 100, e assim por diante, são números binários, baseados em um sistema de numeração com apenas dois dígitos, um e zero, ao invés dos dez associados ao nosso sistema decimal mais familiar. Assim sendo, o número binário 10 é equivalente ao número decimal que conhecemos como dois.
Os números binários nos interessam porque eles são a forma usada pelo microprocessador Z80 dentro do seu MSX. Mas, embora os computadores trabalhem somente com séries de zeros e uns, eses números são muito difíceis de escrever. A solução? Números hexadecimais - uma forma mais compacta de se escrever os números binários. Neste capítulo, aprenderemos os dois modos de se escrever os números: hexadecimal e binário. E enquanto você aprende sobre a contagem por computadores, você também aprenderá como eles armazenam os números - em bits, bytes e words (palavras).
Se você já sabe sobre números binários e hexadecimais, bits, bytes e words, você pode saltar para o resumo do capítulo.
Números Hexadecimais
Como os números hexadecimais são mais fáceis de se lidar do que os números binários - pelo menos em termos de tamanho -, começaremos com o hexadecimal (hexa, para abreviar), e usaremos o Super-X, um programa que você encontrará no disco disponibilizado no artigo introdutório. Usaremos o Super-X aqui e nos capítulos seguintes para entrar e executar programas em linguagem de máquina em uma instrução de cada vez. Assim como o BASIC, o Super-X fornece um ambiente interativo. Mas diferente do BASIC, ele não conhece os números decimais em todos os seus modos (no modo monitor, ele espera sempre hexadecimal, e no modo assemblador, espera decimal ou hexa/binário com indicação). Para o Super-X, no modo monitor, o número 10 é um número hexa - e não dez. E como o Super-X usa muito a notação hexa, você precisa aprender algo sobre os números hexa. Mas primeiro vamos sair um pouco da rota e ver algo sobre o próprio Super-X (um tutorial detalhado sobre o Super-X, pode ser encontrado neste artigo).
Super-X
O Super-X é um programa do tipo "debug", porque este tipo de programa recebe este nome? Os bugs, no mundo de computador, são erros nos programas. Um programa de trabalho não possui bugs (em termos, hoje sabemos que na pressa de lançar seus produtos, e pela complexidade dos mesmos, acabam lançando mesmo com bugs, ocore que estes são bugs desconhecidos, ao longo do uso novos bugs vão aparecendo e patchs vão sendo lançados para corrigí-los), enquanto um programa em desenvolvimento possui pelo menos um (conhecido). Usando um debug para executar um programa uma instrução de cada vez, e verificando como o programa funciona, podemos encontrar e corrigir os erros. Isto é conhecido como debugging (ou depuração), e daí o nome debug.
De acordo com o folclore de computador, o termo debugging vem dos primórdios da computação e em particular, um dia em que o computador Mark I, em Harvard, teve uma falha. Após uma longa busca, os técnicos descobriram a fonte de seus problemas: uma pequena mariposa presa entre os contatos de um relé. Os técnicos removeram o inseto (bug) e escreveram uma nota no diário sobre o debugging do Mark I. Mais informações podem ser obtidas neste site, logo após a quarta foto.
Encontre o Super-X no disco e vamos começar. Você pode utilizar um disco de trabalho com uma cópia do Super-X nele. O Super-X requer alguns arquivos (mais detalhes no tutorial mencionado anteriormente), mas para executá-lo precisamos do "super-x.bat" ou do "super-x.bas" se estiver usando o MSX-DOS ou o MSX-BASIC, e iremos utilizá-lo bastante na parte 1 deste tutorial.
Inicie o Super-X a partir do MSX-DOS do disco disponibilizado:
A>super-x
e em seguida:
CALL @
A tela de apresentação será mostrada e um prompt (A>) será mostrado indicando que o Super-X está esperando por um comando.
Para deixar o Super-X e retornar ao MSX-BASIC, digite somente QT (Quit - Encerrar) após o prompt e pressione [RETURN]. Tente encerrar agora, se quiser, e depois retorne ao Super-X (como você está em MSX-BASIC, basta comandar um novo CALL @)
Agora, podemos continuar aprendendo sobre os números hexadecimais.
Aritmética Hexa
Usaremos um comando do Super-X chamado CL. CL é a abreviação de "Calculation" e, como o nome sugere, ele efetua cálculos entre números. Por padrão ele usa números decimais, porém aceita números binários ou hexadecimais devidamente identificados. Vejamos como o CL trabalha com 2 + 3. Sabemos que 2 + 3 = 5 para números decimais. Isto também é verdade para números hexadecimais? Assegure-se de ainda estar no Super-X e, no prompt de comando, digite o seguinte texto (sem espaços entre os operandos, apenas um espaço entre o comando e os mesmos):
CL 2H+3H
O Super-X imprime a soma dos valores hexadecimais (indicados por H), mostrando o resultado em Hexadecimal, Binário, Decimal sem sinal e Decimal com sinal. E até aqui os resultados são os mesmos para números decimais e hexadecimais: 5 é a soma de 3 + 2 em decimal.
Comande agora:
CL 2D5C0-2A10
Veja que o resultado é o esperado.
Mas as vezes você pode encontrar algumas surpresas. Por exemplo se digitarmos
CL 2H+3H
e em seguida
CL 2H-3H
obteremos FFFF ao invés de -1 para 2-3. Por mais estranho que pareça, no entanto, FFFF é um número. De fato ele é o número -1 em hexadecimal.
Voltaremos a este -1 incomum brevemente. Mas primeiro vamos explorar o mundo dos números um pouco maiores para ver como um F pode aparecer em um número.
Para ver o que o comando CL faz com números maiores, vamos tentar nove mais um (em hexa).
CL 9H+1H
Se fosse uma operação decimal, esperariamos 10 como resposta, porém Nove mais um é igual a A? Correto: A é o número hexa correspondente a dez. Agora, e se tentarmos para um número ainda maior?
CL 9H+6H
Se você tentar outros números entre dez e quinze, você terá 16 dígitos completos - de 0 a F (de 0 a 9, e de A a F). O nome hexadecimal vem de hexa(6) mais deca(10) que, quanto combinados, representam 16. Os dígitos de 0 a 9 são os mesmos em hexadecimal e decimal, os dígitos hexa de A a F são equivalentes aos decimais de 10 a 15.
Porque o Super-X aceita hexadecimal? Logo você verá que podemos escrever 256 valores diferentes com dois dígitos hexa. Como você já pode ter notado, 256 possui alguma relação com a unidade conhecida como byte, e o byte desempenha um papel muito importante nos computadores e neste tutorial. Você descobrirá mais sobre os bytes no final deste capítulo, mas por enquanto vamos nos concentrar em aprender sobre hexadecimais, o mais usado sistema numérico no Super-X e em linguagem de máquina, e a matemática hexa.
Convertendo Hexadecimal em Decimal
Até aqui vimos os números hexa de um dígito. Agora, veremos como representar números hexa maiores, e como converter estes números para números decimais.
Assim como nos números decimais, montamos os números hexa de múltiplos dígitos adicionando mais dígitos à esquerda. Suponha, por exemplo, que somamos o número 1 ao maior número de um dígito no sistema decimal, 9. O resultado é um número de dois dígitos, 10 (dez). O que acontece quando somamos 1 ao maior número hexa de um dígito, F? Obtemos 10 novamente.
Mas espere, dez em hexa é na verdade 16, e não dez. Isto pode estar ficando um tanto confuso. Precisamos de algum modo de distinguir estes dois dez, de modo que daqui para frente colocaremos a letra H após qualquer número hexa. Asim, nós saberemos que 10H é 16 em hexadecimal, e 10 é o decimal 10. Adicionalmente, quando um número hexa comecar por A, B, C, D, E ou F, colocaremos um 0 antes, assim trabalhamos já no padrão do Super-X e do Mega Assembler, por exemplo 0FH, 34H, 0A5H. Vale lembrar que, por exemplo, o Compass usa o prefixo # para representar números hexa, sem necessidade de iniciar com 0, como por exemplo #F, #34 ou #A5.
Números Hexadecimais:
Decimal | Dígito Hexa |
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
10 | A |
11 | B |
12 | C |
13 | D |
14 | E |
15 | F |
Agora chegamos ao ponto de como converter números entre hexa e decimal. Sabemos que 10H é 16, mas como convertemos um número hexa maior, como 0D3H, para um número decimal sem termos que contar até 0D3H a partir de 10H? Ou então, como converter o número decimal 173 para hexa?
Podemos contar com a ajuda do Super-X, já que o comando CL aceita números decimais, porém é importante entender a mecânica desta conversão. Iremos, num capítulo mais adiante, escrever um programa para converter um número hexa para a notação decimal, para que nossos porgramas possam falar conosco em decimal. Mas agora, teremos que fazer estas conversões a mão. Vamos começar retornando ao noso conhecido mundo decimal.
O que significa o número 276? No colégio, aprendemos que 276 significa que temos duas centenas, sete dezenas e seis unidades. Ou, esquematicamente:
2 | x | 100 | = | 200 |
7 | x | 10 | = | 70 |
6 | x | 1 | = | 6 |
--------- 276 | = | ---- 276 |
Bem, isto certamente nos ajuda a visualizar o significado desses dígitos. Podemos usar o mesmo método esquemático para um número hexadecimal? Claro.
Considere o número 0D3H que mencionamos anteriormente. D é o dígito hexadecimal 13, e há 16 dígitos hexa, versus 10 para o decimal, de modo que 0D3H é 13 dezesseis e 3 unidades. Ou, se forma esquemática:
D | → | 13 | x | 16 | = | 208 | |
3 | → | 3 | x | 1 | = | 3 | |
D3H | = | 211 |
Para o número decimal 276, multiplicamos os dígitos por 100, 10 e 1, para o número hexa 0D3H, multiplicamos os dígitos por 16 e 1. Se tivessémos quatro dígitos, teriamos multiplicado por 1000, 100, 10 e 1. Quais os quatro números com que multiplicaríamos um número hexa de quatro dígito?
Para decimal, os número 1000, 100, 10 e 1 são todos potências de 10:
10 elevado a 3 | = | 1000 |
10 elevado a 2 | = | 100 |
10 elevado a 1 | = | 10 |
10 elevado a 0 | = | 1 |
Podemos usar exatamente o mesmo método para os dígitos hexa, mas como potências de 16, ao invés de 10, de modo que os nossos quatro números seriam:
16 elevado a 3 | = | 4096 |
16 elevado a 2 | = | 256 |
16 elevado a 1 | = | 16 |
16 elevado a 0 | 0 | 1 |
Vamos converter o número 3AC8H em decimal usando os quatro números calculados acima:
3 | → | 3 | x | 4096 | = | 12288 | |||
A | → | 10 | x | 256 | = | 2560 | |||
C | → | 12 | x | 16 | = | 192 | |||
8 | → | 8 | x | 1 | = | 9 | |||
3AC8H | = | 15048 |
Outras conversões de Hexadecimal para Decimal:
7 →7x16=112 |
C→12x1=12 |
7Ch = 124 |
3 →3x256=768 |
F →15x16=240 |
9→9x1=9 |
3F9H = 1017 |
A →10x4096=40960 |
F →15x256=3840 |
1 →1x16=16 |
C→12x1=12 |
AF1CH = 44828 |
3 →3x65536=196608 |
B →11x4096=45056 |
8 →8x256=2048 |
D →13x16=208 |
2→2x1=2 |
3B8D2H = 243922 |
Agora vamos descobrir o que acontece quando somamos números hexa que tenham mais que um dígito. Para isto, usaremos o Super-X e os números 3A7H e 1EDH:
CL 3A7H+1EDH
Assim, vemos que 3A7H + 1EDH = 594H. Você pode checar os resultados convertendo estes números para decimal e fazendo a soma em formato decimal, se você for mais aventuroso, faça os cálculos diretamente em hexa.
ais exemplos de Adição em Hexa:
Números Hexa de Cinco Dígitos
Até aqui, a matemática em hexa tem sido direta. O que acontece quando tentamos somar números hexa maiores? Vamos tentar um número hexa de cinco dígitos:
CL 5C3F0H+4BC6H
Esta é uma resposta inesperada. Por que o Super-X diz que há um erro aqui? A razão tem a ver com uma unidade de armazenamento chamada word (palavra). A hexaritmética do Super-X trabalha somente com quatro dígitos hexa. Assim, se você tentar somar dois números hexa de quatro dígitos, tais como 0C000H e 0D000H (que deveria dar 19000H), você terá 9000H.
O Super-X retém somente os quatro dígitos da direita da resposta.
Convertendo de Decimal para Hexa
Até aqui vimos somente a conversão de hexa para decimal. Agora veremos como converter números decimais para hexa. Como já disse antes, criaremos um programa para escrever os números do Z80 em decimal, e em seguida escreveremos outro programa para que o Z80 leias números hexadecimais. Mas, assim como as conversões de hexa para decimal, vamos iniciar aprendendo como fazer as conversões a mão. Novamente, começaremos lembrando um pouco da matemática do colégio.
Quando aprendemos inicialmente a divisão, dividimos 9 por 2 e obtemos 4 com um resto de 1. Usaremos o resto para converter os números decimais para hexa.
Vejamos o que acontece quando dividimos repetidametne um número decimal, neste caso 493, por 10:
493 / 10 | = 49 | resto 3 | →→→→→ |
↓←←←← | ←←↓ | ↓ | |
49 / 10 | = 4 | resto 9 | →→→↓ |
↓←←←← | ←←↓ | ↓ ↓ | |
4 / 10 | = 0 | resto 4 | →↓ ↓ ↓ |
4 9 3 |
Os dígitos de 493 aparecem como restos em ordem contrária - isto é, começando com o da direita (3). Vimos na última seção que tudo o que precisávamos para a nossa conversão de hexa para decimal era trocar as pontências de 10 por potências de 16. Para a conversão de decimal para hexa, podemos dividir por 16 ao invés de 10? Na verdade, este é o nosso método para a conversão.
Mais exemplos de Conversões Hexa:
1069/ 16 | = 66 | resto 13 | →→→→→ |
↓←←←← | ←←↓ | ↓ | |
66 / 16 | = 4 | resto 2 | →→→↓ |
↓←←←← | ←←↓ | ↓ ↓ | |
4 / 16 | = 0 | resto 4 | →↓ ↓ ↓ |
1069 | = | | 4 2 DH |
57109 / 16 | = 3569 | resto 5 | →→→ |
↓←←←← | ←←↓ | ↓ | |
3569 / 16 | = 223 | resto 2 | →→ |
↓←←←← | ←←↓ | ↓ ↓ | |
223 / 16 | = 13 | resto 15 |
|
|
|
| |
13 / 16 | = 0 | resto 13 | →↓ ↓ ↓ |
57109 | = | D F 1 5H |
Por exemplo, vamos descobrir o número hexa equivalente a 493. Dividindo por 16, como vemos aqui:
493 / 16 | = 30 | resto 13 (DH) | →→→→→ |
↓←←←← | ←←↓ | ↓ | |
30 / 16 | = 1 | resto 14 (EH) | →→→↓ |
↓←←←← | ←←↓ | ↓ ↓ | |
1 / 16 | = 0 | resto 1 (1H) | →↓ ↓ ↓ |
493 | = | | 1 E DH |
Descobrimos que 1EDH é o equivalente hexa do decimal 493. Em outras palavras vá dividindo por 16, e forme o número hexa final a partir dos restos. Isso é tudo.
Números Negativos
Se você ainda se lembra, temos um problema não resolvido com o número 0FFFFH. Disse que 0FFFFH é na verdade -1. E mais, se convertermos 0FFFFH para decimal, obteremos 65535. Como pode ser isto? Ele se comporta como um número negativo?
Bem, se adicionarmos 0FFFFH (ou seja, -1) a 5, o resultado seria 4, pois 5 - 1 = 4. E é isso o que acontece? Usando o comando CL do Super-X para somar 5 a 0FFFFH, nós encontramos:
O Super-X parece tratar 0FFFFH como -1. 0FFFFH em sempre se comportará como -1 nos programas que estivermos escrevendo. Para ver por que não, faça esta soma a mão.
Quando somamos dois números decimais, frequentemente colocamos um "vai-um" na próxima coluna, assim:
11 |
95 |
+58 |
|
A soma de dois número hexa não é muito diferente. Somar 3 a F nos dá 2, com um "vai-um" para a próxima coluna:
1 |
F |
+3 |
|
Agora, veja o que acontece quando somamos 5 a 0FFFFH.
1111 |
00005H |
+0FFFFH |
|
Como 0FH + 01H = 10H, os "carries" (vai-uns) sucessivos se movem para as posições à esquerda. E se ignorarmos o último 1, temos a resposta correa para 5 - 1, a saber 4. Por mais estranho que pareça, 0FFFFH se comporta como -1 quando ignoramos este estouro (overflow). Ele é chamado de overflow porque o número possui agora cinco dígitos, mas o Super-X retém somente os primeiros quatro (os da direita).
Este overflow é um erro, ou a resposta está correta? Bem, sim e sim. Podemos escolher um dos dois. Mas as respostas não se contradizem? Não exatamente, pois podemos ver estes dois números de qualquer uma das formas.
Suponhamos que 0FFFFH seja igual a 65535. Ele é um número positivo, e é o maior número que podemos escrever com quatro dígitos hexa. Dizemos que 0FFFFH é um número não sinalizado. Ele não é sinalizado porque definimos os números de quatro dígitos como positivos. Somar 5 a 0FFFFH nos dá 10004H, nenhuma outra resposta seria correta. No caso de números sem sinal, então um overflow é um erro.
Por outro lado, podemos tratar 0FFFFH como um número negativo, ou sinalizado, como foi feito pelo Super-X quando usamos o comando CL para somar 0FFFFH a 5. 0FFFFH se torna -1 quando ignoramos o overflow. De fato, os números de 8000H a 0FFFFH enquadram-se muito bem aos números negativos. Para números com sinal, como aqui, o overflow não é um erro.
O microprocessador Z80 pode admitir os números com ou sem sinal, a escolha é sua. Há instruções ligeiramente diferentes para os dois tipos, e veremos estas diferenças em outros capítulos quando começarmos a usar os números no Z80. Por enquanto, antes que você aprenda a escrever o negativo de, digamos 3C8H, precisamos desmascarar o bit e ver como ele se encaixa ao esquema de bytes, word (palavras) e hexa.
Bits, Bytes, Words e Notação Binária
Vamos agora nos aprofundar um pouco mais nos detalhes do seu MSX - é hora de aprendermos a aritmética do Z80, numeros binários. O microprocessador Z80, com toda sua potência, é um tanto burro. Ele só conhece os dígitos 0 e 1, de modo que qualquer número usado por ele deve ser formado por uma grande fila de zeros e uns. Este é o sistema de numeração binário (ou sistema de base 2).
Quando o Super-X imprime um número em hexa, ele usa um pequeno programa para converter seus números internos de binário para hexadecimal. Em um capítulo adiante, vamos montar um programa desse tipo para converter números binários para notação hexadecimal, mas primeiro precisamos saber mais sobre os números binários.
Vamos pegar o número binário 1011B (o B significa binário). Este número é igual ao decimal 11, ou B em hexa. Para ver por quê, multiplique os dígitos 1011B pelas potências da base 2.
Potências de 2:
23 | = | 8 |
22 | = | 4 |
21 | = | 2 |
20 | = | 1 |
Assim sendo:
1x8=8 |
0x4=0 |
1x2=2 |
1x1=1 |
1011B = 11 ou 0BH |
Da mesma forma, 1111B é 0FH, ou 15. E 1111B é o maior número sem sinal que pode ser colocado em quatro dígitos, enquanto 0000B é o menor. Assim, com quatro dígitos binários podemos escrever desesseis números diferentes. Há exatamente 16 dígitos hexa, de modo que podemos escrever um dígito hexa para cada quatro dígitos binários.
Um número hexa de dois dígitos, como 4CH, pode ser escrito como 0100 1100B. Ele é composto de oito dígitos, que separamos em grupos de quatro por facilidade de leitura. Cada um destes dígitos binários é conhecido como bit, de modo que um número binário como 0100 1100B, ou 4CH, possui oito bits.
Às vezes se torna importante numerar cada um dos bits em uma série longa, com o bit 0 sendo o mais à direita. O 1 no número 10B é o bit número 1, e o bit mais à esquerda de 1100B é o bit número 3. Ao numerarmos os bits desta forma, torna-se mais fácil qualquer referência a um bit individual, e iremos precisar disto mais adiante.
Um grupo de oito dígitos binários é conhecido como byte, e um grupo de 16 bits, ou dois bytes, é um word (palavra). Usarei estes termos diversas vezes no decorrer deste tutorial, pois os bits, bytes e words são peças fundamentais para o microprocessador Z80.
Representação Binária, Hexa e Decimal de 0 a F:
Binário | Decimal | Hexadecimal |
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
Agora, podemos ver por que a notação hexadecimal é tão conveniente, dois dígitos hexa encaixam perfeitamente em um byte (quatro bits para cada dígito hexa), e quatro dígitos ocupam exatamente uma word. Não podemos dizer o mesmo para os números decimais. Se tentássemos usar dois dígitos decimais para um byte, não poderiamos escrever números maiores do que 99, perdendo os valores 100 a 255 - mais da metade da faixa dos números que um byte pode conter. E se usarmos três dígitos decimais, devemos ignorar mais da metade dos números decimais de três dígitos, pois os números de 256 até 999 não podem ser representados por um byte.
Uma word é formada por bits e bytes:
| Bit ↓ | ↓——Byte———↓ | |
0100 | 1101 | 0001 | 1100 |
4 | D | 1 | A |
↑ |
Complemento de Dois - Um Tipo Estranho de Número Negativo
Artigo Original: Wilson Pilon
Agora estamos prontos para aprendermos mais sobre os números negativos. Dissemos que os números de 8000H a 0FFFFH comportam-se como números negativos quando ignoramos o "overflow". Há um modo fácil de reconhecer os números negativos quando escrevemos em binário.
Números Positivos:
0000H | 0000 0000 0000 0000B |
... | ... |
7FFFH | 0111 1111 1111 1111B |
Números Negativos:
8000H | 1000 0000 0000 0000B |
... | ... |
0FFFFH | 1111 1111 1111 1111B |
Em todas as formas binárias dos números positivos, o primeiro bit (bit 15) é sempre 0. Para todos os números negativos, o primeiro bit é sempre 1. Esta diferença, de fato, é o modo com que o Z80 reconhece um número negativo, ele olha para o bit 15, o bit de sinal. Se usarmos instruções para números sem sinal em nossos programas, o Z80 ignorará o bit de sinal, e podemos usar os números sem sinal conforme nossa conveniência.
Estes números negativos São conhecidos como Complemento de Dois dos números positivos. Por que complemento? Porque a conversão de um número positivo, como 3C8H, para sua forma de complemento de dois é um processo em dois passos, sendo o primeiro a conversão do número para seu complemento.
Não precisaremos muito dos números negativos, mas faremos a conversão aqui só para você ver como o Z80 "nega" os números. A conversão vai parecer um pouco estranha. Você não verá por que ela funciona, mas verá que funciona!
Para encontrar a forma de complemento de dois (negativo) de qualquer número, primeiro escreva o número em binário, ignorando o sinal. Por exemplo, 4CH torna-se 0000 0000 0100 1100B.
Para tornar esse número negativo, primeiro inverta todos os zeros e uns. Este processo de inversão é chamado de complementação, e tomando o complemento de 4CH, encontramos o seguinte
0000 0000 0100 1100B
torna-se:
1111 1111 1011 0011B
No segundo passo para a conversão, somamos 1 a esse valor:
11 |
1111 1111 1011 0011 |
+ 1 |
1111 1111 1011 0100 |
ou seja:
-4CH = 0FFB4H
A resposta, 0FFB4H, é o resultado que obtemos se usarmos o comando CL do Super-X para subtrair 4CH de 00H.
Se você quiser, pode somar 0FFB4H a 4CH a mão, para verificar que a resposta é 10000H. E de acordo com nossa discussão anterior, você sabe que este zero à esquerda deve ser ignorado para obter 0 (4CH + (-4CH) = 0) quando você fizer a soma em complemnto de dois.
Resumo
Este capítulo foi um grande passo em direção ao mundo hexadecimal e aos números binários, e certamente foi utilizado muito esforço mental. Logo, no capítulo subsequente ao próximo, irei diminuir um pouco o passo - uma vez que você já aprendeu o bastante para lidar com o Super-X. Agora, vamos tomar um fôlego e ver o que já aprendemos e o que descobrimos.
Começamos descobrindo o Super-X. Nos capítulos a seguir, nos tornaremos amigos íntimos do Super-X mas, como ele não entende o nosso sistema decimal tão comum, começaremos nossa amizade aprendendo um pouco mais sobre um novo sistema de numeração, a notação hexadecimal.
Aprendendo sobre números hexa, você também aprendeu a converter os números de decimal para hexa, e vice-versa. Mais adiante escreveremos um programa para fazer estas conversões, mas por enquanto é necessário aprender a própria linguagem.
Tendo visto as bases da notação hexadecimal, já pudemos descobrir os bits, bytes, words e números binários - personagens importantes que você encontrará frequentemente quando estivermos estudando o mundo do Z80 e da programação em linguagem assembly.
Finalmente, continuamos vendo os números negativos em hexa - os números em complemento de dois. Eles nos levaram aos números com e sem sinal, onde também vimos overflows de dois tipos diferentes, um em que o overflow leva a uma resposta correta (adição de dois números com sinal), e um em que o overflow leva a uma resposta errada (adição de dois números com sinal).
Todo este aprendizado será útil nos capítulos seguintes, pois usaremos nosso conhecimento de números hexa para falar com o Super-X, e o Super-X atuará como um interpretador entre nós e o microprocessador Z80 dentro do seu MSX.
No capítulo seguinte, usaremos o conhecimento que obtivemos até aqui para aprender mais sobre o Z80. Novamente confiaremos no Super-X, e usaremos números hexa, ao invés de binários, para falar com o Z80. Aprenderemos sobre os registradores do Z80 - os lugares onde ele armazena os números - e no capítulo subsequente ao próximo, estaremos prontos para escrever um programa real que imprimirá um caracter na tela. Também aprenderemos mais sobre o modo como o Z80 realiza sua matemática. Dentro de alguns capítulos já poderemos escrever um programa para converter números binários em decimais.
Nenhum comentário:
Postar um comentário