Assembly NumaBoa - Capítulo 1

LABORATÓRIO

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 ;)))

Representação de dados numéricos

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:

Q01.01

	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:

Q01.02

	1*26 + 1*25 + 1*23 + 1*22 + 1*20 + 1*2-1

Q01.03

	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.

Q01.04

	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).

Q01.05

	O bit mais significativo num word é o bit 15.
	O bit mais significativo num double word é o bit 31.

Q01.06

	Um byte é composto por 8 bits.

Q01.07

	Um double word é composto por 4 bytes.

Q01.08

	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:

HexadecimalBinário
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001
A1010
B1011
C1100
D1101
E1110
F1111

Q01.09

	FEDC = 1111 1110 1101 1100

Q01.10

	0011 0110 1001 0010 = 3692h

Q01.11

	0100 0100 1000 0101 = 4485h

Q01.12

	É 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:

AND01
000
101
OR01
001
111
XOR01
001
110
NOT 01
NOT 10

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:

Q01.13

	    FBh = 1111 1011
	AND 54h = 0101 0100
		-------------
		  0101 0000  =  50h

Q01.14

	   12h = 0001 0010
	OR 34h = 0011 0100
		-----------
		 0011 0110  =  36h

Q01.15

	    5Ah = 0101 1010
	XOR 5Ah = 0101 1010
		-------------
		  0000 0000  =  0h

Q01.16

	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:

  1. Transformar o número em binário
  2. Inverter todos os bits com NOT
  3. Somar 1 ao resultado
  4. Converter o binário para o sistema original

Q01.17

	FFFFh = 1111 1111 1111 1111
	  NOT = 0000 0000 0000 0000
	  + 1 = 0000 0000 0000 0001	= 1h

Q01.18

	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:

Q01.19

	5Fh =            0101 1111
	      0000 0000 0101 1111
	hexa    0    0    5    F

Q01.20

	91h =            1001 0001
	      1111 1111 1001 0001
	hexa    F    F    9    1

Q01.21

	91h =				0000 0000 1001 0001
	      0000 0000 0000 0000	0000 0000 1001 0001
	hexa     0    0    0    0	  0    0    9    1

Q01.22

	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.

Q01.23

	FF80h = 1111 1111 1000 0000
	  80h =            1000 0000

	Sim, o bit mais significante permanece 1 e
	o valor original é mantido.

Q01.24

	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:

Campos bit

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 right

Shift para a direita
Shift left

Shift para a esquerda
Arithmetic shift right

Shift artimético para a direita
Rotate left

Rotação para a esquerda

Q01.25

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

Q01.26

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

Q01.27

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

Q01.28

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

Q01.29

	       DDDD DMMM MAAA AAAA
	       0110 0000 1000 0100
	hexa =   6    0    8    4

Q01.29

		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 6Bit 5Grupo
00Caracteres de controle
01Dígitos e caracteres de pontuação
10Maiúsculos e especiais
11Minúsculos e especiais

Q01.30

		     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

Comentários

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!



| AAAA | Página Inicial | Mapa do Site | Novidades | Busca | Indique esta página | Mestre da Teia | Voltar |
| Localizador || @ Info NumaBoa > Assembly NumaBoa > Deslocamentos e rotações > Laboratório cap.1 > Álgebra booleana
Autoria: Randall Hyde - Art of Assembly Language Programming. Tradução: vovó Vicki

webdesign sobMedida by vickiSoft - /informatica/assembly/cap1_lab.php (12.01.04) versão 1.0 de 13.01.04
Licença Creative Commons 1998-2006 Aldeia NumaBoa
Exceto onde especificamente declarado, todo material deste site é disponibilizado de acordo com a Licença Creative Commons.