Lógica Binária

  É necessário entender um pouco de lógica digital para programarmos em Assembly. Existem instruções em Assembly como OR, AND e CP, que utilizam lógica.

  Para ajudar, use do livro Elementos de Eletrônica Digital os seguintes capítulos:

Utilize os programas do arquivo curso.dsk, para MSX:
portae.bas
portaou.bas


  1- Sistemas de Numeração

  O sistema de numeração que usamos diariamente é o sistema decimal. Ele é formado por dez algarismos distintos, a saber: 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9. É a partir deles que formamos todos os outros números.
  Quando aumentamos em uma unidade um determinado número, se o elemento de uma determinada casa decimal contiver o algarismo máximo (9), o valor da casa decimal imediatamente à esquerda é incrementado (aumentado em uma unidade), e o valor da casa em questão é retornado ao algarismo mínimo (0).



  De forma análoga, quando diminuimos em uma unidade um determinado número que possua uma casa decimal contendo o valor mínimo (0), diminuimos em uma unidade a casa decimal imediatamente à sua direita, e a casa atual vai para o valor máximo (9).

  Além do sistema decimal, existem ainda mais três sistemas de numeração utilizados em computação: binário, octal e hexadecimal.

  O sistema binário (no MSX é representado pelo prefixo &B) possui apenas 2 algarismos distintos: 0 e 1. Seguindo a regra de formação dos números decimais, temos a seguinte ordem: 0, 1, 10, 11, 100, 101, 110, 111, 1000, ...
  Note que, quando o maior algarismo (no caso é 1) é "estourado", soma-se mais um à próxima casa e a casa em questão retorna ao menor algarismo (0). Observe que essa regra se aplica para incrementos e decrementos. Para soma ou subtração entre números, siga a mesma regra utilizada pelo sistema decimal para somas ou subtraçãoes desse tipo. Ex:

 Decimal:			Binário
   1                             111
   15				  011
 + 17                           + 101
 ----                           ----- 
   32                            1000

 Ordem das somas:		Ordem das somas:
 1o.: 5 + 7 = 12 -> Vai um      1o.: 1 + 1 = 10 -> Vai um
 2o.: 1 + 1 (+ 1) = 3           2o.: 1 + 0 (+ 1) = 10 -> Vai um
                                3o.: 0 + 1 (+ 1) = 10 -> Vai um
                                4o.: 0 + 0 (+ 1) = 1

  O sistema octal (no MSX é representado pelo prefixo &O) possui 8 algarismos distintos: 0, 1, 2, 3, 4, 5, 6 e 7. Um exemplo de numeração ordenada crescente desse sistema seria: 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, ...

  O sistema hexadecimal (no MSX é representado pelo prefixo &H) possui 16 algarismos. Devido ao fato dos caracteres numéricos serem baseados no sistema decimal, ficam faltando 6 algarismos, que serão representados pelas 6 primeiras letras do alfabeto. Assim, temos os seguintes algarismos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.
  A seqüencia em hexadecimal fica: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 21, ...

  Quem já digitou programas em Assembly de revistas sobre MSX, percebeu-se de códigos como CD, C9, AB, etc. Agora você já sabe o que eles significam. São códigos de máquina representados no sistema de numeração hexadecimal.

  Vejamos uma tabela de equivalência numerica entre os sistemas:
 
Decimal
Binário
Octal
Hexadecimal
0
0
0
0
1
1
1
1
2
10
2
2
3
11
3
3
4
100
4
4
5
101
5
5
6
110
6
6
7
111
7
7
8
1000
10
8
9
1001
11
9
10
1010
12
A
11
1011
13
B
12
1100
14
C
13
1101
15
D
14
1110
16
E
15
1111
17
F
16
10000
20
10
17
10001
21
11
18
10010
22
12
19
10011
23
13

  No curso de Pascal, há também uma matéria sobre os sistemas de numeração, assim como converter entre os sistemas. Clique aqui para acessar esse curso.
  A nível de programação Assembly, não é necessário saber converter entre os sistemas de numeração. Apenas, entender o que eles significam e como funcionam, principalmente o incremento e decremento de números (sequenciação).


  2- Operações lógicas

  As operações lógicas tem como por objetivo testar uma ou mais entradas e produzir uma única saída. As operações lógicas mais usuais utilizam-se de duas entradas apenas.
  Os principais operadores lógicos são os seguintes:

  Obs: o curso de Pascal possui também uma matéria sobre lógica. Ela pode ser acessada aqui. A vantagem de utilizar as matérias do Pascal é a presença de códigos em linguagem de alto nível para a prática de exercícios. Vale lembrar que as linguagens de alto nível, como o Pascal e Basic, são muito mais fáceis de programar.


  O operador AND

  O operador AND (E, em português) tem como objetivo emitir uma saída verdadeira (valor 1), se e somente se todas as entradas forem verdadeiras.
  Ex: Um jogo de futebol só pode ter início, quando o juíz e os dois assistentes estiverem presentes. Assim, temos (pseudo-código):

  SE (juiz_presente E assistente_1_presente E assistente_2_presente) ENTÃO
    jogo_começa();

  Se o valor de pelo menos um deles for falso (valor 0), o jogo não pode começar.


  O operador OR

  O operador OR (OU, em português) tem como objetivo emitir uma saída verdadeira (valor 1), se pelo menos uma das entradas for verdadeira.
  Ex: A escola possui 3 técnicos em informática. Se pelo menos um deles estiver presente, o computador poderá ser consertado:

  SE (tecnico_1_presente OU tecnico_2_presente OU tecnico_3_presente) ENTÃO
    conserta_computador();

  Basta a presença de um dos três técnicos para consertar o computador.


  O operador NOT

  O operador NOT (NÃO, em português) tem como objetivo inverter o valor de uma entrada. Se era falsa, torna-se verdadeira. Se era verdadeira, torna-se falsa.
  Exs:
  Belo → NÃO belo
  Não alto → NÃO (Não alto) = alto.


  O operador XOR

  O operador XOR (OU Exclusivo, em português) tem como objetivo emitir uma saída verdadeira (valor 1), quando duas entradas são diferentes.
  Ex: Diálogo da mãe com o filho: "escolhe, ou o carrinho ou a bicicleta. Escolhe só um!"
  No caso, a ausência de escolha não é permitida, bem como escolher as duas coisas.


  Tabelas-verdade para os operadores

  Uma tabela verdade é valoração das saídas, para todas as combinações possíveis de entrada. Assim, temos:
