Praticamente todos os capítulos possuem um módulo de laboratório, uma espécie de guia de estudo. Se o guia não apresentar todas as informações necessárias para resolver os exercícios propostos, procure-as no capítulo ao qual ele se refere.
As questões são numeradas sequencialmente de acordo com o capítulo. Assim, por exemplo, Q01.08 representa a oitava questão do capítulo 1. As respostas podem ser visualizadas clicando e arrastando o mouse sobre a área sombreada (comece sempre do canto superior esquerdo e vá para o canto inferior direito). Aconselho a responder as questões antes de verificar as respostas corretas, senão, qual é a vantagem que Maria leva? Exercício é para ser resolvido ;)))
O sistema decimal é, sem sombra de dúvida, o sistema numérico mais utilizado. Cada dígito à esquerda do ponto "decimal" representa um valor que varia de 0 a 9 vezes sucessivas potências positivas de dez. Da mesma forma, cada dígito à direita do ponto decimal representa um valor de sucessivas potências negativas de dez. Exemplos:
7*103 + 0*102 + 0*101 + 9*100 + 0*10-1 + 0*10-2 + 1*10-3 o que, simplificado, será 7*103 + 9*100 + 1*10-3
O sistema de numeração binário funciona de um modo parecido com o do sistema decimal. Ao invés de sucessivas potências de dez, usa sucessivas potências de dois. Ao invés de dígitos de 0 a 9, permite apenas os dígitos 0 e 1. Exemplos:
1*26 + 1*25 + 1*23 + 1*22 + 1*20 + 1*2-1
O equivalente decimal de 1101101.1 é 109.5
Na linguagem Assembly, os números binários geralmente são agrupados em blocos de quatro, oito, dezesseis e trinta e dois "bits" (binary digits - dígitos binários). Além disso, a maioria dos valores usados no Assembly são inteiros. Neste texto usaremos a convenção normal de numeração dos bits, de 0 até n-1, onde n é o total de bits presentes no valor binário. O bit menos significativo (ou de ordem baixa - O.B.) é sempre o bit número zero e o bit mais significativo (ou de ordem alta - O.A.) é sempre o bit número n-1 de um número binário.
O bit número 15 é o mais significativo.
Programadores de linguagem Assembly, particularmente para o 80x86, com frequência trabalham com strings de bits de quatro, oito, dezesseis ou trinta e dois bits de comprimento. É por isso que são usados vários nomes especiais para os dados binários dos referidos comprimentos. São eles, respectivamente: nibbles, bytes, words e double words (words duplos).
O bit mais significativo num word é o bit 15. O bit mais significativo num double word é o bit 31.
Um byte é composto por 8 bits.
Um double word é composto por 4 bytes.
O bit menos significativo num nibble (como em qualquer outro grupo) é o bit 0.
Na prática, os números binários são muito desajeitados para serem usados. É por isso que a maioria dos programadores utiliza o sistema de numeração hexadecimal. O sistema de numeração hexadecimal (também conhecido simplesmente por hexa) fornece notações muito mais compactas que o sistema binário e a conversão entre hexa e binário é bastante simples quando se usa a seguinte tabela:
| Hexadecimal | Binário |
| 0 | 0000 |
| 1 | 0001 |
| 2 | 0010 |
| 3 | 0011 |
| 4 | 0100 |
| 5 | 0101 |
| 6 | 0110 |
| 7 | 0111 |
| 8 | 1000 |
| 9 | 1001 |
| A | 1010 |
| B | 1011 |
| C | 1100 |
| D | 1101 |
| E | 1110 |
| F | 1111 |
FEDC = 1111 1110 1101 1100
0011 0110 1001 0010 = 3692h
0100 0100 1000 0101 = 4485h
É zero porque 7, o byte de O.A., é igual a 0111 1111
As quatro operações lógicas mais importantes são AND, OR, XOR e NOT. As tabelas lógicas para estas operações são:
|
| ||||||||||||||||||
|
|
AND, OR e XOR são funções diádicas (precisam de dois operandos) e NOT é monádica. Por exemplo:
De acordo com as tabelas verdade acima, estas quatro operações atuam apenas em operandos de bit único. Em Assembly, no entanto, com frequência é preciso trabalhar com strings de bits (bytes, words, etc), o que torna necessária uma extensão destas funções. Para trabalhar com strings de bits é preciso que ambas tenham o mesmo comprimento. Para ajustá-lo, basta adicionar zeros à esquerda da string menor. Depois disso, basta realizar a operação desejada bit a bit:
FBh = 1111 1011 AND 54h = 0101 0100 ------------- 0101 0000 = 50h
12h = 0001 0010 OR 34h = 0011 0100 ----------- 0011 0110 = 36h
5Ah = 0101 1010 XOR 5Ah = 0101 1010 ------------- 0000 0000 = 0h
4Fh = 0100 1111 NOT = 1011 0000 = B0h
Você ainda se lembra da transformação de números positivos em negativos (e vice versa) usando o complemento de dois? Só para refrescar a memória:
FFFFh = 1111 1111 1111 1111 NOT = 0000 0000 0000 0000 + 1 = 0000 0000 0000 0001 = 1h
FACEh = 1111 1010 1100 1110 F0F0h = 1111 0000 1111 0000 --------------------- AND 1111 0000 1100 0000 NOT 0000 1111 0011 1111 +1 0000 1111 0100 0000 HEXA 0 F 4 0
Para poder realizar operações com valores representados por um número de bits diferente (por exemplo, somar um byte com um word), é preciso expandir o valor representado com menos bits. Reveja as regras:
5Fh = 0101 1111 0000 0000 0101 1111 hexa 0 0 5 F
91h = 1001 0001 1111 1111 1001 0001 hexa F F 9 1
91h = 0000 0000 1001 0001 0000 0000 0000 0000 0000 0000 1001 0001 hexa 0 0 0 0 0 0 9 1
01FFh = 0000 0001 1111 1111 FF81h = 1111 1111 1000 0001 --------------------- AND = 0000 0001 1000 0001 0181 hexa de 16 bits 0000 0181 hexa de 32 bits
A contração, para reduzir o número de bits de um valor, só pode ser efetuada se o resultado mantiver o valor original. O princípio da contração com sinal é o mesmo da expansão com sinal, sendo apenas a operação inversa.
FF80h = 1111 1111 1000 0000 80h = 1000 0000 Sim, o bit mais significante permanece 1 e o valor original é mantido.
0102h = 0000 0001 0000 0010 02h = 0000 0010 Não, o bit mais significante permanece 0 mas o valor original é perdido.
Lembra dos campos bit e dos dados compactados? O exemplo era um campo bit para guardar datas. Os bits D eram para o dia, os bits M para o mês e os A para o ano - e tudo cabe direitinho em 16 bits. Veja abaixo:
Lembra também das operações de shift (deslocamento) e rotate (rotação)? Só para refrescar a memória, aqui estão os diagramas:
Shift para a direita |
Shift para a esquerda |
![]() Shift artimético para a direita | ![]() Rotação para a esquerda |
O número de bits não importa. Digamos que sejam oito. Basta fazer um ROL 1 seguido de um AND 1. O bit de sinal é identificado por S: Sxxx xxxx ROL 1 = xxxx xxxS 1 = 0000 0001 AND = 0000 000S
Os bits correspondentes ao ano ocupam as posições de 0 a 6. Basta fazer um AND 7Fh: xxxx xxxx xAAA AAAA 7Fh = 0000 0000 0111 1111 AND = 0000 0000 0AAA AAAA
Os bits correspondentes ao mês ocupam as posições de 7 a 10. Precisamos fazer um AND 78h seguido de 7 shifts para a direita (SHR 7): xxxx xMMM Mxxx xxxx 78h = 0000 0111 1000 0000 AND = 0000 0MMM M000 0000 SHR 7 = 0000 0000 0000 MMMM
Os bits correspondentes ao dia ocupam as posições de 11 a 15. Umas das possibilidades é fazer 11 shifts para a esquerda (SHR 12): DDDD Dxxx xxxx xxxx 0DDD DDxx xxxx xxxx 00DD DDDx xxxx xxxx ... 0000 0000 000D DDDD Outra possibilidade é fazer um AND F800h seguido por cinco rotações para a esquerda (ROL 5): DDDD Dxxx xxxx xxxx 1111 1000 0000 0000 AND = DDDD D000 0000 0000 ROL 1 = DDDD 0000 0000 000D ROL 1 = DDD0 0000 0000 00DD ... ROL 1 = 0000 0000 000D DDDD A terceira possibilidade é fazer cinco rotações para a esquerda seguida de um AND 1Fh: DDDD Dxxx xxxx xxxx ROL 5 = xxxx xxxx xxxD DDDD 1Fh = 0000 0000 0001 1111 AND = 0000 0000 000D DDDD
DDDD DMMM MAAA AAAA 0110 0000 1000 0100 hexa = 6 0 8 4
DDDD DMMM MAAA AAAA 7FFh = 0000 0111 1111 1111 AND = 0000 0MMM MAAA AAAA remove o dia anterior ROL 5 = MMMM AAAA AAA0 0000 põe na posição 14h = 0000 0000 0001 0100 dia 20d = 14h OR = MMMM AAAA AAA1 0100 põe dia ROR 5 = 1010 0MMM MAAA AAAA volta para posição original
O conjunto de caracteres ASCII é provavelmente o código mais universal que existe hoje em dia. O conjunto padrão de caracteres ASCII inclui 128 códigos diferentes, arranjados em quatro grupos de 32 códigos. Os dígitos de 0 a 9 possuem os códigos de 30h a 39h. Estes grupos podem ser identificados através dos bits 5 e 6:
| Bit 6 | Bit 5 | Grupo |
| 0 | 0 | Caracteres de controle |
| 0 | 1 | Dígitos e caracteres de pontuação |
| 1 | 0 | Maiúsculos e especiais |
| 1 | 1 | Minúsculos e especiais |
7654 3210 minúsculas = 011x xxxx 5Fh = 0101 1111 AND = 010x xxxx = maiúsculas maiúsculas = 010x xxxx 20h = 0010 0000 OR = 011x xxxx = minúsculas caracter 5 = 0011 0101 (35h) Fh = 0000 1111 AND = 0000 0101 = valor 5 valor 5 = 0000 0101 30h = 0011 0000 OR = 0011 0101 = 35h
Estas 30 questões cobrem os principais conceitos explicados no capítulo 1. Se você conseguiu responder corretamente pelo menos 24 delas, considere-se aprovado. Independente da média obtida, revise cuidadosamente as questões que você errou - com erros se aprende mais do que com acertos ;))) Analise se o erro foi devido à lógica ou à falta de concentração (bits trocados, etc). Este levantamento ajudará a melhorar sua performance.
Depois de analisar e corrigir as questões que você não acertou, é hora de entrar de sola na álgebra booleana. Boa sorte!