LINGUAGEM ASSEMBLY
52 pág.

LINGUAGEM ASSEMBLY


DisciplinaTecnologias Web3.427 materiais10.209 seguidores
Pré-visualização11 páginas
base ou índice 
 
9 
 base + índice BX+SI ou BX+DI 
 BP+SI, BP+ DI 
7 
8 
 
 deslocamento BP+DI+deslocamento
+ base BX+SI+deslocamento
+ índice BP+SI+deslocamento
 BX+DI+deslocamento
11 
11 
12 
12 
 
Tabela 4: Tempo consumido no cálculo do endreço efetivo dos operandos em número 
de ciclos de relógio. 
 
 Além disso, deve-se acrescentar 4 ciclos de relógio para cada instrução que 
referencia uma palavra de 16 bits contida num endereço ímpar, pois o 8086 só é 
capaz de ler uma palavra de 16 bits num único acesso se o byte menos significativo 
da palavra estiver num endereço par. Se esta condição não for satisfeita, o 8086 gera 
dois acessos, cada um referenciando uma das duas metades da palavra. 
 Quando se utiliza um 8088 deve ser acrescentado 4 ciclos para todos os 
acessos a operandos de 16 bits, independentemente de estarem ou não 
armazenados em endereços pares. 
 Quando se utiliza um prefixo definindo um registrador de segmento diferente do 
"default", devem ser acrescentados mais dois ciclos de relógio. 
 O tempo total de execução de um trecho de programa pode ser obtido 
multiplicando-se o tempo de execução de cada instrução particular pelo número de 
vezes que ela é executada. A soma destes produtos produz uma estimativa otimista, 
mas bastante aproximada do valor real. 
 Vários fatores podem aumentar o tempo de execução relativamente a esta 
estimativa. Estes tempos admitem que as instruções estão disponíveis na fila de 
instruções assim que a EU está pronta para executá-las. Quando se tem uma 
sequência de instruções rápidas (com menos do que 2 ciclos de relógio) a fila de 
instruções pode esvaziar e obter-se um tempo de execução maior. 
 Um outro aspecto evidenciado no exemplo da seção anterior, é que a interação 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 46 
entre a EU e a BIU pode ter efeitos sobre o tempo de execução. Se a EU necessita 
buscar um operando da memória, ela poderá ter que esperar até que a BIU complete 
o acesso em andamento antes de iniciar o acesso solicitado pela EU. Eventuais 
ciclos espera no acesso a operandos podem também afetar o tempo de execução 
(vide exercício 27). 
 A partir de experimentos realizados pelo fabricante do integrado, concluí-se, 
contudo, que este método de estimativa produz valores próximo dos valores reais. Os 
tempos de execução para outros processadores da família podem ser obtidos nos 
data sheets específicos. O procedimento para estimativa é, contudo, 
aproximadamente o mesmo para todos eles. 
 
10 Exercícios 
1ª Questão 
Sejam m e k dois números hexadecimais de 32 bits armazenados respectivamente 
nos registradores DX:AX e CX:BX, de tal forma que AX e BX contém os 16 bits 
menos significativos de m e k respectivamente. Escreva um trecho de programa em 
ASM86 que subtraia k de m e coloque o resultado em DX:AX. Se m < k o resultado 
produzido deve ser zero. 
 
2ª Questão 
Repita o exercício anterior admitindo que m e k estão armazenados respectivamente 
a partir dos endereços MMMM e KKKK. DX:AX deve conter o resultado. 
 
3ª Questão: 
Escreva um trecho de programa em ASM86 que multiplique o conteúdo do 
registrador AL pelo conteúdo do registrador CL, deixando o resultado em AX. Você 
não poderá usar a instrução MUL ou IMUL. Utilize sucessivas adições. 
 
4ª Questão: 
Escreva um trecho de programa em ASM86 que divida o conteúdo do registrador DX 
pelo conteúdo do registrador AX, deixando o quociente inteiro em AX. Você não 
poderá usar a instrução DIV ou IDIV. Utilize sucessivas subtrações. 
 