NOT
Entrada Saída
A S
0 1
1 0
AND
Entradas Saída
A B S
0 0 0
0 1 0
1 0 0
1 1 1
OR
Entradas Saída
A B S
0 0 0
0 1 1
1 0 1
1 1 1
XOR
Entradas Saída
A B S
0 0 0
0 1 1
1 0 1
1 1 0
  Obs: O valor 0 corresponde ao falso, enquanto que o valor 1 corresponde ao verdadeiro.

  Quando a operação lógica possui mais de duas entradas, aplica-se a operação em castata. Por exemplo A and B and C = S, faz-se primeiro o par A and B, obtendo-se a saída parcial S1. Depois, combina-se essa saída com a próxima entrada C, fazendo-se S1 and C, finalmente obtendo-se S.


  3- Testes lógicos

  Os operadores de teste lógicos os seguites:   O teste é realizado a partir de dois operandos, resultando sempre em um valor booleano (verdadeiro ou falso). Exemplos:   A seguir, serão apresentados alguns exemplos, misturando os conceitos de testes lógicos e operadores lógicos.

  Exemplo 1: A idade para participar do programa de televisão Quiz MTV é entre 15 e 20 anos. Para que a pessoa possa participar, não poderá ter 14 anos OU menos ou não poderá ter 21 anos ou mais. Em outras palavras, ela deverá ter aos mesmo tempo (operador E) 15 anos ou mais E 20 anos ou menos.

  Tabela verdade:
 
Idade >= 15
Idade <= 20
Pode ?
falso
falso
não
falso
verdadeiro
não
verdadeiro
falso
não
verdadeiro
verdadeiro
sim

  O primeiro caso, neste exemplo, é impossível.
  O segundo, se a idade for, por exemplo, 10 anos.
  O terceiro, se a idade for, por exemplo, 30 anos.
  O quarto, caso, se a idade for, por exemplo, 17 anos.

  Exemplo 2: Para a porta lógica OU, podemos imaginar a seguinte situação: nos EUA, o filho de um casal pode obter o Green Card (visto de permanência no país), se o pai ou a mãe for americano. Vamos construir a tabela de possibilidades:
 
Pai americano
Mãe americana
Visto concedido ao filho
não
não
não
não
sim
sim
sim
não
sim
sim
sim
sim

  Exemplo 3: Temos também a porta inversora (NOT). Agora temos como exemplo as lâmpadas de emergencia, em caso de falta de luz. Se houver luz (1), a lâmpada fica apagada (0). Se faltar luz (0), a lâmpada então se acende (1).

Tabela verdade:
 
A
A'
0
1
1
0

  Exemplo 4: Suponha que para abrir uma conta universitária, você deva ter entre 18 e 25 anos de idade e estar cursando uma faculdade ou cursinho pré-vestibular.
 
Idade >= 18
Idade <= 25
Condição idade
não
não
não
não
sim
não
sim
não
não
sim
sim
sim


Faculdade
Cursinho
Condição estudo
não
não
não
não
sim
sim
sim
não
sim
sim
sim
sim


Condição de idade
Condição de estudo
Pode abrir conta?
não
não
não
não
sim
não
não
sim
não
sim
sim
sim


  Exemplo 5: Suponha que uma loja precise de um vendedor, um faxineiro e um gerente. Você vai pedir emprego e o contratante faz requisitos de experiência. Veja a tabela:
 
