APOSTILA DO MANOLO DE SISTEMAS DE INFORMAÇÃO #PASSENOPATER

1 – INTRODUÇÃO: BINÁRIOS PRA QUE?
Pra você que já se perguntou um milhão de vezes pra que raios você está estudando
isso, a resposta é muito simples : pra nada. O sistema binário é um sistema numérico
desenvolvido para representar a maneira como as máquinas lidam com as informações,
e as máquinas, que lidam com energia elétrica para funcionarem, basicamente só
compreendem dois tipos de informação : ou está passando corrente elétrica por
determinado lugar, ou não, ou seja, 0 ou 1.
Cada computador tem uma determinada quantidade de bits com os quais consegue
trabalhar, sendo que os bits são a quantidade de binários que a máquina trabalhar de
uma vez. Uma máquina de 8 bits, por exemplo, tem 8 casas para trabalhar binários, ou
seja, 1111 1111 é o maior numero que pode ser formado desse sistema que é capaz de
reproduzir 256 combinações diferentes.
Na moral, pra nós isso é algo completamente dispensável, quase sem nenhuma utilidade
prática (uma vez que mesmo ao trabalharmos com cor em meios digitais, onde usamos
esse tipo de informação, não é preciso ter conhecimento de binários ou hexadecimais
para operar os softwares). Entretanto, é preciso passar na matéria do Pater pra sair da
ECO com o diploma (a menos que você seja o manolo que o Ref lançou como aprovado
e deu aquele rolo todo), então vamos à parte que interessa.

2 – SISTEMAS NUMÉRICOS
Já é natural para nós e estamos completamente habituados a utilizar o sistema decimal
em nossas vidas. Outros sistemas numéricos parecem estranhos, porém não passam de
outras maneiras de se representar os números. No sistema decimal trabalhamos com 10
caracteres, que vão de 0 a 10. O sistema binário trabalha apenas com 0 e 1, e o sistema
hexadecimal trabalha com caracteres de 0 a F. Basicamente a logica desses números
ainda é a mesma que vemos no sistema decimal.
Por exemplo, quando contamos de 0 até 9, o 9 é o ultimo numero que o sistema decimal
consegue representar, por isso passamos do 9 para o 10, colocando um 0 no final do
numero, que é o primeiro numero do sistema, e colocando o 1 em uma segunda casa. No
caso do sistema binário, como só temos 0 e 1 disponíveis, quando temos o 1 e somamos
mais um, já chegamos estávamos no ultimo numero que o sistema é capaz de
representar, por isso pulamos de 1 para 10 quando fazemos essa soma. Por isso em
binário 1+1=10, e assim por diante, e por equivalência para com o sistema decimal, esse
10 binário na realidade é o 2 decimal.
Em hexadecimal a logica é a mesma. Esse sistema é utilizado basicamente pelas suas
equivalências com binários que veremos a seguir, que fazem com que, através deles,
possamos representar os números binários grandes de maneira que fiquem menos
absurdos. Hexadecimais usam mais caracteres do que os decimais, por isso, quando
somamos 1+9, que em decimal seria 10, em hexadecimal temos o A para representar
esse numero. Então quando chegamos no F, que equivale ao 15 decimal, chegamos ao
ultimo numero do sistema hexadecimal, e então, somando F+1, chegamos novamente ao
10, que em um sistema hexadecimal, equivale ao nosso bom e velho 16.
Vocês já tem essa tabela, mas para o caso de alguém não ter, esse é o seu principal
ponto de referencia para as conversões que veremos a seguir.


3- CONVERSÕES
Observação: Usarei, antes dos números letras para identificar o sistema numérico
utilizado. Basicamente:
h=hexadecimal
b=binário
d=decimal
Então, por exemo d10 = 10 unidades, hA = 10 unidades e b1010 = 10 unidades.

3.1 – BINARIO PARA HEXADECIMAL

