Tutoriais e Programação
AoA - Laboratório Cap.1
Qui 11 Jan 2007 20:25 |
- Detalhes
- Categoria: Art of Assembly
- Atualização: Domingo, 01 Julho 2012 19:55
- Autor: vovó Vicki
- Acessos: 9622
Este é o módulo de laboratório do capítulo 1 do AoA, uma espécie de guia de estudo. Se o guia não tiver todas as informações necessárias para resolver os exercícios propostos, procure-as no tópico 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 do canto superior esquerdo para o canto inferior direito. Sugiro 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:
1234.567 é 1*1000 + 2*100 + 3*10 + 4 + 5*0.1 + 6 * 0.01 + 7 * 0.001 Isto também equivale ao valor 1*103 + 2 *102 + 3*101 + 4*100 + 5*10-1 + 6*10-2 + 7*10-3
5.23e+5 é 5*105 + 2*104 + 3*103
Q01.01 - Qual é a representação em "potência de dez" de 7009.001?
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:
1001 é 1*23 + 1*20 (o equivalente decimal é nove)
110.11 é 1*22 + 1*21 + 1*2-1 + 1*2-2 (o equivalente decimal é 6.75)
Q01.02 - Qual é a representação em "potência de dois" de 1101101.1?
1*26 + 1*25 + 1*23 + 1*22 + 1*20 + 1*2-1
Q01.03 - Qual é o equivalente decimal de 1101101.1?
O equivalente decimal de 1101101.1 é 109.5
Na linguagem Assembly, os números binários geralmente são agrupados em blocos de 4, 8, 16 e 32 bits (binary digits - dígitos binários). Além disto, 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 do número binário.
Q01.04 - Num número binário de 16 bits, qual é o bit mais significativo (O.A.)?
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 4, 8, 16 e 32 bits de comprimento. É por isto que são usados vários nomes especiais para os dados binários dos referidos comprimentos. São eles, respectivamente: nibble, byte, word e double word (word duplo).
Q01.05 - Qual é o número do bit mais significativo num word? E num duplo word?
O bit mais significativo num word é o bit 15. O bit mais significativo num double word é o bit 31.
Q01.06 - Quantos bits há num byte?
Um byte é composto por 8 bits.
Q01.07 - Quantos bytes há num duplo word?
Um double word é composto por 4 bytes.
Q01.08 - Qual é o número do bit menos significativo num nibble?
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 como 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 Hexadecimal Binário 0 0000 8 1000 1 0001 9 1001 2 0010 A 1010 3 0011 B 1011 4 0100 C 1100 5 0101 D 1101 6 0110 E 1110 7 0111 F 1111
Q01.09 - Qual é o equivalente binário do hexa FEDC?
FEDC = 1111 1110 1101 1100
Q01.10 - Qual é o equivalente hexa do binário 11011010010010?
0011 0110 1001 0010 = 3692h
Q01.11 - Qual é o equivalente hexa do binário 100010010000101?
0100 0100 1000 0101 = 4485h
Q01.12 - Qual é o valor do bit O.A. do número de 16 bits 7F8C?
É 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 | 0 1 OR | 0 1 ------------- ------------ 0 | 0 0 0 | 0 1 1 | 0 1 1 | 1 1 XOR | 0 1 NOT | ------------- --------- 0 | 0 1 0 | 1 1 | 1 0 1 | 0
AND, OR e XOR são funções diádicas (precisam de dois operandos) e NOT é monádica. Por exemplo:
1 AND 1 = 1 0 OR 0 = 0 1 XOR 0 = 1 NOT 1 = 0
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 disto, realiza-se a operação desejada bit a bit:
100010 AND 1110001 = 010 0010 AND 111 0001 = 010 0000 11110000 OR 0101010 = 1111 0000 OR 0010 1010 = 1111 1010 10100101 XOR 11110000 = 1010 0101 XOR 1111 0000 = 0101 0101 NOT F4h = NOT 1111 0100 = 0000 1011 = 0Bh
Q01.13 - Calcule (FBh AND 54h)
FBh = 1111 1011 AND 54h = 0101 0100 -> 0101 0000 = 50h
Q01.14 - Calcule (12h OR 34h)
2h = 0001 0010 OR 34h = 0011 0100 -> 0011 0110 = 36h
Q01.15 - Calcule (5Ah XOR 5Ah)
5Ah = 0101 1010 XOR 5Ah = 0101 1010 -> 0000 0000 = 0h
Q01.16 - Calcule (NOT 4Fh)
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:
- Transformar o número em binário
- Inverter todos os bits com NOT
- Somar 1 ao resultado
- Converter o binário para o sistema original
Q01.17 - Transforme -FFFFh no número positivo correspondente.
FFFFh = 1111 1111 1111 1111 NOT = 0000 0000 0000 0000 + 1 = 0000 0000 0000 0001
Q01.18 - Transforme -(FACEh AND F0F0h) no número positivo correspondente.
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 = 0F40
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:
- A extensão com sinal do valor de oito bits FCh para 16 bits é FFFCh.
- A extensão com sinal do valor de 8 bits 7Fh para 16 bits é 007Fh.
- A extensão com sinal do valor de 16 bits 8000h para 32 bits é FFFFFF80h.
Q01.19 - Faça a extensão com sinal do valor de 8 bits 5Fh para 16 bits.
5Fh = 0101 1111 0000 0000 0101 1111 hexa = 005F
Q01.20 - Faça a extensão com sinal do valor de 8 bits 91h para 16 bits.
91h = 1001 0001 1111 1111 1001 0001 hexa = FF91
Q01.21 - Faça a extensão com sinal do valor de 16 bits 91h para 32 bits.
91h = 0000 0000 1001 0001 0000 0000 0000 0000 0000 0000 1001 0001 hexa = 0000 0091
Q01.22 - Faça a extensão com sinal do resultado de 16 bits de (01FFh AND FF81h) para 32 bits.
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, usada 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 - É possível fazer a contração do valor de 16 bits FF80h para uma valor de 8 bits?
FF80h = 1111 1111 1000 0000 80h = 1000 0000
Sim, o bit mais significativo permanece 1 e o valor original é mantido.
Q01.24 - É possível fazer a contração do valor de 16 bits 0102h para uma valor de 8 bits?
0102h = 0000 0001 0000 0010 02h = 0000 0010 Não, o bit mais significativo 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:
Q01.25 - Como extrair o bit de sinal de um número usando uma rotação para a esquerda e uma instrução AND?
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: padrão = Sxxx xxxx ROL 1 = xxxx xxxS 1 = 0000 0001 AND = 0000 000S
Q01.26 - Numa data armazenada no campo bit acima, quais as operações necessárias para extrair o valor do ano?
Os bits correspondentes ao ano ocupam as posições de 0 a 6. Basta fazer um AND 7Fh: padrão = xxxx xxxx xAAA AAAA 7Fh = 0000 0000 0111 1111 AND = 0000 0000 0AAA AAAA
Q01.27 - Numa data armazenada no campo bit acima, quais as operações necessárias para extrair o valor do mês?
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): padrão = xxxx xMMM Mxxx xxxx 78h = 0000 0111 1000 0000 AND = 0000 0MMM M000 0000 SHR 7 = 0000 0000 0000 MMMM
Q01.28 - Numa data armazenada no campo bit acima, quais as operações necessárias para extrair o valor do dia?
Os bits correspondentes ao dia ocupam as posições de 11 a 15. Umas das possibilidades é fazer 11 shifts para a esquerda (SHR 11): padrão = 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). padrão = 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 seguidas de um AND 1Fh. padrão = DDDD Dxxx xxxx xxxx ROL 5 = xxxx xxxx xxxD DDDD 1Fh = 0000 0000 0001 1111 AND = 0000 0000 000D DDDD
Q01.29 - Numa data armazenada no campo bit acima, qual é o padrão de bits para a data 12.01.04?
padrão = DDDD DMMM MAAA AAAA 0110 0000 1000 0100 hexa = 6084
Q01.30 - Quais as operações que você usaria para inserir o dia 20 na data acima?
padrão = 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úsculas e especiais |
1 | 1 | Minúsculas e especiais |
Q01.31 - Qual operação lógica é usada para converter minúsculas em maiúsculas?
minúsculas = 011x xxxx 5Fh = 0101 1111 AND = 010x xxxx = maiúsculas
Q01.32 - Qual operação lógica é usada para converter maiúsculas em minúsculas?
maiúsculas = 010x xxxx 20h = 0010 0000 OR = 011x xxxx = minúsculas
Q01.33 - Qual operação lógica é usada para transformar o caracter "5" no seu valor numérico?
caracter 5 = 0011 0101 (35h) Fh = 0000 AND = 0000 0101 = valor 5
Q01.34 - Qual operação lógica é usada para transformar o valor numérico 5 no caractere "5"?
valor 5 = 0000 0101 30h = 0011 0000 OR = 0011 0101 = 35h