Vendedor
Faxineiro
Gerente
Aceite
não
não
não
não
não
não
sim
sim
não
sim
não
sim
não
sim
sim
sim
sim
não
não
sim
sim
não
sim
sim
sim
sim
não
sim
sim
sim
sim
sim

  Viu? Basta apenas UMA entrada (condição) ser verdadeira para o operador lógico OU, para que a saida seja verdadeira!!


  4 - Álgebra booleana

  Vamos ver agora o que o computador faz com os números binários.

  Saiba que um número binário com:

  Os dígitos são lidos, assim como o decimal, da direita para a esquerda. Sendo assim, para um número de 4 dígitos, tem-se:

  bit 3 | bit 2 | bit 1 | bit 0.

  O bit 3 é a casa de maior valor, enquanto o bit 0 é a casa de menor valor.

  Quando somamos dois número decimais e a conta de casa casa estoura, fazemos "vai um" e somamos este um com a conta da casa seguinte:

      1  << Vai um
      49
    + 25                        (5 + 9) = 14 >> vai um e (4 + 2) = 6 + 1(se houve vai um)
      ------
      74


  Com um número binário, faz-se a mesma coisa:

   111  <<  Vai um
   1101       Obs: 0 + 0 = 0,  0 + 1 = 1, 1 + 0 = 1 e 1 + 1 = 10
+  0111
----------
  10100


  Em assembly, o registrador F possui dois flags (sinais, semáforos) que sinalizam estouro: um chamado de Half-Carry, que sinaliza um estouro localizado no 4o. bit, e outro chamado de Carry, que sinaliza estouro localizado no 8o. bit.
  No exemplo acima, o 4o. bit foi estourado. Assim, o bit de Half-Carry (denominado pela letra H) seria setado (valor igual a 1).
  Caso o estouro fosse no 8o. bit, como por exemplo, um valor resultante acima de &HFF, o flag de Carry (C) seria setado.

  E para subtrair? Exatamente como fazemos em sistemas decimais. Parte-se da direita para a esquerda. Se o número de cima for menor que o de baixo, subtrai-se o do numero de cima da casa decimal imediatamente à esquerda da casa atual e agrega-se o valor 1 ao algarismo superior da casa atual.

Ex:
   -1
    41
-   28   
-------
    13

Conta em binário:

    0100
 -  1111
-----------
    0101

  Da esquerda para a direita:

  Note que ainda sobrou um pedido de empréstimo na última casa. Este pedido também seta o flag de Carry.

  5 - Complemento a um e complemento a dois

  Como é que o computador sabe que um número (do tipo sinalizado) é positivo ou negativo?
  É através do 8o. bit que ele identifica um número como sendo positivo ou negativo. Se esse bit for zero, o número é positivo. Se for um, é negativo.
  Assim, para um número de 8 bits, a faixa de &B00000000 a &B01111111 (ou 0 a 127) é composta de números positivos, enquanto que de &B10000000 a &B11111111 (ou -1 a -128) é composta de números negativos.
  Os números que utilizam o bit mais significativo para indicar o sinal são ditos sinalizados e variam de -128 a +127 (8 bits). Já os números que não utilizam o bit mais significativo para indicar o sinal, são chamados de não-sinalizados e variam de 0 a 255 (8 bits).

  Um complemento de um número é simplesmente a operação lógica NOT, bit a bit (ver matéria de lógica do Pascal aqui), aplicada sobre ele.
  Há dois tipos de complementos utilizados:

  O complemento de 1 é -1, o de 2 é -2, ...

  O complemento a dois de um número de 8 bits (1 byte), representados em hexadecimal, fica:
  00 - 00
  01 - FF
  02 - FE
  03 - FD

  No complemento a 1, inverte-se os bits:
  Número: 01010000
  Complemento: 10101111

  No complemento a 2, inverte-se o número e soma 1. Este é o complemento usado pelo CPU.
  Número: 00000001 = 1
  Complemento a dois: 11111110 + 1 = 11111111 = FF (número -1)

  Número: 00000010 = 2
  Complemento a dois: 11111101 + 1 = 11111110 = FE (número -2)

  Número: 11111111 = FF (número -1)
  Complemento a dois: 00000000 + 1 = 00000001 = 1
 

  6- Prioridade

  Seja o número 1500 (mil e quinhentos) em decimal. A casa decimal de maior valor é a de milhar, depois a de centena, dezena e unidade. Podemos representar o número como: d3 d2 d1 d0. d3=1, d2=5, d1=0, d0=0
  Um número binário segue a mesma idéia. Seja o número 11000011, temos:

  b7=1, b6=1, b5=0, b4=0, b3=0, b2=0, b1=1, b0=0.

  Onde a casa de maior prioridade é a b7, enquanto que a casa de menor prioridade é a casa b0.

  7- Série x Paralelo

  O envio de dados através dos fios do computador pode ser feito de  duas maneiras: em paralelo ou em série.
  Suponha que um computador envie dados de 8 bits para um periférico. Cada envio de "pacote" leva 1 ciclo.
  O envio em série envia um bit de cada vez, levando 8 ciclos para enviar os 8 bits. Já o paralelo envia os 8 bits de um vez, levando apenas 1 ciclo.

  Esquema:



  Se tivéssemos o byte 74 (01110100), em serie seria enviado: 0, 0, 1, 0, 1, 1, 1 e 0. Ele envia de b0 até b7.
  Já em paralelo, 01110100 seria enviado de uma só vez.


CURSOS/ASSEMBLY/AULA3