Em cima dessa tabela, basta pegarmos o numero binário e irmos vendo suas
equivalências em hexadecimal. Anotar o numero binário de trás para frente já separando
ele em blocos de 4 binários, ajuda no processo. Basicamente é só verificar equivalências
e substituir. Por exemplo:
Tomando como base o numero b1100 0011 1010 1101 1111 0010
Se quisermos converter esse binário para hexadecimal, basta verificarmos que
1100 = C 0011 = 3 1010 = A 1101 = D 1111 = F 0010 = 2
Uma vez que já sabemos as equivalências, já temos nosso numero. Ou seja,
b1100 0011 1010 1101 1111 0010 = hC3ADF2
Mas e se o numero não completa 4 casas em todos os grupos? Lembrando que sempre
devemos dividir o numero em grupos de 4 de trás pra frente e pegando como exemplo o
numero 11 0011 1100 0111, basta acrescentar zeros à esquerda até que o ultimo grupo
complete 4 casas, nesse caso, chegando ao numero 0011 0011 1100 0111, que é
exatamente igual ao 11 0011 1100 0111, uma vez que zeros a esquerda não acrescentam
em nada ao numero. Depois disso é só converter.

3.2 HEXADECIMAL PARA BINÁRIO

Para converter de hexadecimal para binário, o processo é exatamente o mesmo que
descrevi anteriormente na seção de binário para hexadecimal, só que ao contrário. Você
verifica quais binários são equivalentes aos determinados hexadecimais e substitui, por
isso não preciso me prolongar nessa seção.

3.3 Binário e hexadecimal para decimal
Esse é um ponto que já fica mais chato, porque começa a envolver contas. Porém é
muito mais fácil do que parece. Em primeiro lugar, vocês já tem isso no material que o
pater passou, na parte da tabela das potencias de 2 e 16, mas segue novamente algumas
como referência para ajudar vocês a entender essa parte:

Potência de 16 Decimal
16
0
1
16
1
16
16
2
256
16
3
4096
16
4
65 536
16
5
1 048 576
16
6
16 777 216

Mas porque eu não estou passando a tabela de potencia de 2 se vamos trabalhar com
conversões de binário também? Simplesmente porque vocês vão ignorar essa parte da
tabela de vocês. Conversões diretas de binário para decimal são UM CÚ. Envolvem
muito mais contas do que vocês precisariam fazer normalmente. Como conversões de
binário para hexadecimal são automáticas, bastando substituir as equivalências, o que
vocês vão fazer para converter binários para decimal é primeiro convertê-los para
hexadecimal e depois converter o hexadecimal para decimal, pois isso vai economizar
tempo e trabalho de vocês que terão de fazer muito menos contas.
Tomando como exemplo o número b1110 0011 1100. Sua equivalência hexadecimal é
hE3C, com o qual vamos trabalhar.
Lembra daquele papo do pater das fichas? Esquece as fichas, porque ninguém mais usa
ficha hoje em dia e pensa que você tá jogando banco imobiliário. Cada casa, da direita
pra esquerda, representa uma nota, cujo valor é determinado pelas potências de 16. O
numero que estiver naquela casa indica quantas notas você têm daquele valor. A
pergunta que você têm de se fazer para saber o resultado é : quanto dinheiro eu tenho?
Exemplo:

E 3 C
_____ _____ _____ _____ _____ _____ _____
7ªcasa 6ªcasa 5ªcasa 4ªcasa 3ªcasa 2ªcasa 1ªcasa
d1677216 d1048576 d65536 d4096 d256 d16 d1

Sabendo, pela tabela de conversões de decimal para hexadecimal e binário que hE =
d14, h3=d3 e hC=d12 e tendo em vista o valor decimal de cada casa, definido pela
tabela das potências de 16, nesse caso é como se tivéssemos em nosso jogo de banco
imobiliário, 12 notas de 1 real, 3 de 16 e 14 de 256. Basta multiplicarmos os valores e
somarmos.
12x1=12
16x3 = 48
256x14 = 3584
12+48+3584 = 3644
Logo, nosso querido numero b1110 0011 1100 é igual a hE3C que é igual a d3644. É
isso, apenas isso. Com a tabela das potências de 16 na mão é só você converter de
binário para hexadecimal, ver o valor de cada casa, multiplicar e somar, e esqueçam
aquelas pirações do Pater, ele tenta fazer aquilo pra ajudar, mas só confunde mais, com
isso vocês convertem tudo.