5ª Questão: 
Escreva um trecho de programa em ASM86 que eleve o conteúdo do registrador AX 
ao conteúdo do registrador DX. O resultado de 32 bits deve ser colocado no par de 
registradores CX:AX. Caso o valor obtido não possa ser representado em 32 bits, o 
conteúdo de DX:AX deverá ser nulo. 
 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 47 
6ª Questão: 
Escreva um trecho de programa em ASM86 que zere todo o registrador AL, se o seu 
nibble2 menos significativo for igual a zero e carregue o valor 0FFH em AL, caso 
contrário. 
 
7ª Questão: 
Escreva um trecho de programa em ASM86 que produza nos bits de ordem ímpar os 
correspondentes bits do registrador BL, e nos bits de ordem par de AL os 
correspondentes bits de CL. 
 
8ª Questão: 
Escreva um trecho de programa em ASM86 que produza nos bits de ordem par de 
AL o ou exclusivo dos bits correspondentes dos registradores BL e CL, e nos bits de 
ordem ímpar mantenha o mesmo valor inicial. 
 
9ª Questão: 
Escreva um trecho de programa em ASM86 que faça o ou exclusivo entre os dois 
nibbles2 do registrador AL. 
 
10ª Questão: 
Escreva um trecho de programa em ASM86 que transforme um número em formato 
BCD armazenado em AL no seu correspondente valor hexadecimal Você não pode 
usar as instruções de multiplicação, divisão, e de ajuste a BCD. 
 
11ª Questão: 
Escreva um trecho de programa em ASM86 devolva no registrador CL a paridade do 
conteúdo de AX, isto é, se o número de 1s em AX for ímpar, CL=0, e CL=1, caso 
contrário. 
 
12ª Questão: 
Você tem uma região da memória no segmento apontado por DS do tipo: 
BUFFER DB 80 DUP(?) 
onde são armazenados strings de caracteres vindos de um teclado. Um string pode 
ter no máximo 80 caracteres e é sempre terminado pelo caracter &quot;CR&quot; (0DH). 
Escreva uma subrotina em ASM86 que determine o tamanho do string desta região. 
Admita que os registradores de segmento estão convenientemente carregados. 
 
13ª Questão: 
A tabela abaixo é construída de tal maneira que o conteúdo de i-ésimo elemento é 
exatamente o correspondente código EBCEDIC de i, onde i está codificado em 
ASCII. 
CONV_TAB DB 64 DUP(0H) 
 DB 1 20H 
 DB 9 DUP(0H) 
 
2 Nibble é o termo em inglês que denota os quatro bits de cada uma das metades de um byte. 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 48 
 DB 7 'ç','.','<','(','+',0h,'&' 
 D B 9 DUP(0H) 
 DB 8 '!','$','*',')',';',' ','-','/' 
 DB ..... 
 
Você tem ainda duas regiões da memória no segmento apontado por DS do tipo: 
 
BUFFER_ASCII DB 80 DUP(?) 
BUFFER_EBCDIC DB 80 DUP(?) 
 
Na primeira região são armazenados strings de caracteres vindos de um teclado. Um 
string pode ter no máximo 80 caracteres e é sempre terminado pelo caracter &quot;CR&quot; 
(0DH). Escreva um programa em ASM86 que coloque na segunda região de 
memória o string produzido pelo teclado, devidamente traduzido para o código 
EBCDIC. 
 
14ª Questão: 
Embora o 8086/8088 possua instruções de multiplicação e divisão inteira, escreva 
um programa (MULT) que multiplique dois números inteiros sem sinal m, 
armazenado em AH, e k, armazenado em AL, utilizando o seguinte algoritmo 
 
MULT(m,k)=[(k x 20 x m0]+[(k x 21 x m1]+...[(k x 27 x m7] 
 
O resultado deve estar no registrador AX. 
 
15ª Questão: 
Escreva um programa que divida o conteúdo de AX pelo conteúdo de AL, utilizando 
algoritmo análogo ao do exercício anterior, sem usar as instruções de divisão do 
8086/8088. O quociente deve ser colocado em AL e o resto em AH. 
 
16ª Questão: 
Escreva uma rotina (SROT) que tome o parâmetro de entrada, um valor de 16 bits, e 
troque de posição o byte mais e o byte menos significativo, retornando este valor em 
AX. O parâmetro de entrada é passado para a subrotina SROT pelo programa