A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Tutoriais e Programação

AoA - Laboratório Cap.1

Qui

11

Jan

2007


20:25

(9 votos, média 4.11 de 5) 


Nível intermediário 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! wink

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

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

question 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

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

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

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

question Q01.06 - Quantos bits há num byte?

Um byte é composto por 8 bits.

question Q01.07 - Quantos bytes há num duplo word?

Um double word é composto por 4 bytes.

question 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

question Q01.09 - Qual é o equivalente binário do hexa FEDC?

FEDC = 1111 1110 1101 1100

question Q01.10 - Qual é o equivalente hexa do binário 11011010010010?

0011 0110 1001 0010 = 3692h

question Q01.11 - Qual é o equivalente hexa do binário 100010010000101?

0100 0100 1000 0101 = 4485h

question 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

question Q01.13 - Calcule (FBh AND 54h)

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

question Q01.14 - Calcule (12h OR 34h)

2h = 0001 0010 OR 34h = 0011 0100 -> 0011 0110 = 36h

question Q01.15 - Calcule (5Ah XOR 5Ah)

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

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

  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

question Q01.17 - Transforme -FFFFh no número positivo correspondente.

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

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

question 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

question 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

question 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

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

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

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

Dados compactados

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
Deslocamento para a direita
Shift para a esquerda
Deslocamento para a esquerda
Shift aritmético para a direita
Shift aritmético para a direita
Shift aritmético para a esquerda
Shift aritmético para a esquerda

question 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

question 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

question 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

question 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

question 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

question 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 6Bit 5Grupo
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

question 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

question 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

question 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

question 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

 

 

скачать игру покервиды сковородокооо полигон официальный сайтBroker MFXкак удалить отзыв с сайтанаружная реклама саратовлобановский александр

Informações adicionais