3.3 DECIMAL PARA HEXADECIMAL E BINÁRIO

O processo de conversão de decimal para Hexadecimal e binário é ainda mais simples.
Mais uma vez eu digo, você NÃO VAI FAZER A CONVERSÃO DIRETA PRA
BINÁRIO. Converta primeiro pra hexadecimal, isso vai te economizar tempo e
trabalho, depois é só verificar as equivalências.
Basicamente, tudo que é necessário pra converter o numero é ir dividindo-o por 16, sem
calcular números fracionários. Após feita a primeira divisão, você começa a montar seu
hexadecimal da direita para a esquerda colocando sempre o que sobrou da divisão
convertido para hexadecimal, e então dividindo novamente o numero por d16, até
chegarmos ao resultado d0.
Por exemplo, tomando como base o numero d720 880
d720 880 / d16 é igual a d45 055 e não há sobras.
Como não há sobras, começamos a montar nosso hexadecimal por 0. Então até o
momento temos h0.
Em seguida, dividimos o resultado por d16 novamente:
d45 055 / d16 é igual a d2815 e sobram d15.
d15 = hF. Colocando isso no nosso hexadecimal em construção, temos até o momento,
hF0.
Em seguida, dividimos o resultado por d16 novamente.
d2815 / d16 = d175 e sobram d15.
d15 = hF. Colocando isso no nosso hexadecimal em construção, temos até o momento,
hFF0.
Em seguida, dividimos o resultado por 16 novamente.
d175 / d16 = d10 e sobram d15.
d15 = hF. Colocando isso no nosso hexadecimal em construção, temos até o momento,
hFFF0.
Em seguida, dividimos o resultado por 16 novamente.
d10 / d16 = d0 e sobram d10.
d10 = hA. Como o resultado dessa última divisão foi 0, significa que não há mais o que
dividir, então colocando no nosso hexadecimal em construção esse último numero
temos hAFFF0.
Logo, nosso querido d720.880 é igual a hAFFF0 que, convertendo pelas equivalências é
igual a b1010 1111 1111 1111 0000.

3.4 ASCII
Em primeiro lugar, segue a tabela de conversão para ASCII, que está junto ao material
do pater, mas só por segurança estarei colocando aqui para consulta.

ps. Ignorem os valores escritos a direita da tabela. Não fazem o menor sentido.
Basicamente para conversões de ASCII para Hexadecimal, basta analisar a linha e a
coluna em que se encontra o caractere e escrever o valor nessa ordem. Cada caractere
em ASCII corresponde a 2 números hexadecimais. Seguindo as numerações
encontradas na tabela, sempre colocamos o numero da linha em primeiro lugar e da
coluna em segundo. Por exemplo, a letra A (maiúscula) em ASCII se encontra na linha
4 coluna 1, por isso é representada pelo Hexadecimal h41. As letras PQP por exemplo,
em ASCII, se encontram : P (Maiúsculo) na linha 5 coluna 0, e Q (Maiúsculo) na linha
5 coluna 1. Logo, PQP é igual a h50 51 50.
Tendo em vista isso, tanto para a conversão de Hexa para ASCII e de ASCII para Hexa,
basta consultar a tabela. Para outros sistemas, primeiro convertemos para Hexa e depois
convertemos seguindo as conversões anteriormente explicadas.

4 – EXCESSOS E COMPLEMENTOS
Excessos e complementos são maneiras de se poder trabalhar com números negativos
em sistemas binários. Como o sistema binário não comporta um sinal de mais ou menos
antes do numero para identificarmos, são basicamente convenções que criamos de modo
a conseguir representa-los.
4.1 COMPLEMENTO DE 1
Em primeiro lugar é preciso explicar o que é um complemento a 1. O complemento de
um numero é um numero que tenha os valores necessários para que todas as casas de
determinado binário cheguem a 1. Por exemplo, tomando como base o numero
b110001.
O complemento de b110001 é b001110, que é exatamente o que “falta” a b110001 para
chegar a b111111.
110001
+001110
111111

4.2 COMPLEMENTO A 2
Ao chegarmos em complemento a 2 é finalmente quando entram em jogo os negativos.
Basicamente convencionamos que qualquer numero começado por 1 é negativo e
qualquer numero começado por 0 é positivo. Os números negativos são contados de trás
para frente, logo b11111, que em tese seria o maior numero possível nesse sistema de 5
bits, na verdade é o menor número negativo em complemento a 2, que é equivalente a
d-1.
O nome de complemento a 2 vêm da maneira como fazemos para descobrir o valor
equivalente a esse numero em decimal. Para isso é necessário tirarmos o complemento
do numero binário negativo, somarmos um a ele e então convertermos para decimal.
Assim chegamos à versão positiva do número negativo que estamos procurando.
Tomando como base o numero b10110 em complemento a 2 por exemplo, se quisermos
saber sua equivalência decimal, primeiro temos de tirar seu complemento, que é 01001.
Sabendo seu complemento, somamos um a ele (por isso o nome complemento a 2, pois
é o complemento de 1, mais 1). Então vejamos como fica.

01001
+00001
01010

Após chegarmos a esse b01010, que é o complemento de b10110 somado com 1, basta
convertermos esse binário para decimal para sabermos sua equivalência. Como b01010
é igual a d10, b10110 é igual a d-10, uma vez que d10 é sua versão positiva.

4.3 EXCESSOS

Trabalhar com excessos, como excesso de 8, assim como com o complemento a 2 é
apenas mais uma maneira de se trabalhar com números negativos em binários. Excesso
pode ser de qualquer valor, como excesso de 8, excesso de 5 ou excesso de 400.
Basicamente, ao definir que se esta trabalhando com excesso, você está dizendo que
aquele determinado numero é igual a d0. Por exemplo, ao trabalhar em excesso de 8,
determina-se que d8 =d 0. Excesso de 5 determinar que d5 = d0. Se d8 = d0, por
exemplo, pra saber o valor de determinado numero em excesso de 8 basta subtrair 8 de
seu valor convertido. Se d8 = d0, então d9 = d1, d7 = d-1
Por exemplo, trabalhando em excesso de 8, o numero b1010, que corresponderia a d10,
na verdade é d2. Definindo que d8 = d0 se b1010 seria igual a d10, então b1010, em
excesso de 8, é igual a d2, uma vez que d10-d8 = d2.

5 – SOMA, VÁLIDOS E INVÁLIDOS
Soma em binários ou hexadecimais são como contas em decimais, como citei na sessão
de sistemas numéricos. Porém, como estamos trabalhando com máquinas elas são
limitadas por suas especificações. Então, por exemplo, em um sistema de 8bits, só
temos 8 casas disponíveis para trabalhar. Então há cálculos que podem exceder a
capacidade de representação da máquina.
Em uma soma de b1111 (d15) com b1111 (d15), num sistema de 4 bits, acaba
resultando no seguinte resultado:
1111
+1111
1110
O resultado correto, na realidade, seria b11110 (d30), não b1110 (d14) como
aconteceu. Porém, como a máquina em questão não é capaz de utilizar um quinto digito,
não é possível exibir o resultado correto, então, como d15+d15 não é possível ser igual
a d14, o resultado em questão é um resultado inválido.
Ao trabalharmos com complemento de 2, é possível existirem 6 tipos de resultados para
uma conta: Positivos válidos, Negativos válidos, Zeros válidos, Positivos inválidos,
Negativos inválidos e Zeros inválidos.
Em completo a 2 sabemos de antemão que qualquer numero começado por 1 é negativo
e qualquer número começado por 0 é negativo. Nesse caso, ignoramos a questão das
casas extras que não seriam utilizadas, pois é comum isso acontecer nos números
negativos sem que isso seja problema, a única coisa que devemos verificar é se o
resultado final é condizente com o que se espera. Por exemplo, se somarmos dois
números negativos e o resultado final for um número positivo, o resultado se trata de
um Positivo Invalido. Se somarmos dois números positivos e o resultado for um
número negativo, se trata de um Negativo Inválido. Se somarmos dois números do
mesmo tipo, como dois positivos ou dois negativos, e o resultado for zero, trata-se de
um Zero Inválido.
Exemplos:
1000011
+1011011 Somamos dois negativos e o resultado foi um número positivo.
0011110 O resultado é um Positivo Inválido

0111011
+0100010 Somamos dois positivos e o resultado foi um número negativo.
1011101 O resultado é um Negativo Inválido

10000
+10000 Somamos dois negativos e o resultado foi zero.
00000 O resultado é um Zero Inválido

6 – FUNCIONAMENTO DA MÁQUINA (IP, RI, SP E ETC)

Essa parte é pura decoreba, você só precisa saber o que cada coisa faz. Então segue uma
lista de funções e etc.
MP = Memória Principal
Local onde são registrados os dados e programas do computador. É como se fosse o
HD.
IP = Instruction Pointer (ou indicador de instruções)
Sua função é registrar o próximo endereço a ser buscado na memória para que RI
execute. Por padrão funciona sequencialmente, mas não depende de seu modo
sequencial para funcionar, uma vez que existem operações que podem tirar o IP de seu
funcionamento linear.
RI = Registrador de Instruções
Sua função é registrar a ação que será executada
Barramento de dados
Cuida das transferências envolvendo a memória, garantindo que seja transferido apenas
determinadas partes.
Barramento de Endereços
Local onde são catalogados os endereços da memória e buscados para serem
executados.
Barramento de Controle
Determina se é uma operação de escrita ou leitura na memória principal. Por exemplo,
se há uma operação entre o RI e a memória principal, ele é o que determina se o RI está
lendo algo da memória ou gravando algo na memória.
Acumuladores
Registradores de uso geral do processador que servem para guardar resultados de
operações que não serão gravados na memória. Basicamente, se não houver menção de
para onde vai determinado resultado, por padrão ele vai para os acumuladores.
SP = Stack Point
Marca o ponto de retorno caso seja realizado um CALL
FLAGS
Determinam se a ultima operação realizada pela máquina deu ou não 0. É utilizado para
saltos condicionais.

A máquina, ao ser ligada, começa a executar as operações que se encontram na
memória. O IP, por padrão segue linearmente, indicando os endereços na memória a
partir do primeiro. Resumidamente, o IP marca o endereço da próxima ação a ser
executada. Através do Barramento de Endereços busca-se o local indicado na
memória e através do Barramento de Dados se transfere o conteúdo para o RI, com o
Barramento de Controle determinando que esta é uma operação de leitura na
memória. Após o conteúdo ser copiado para o RI, o IP atualiza para o próximo numero
da sequência e então o RI executa a função que foi copiada para ele.
Entre as operações que podem ser realizadas pelo RI, além de operações de escrita,
leitura e etc... Existem as chamadas Operações de Controle
Operações de Controle
Operações que tiram o IP de seu fluxo linear, alterando o fluxo das instruções. Pode ser
JUMP, CALL ou RET. Operações de controle nada tem há ver com o barramento de
controle.
Jump
Jump’s são saltos de um endereço da memória para outro. Alteram diretamente o IP
para que o IP passe a indicar o endereço determinado pelo JUMP. Existem dois tipos de
Jumps: Saltos Incondicionais, que, independente da situação alteram o endereço do IP
para aquele valor, e Saltos Condicionais, que realizam o salto apenar em determinada
situação (basicamente são dois tipos de saltos condicionais, o Jump Zero (JZ) e o
Jump Not Zero (JNZ) que determinam que o salto apenas é realizado se a ultima
operação tiver ou não dado 0.
CALL
Call’s funcionam exatamente como os Saltos Incondicionais, porém, guardam o
endereço atual do IP no SP, para que, posteriormente, possa-se voltar a esse endereço
quando for realizado um RET.
RET (Retornar)
Faz com que o programa retorne ao endereço que ficou salvo no SP quando o ultimo
Call foi realizado.