LINGUAGEM ASSEMBLY
52 pág.

LINGUAGEM ASSEMBLY


DisciplinaTecnologias Web3.427 materiais10.209 seguidores
Pré-visualização11 páginas
principal através da pilha, utilizando o mecanismo de passagem de parâmetros visto 
neste material. 
 
17ª Questão: 
Escreva uma subrotina (TWOCP) em ASM-86 que calcule o complemento de dois de 
um valor de 32 bits contido nos registradores DX:AX. O valor complementado deve 
retornar no próprio par de registradores DX:AX. O conteúdo dos demais 
registradores não pode ser modificado por TWOCP. 
 
18ª Questão: 
Escreva uma subrotina (LOG) em ASM-86 que calcule o ln(x+1). O valor de x é um 
número inteiro menor do que 256, expresso em 16 bits e é passado a LOG pela 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 49 
pilha, usando o método apresentado neste material. O resultado deverá ser devolvido 
em 16 bits ao programa principal no registrador AX. Utilize a aproximação de Taylor: 
5432
)1ln(
5432 xxxxxx +\u2212+\u2212=+ 
Você já dispõe da subrotina POWER que eleva o conteúdo do primeiro parâmetro, 
ao valor do segundo parâmetro retornando o resultado em AX. Ambos os parâmetros 
são valores inteiros menores do que 256,expressos em 16 bits, passados através da 
pilha. POWER não altera o conteúdo de nenhum registrador a menos de AX. Se 
ocorrer overflow, seu programa deve retornar o valor zero. Crie uma variável 
temporária que contenha os valores parciais do cálculo do logaritmo. 
 
19ª Questão: 
Escreva uma rotina (INTER) em ASM-86 que determine a intersecção entre dois 
conjuntos de números de 8 bits. Os parâmetros de entrada são todos expressos em 
16 bits e são passados à rotina na seguinte ordem: endereço inicial do vetor 
contendo o primeiro conjunto, número de elementos do primeiro conjunto, endereço 
inicial do vetor contendo o segundo conjunto, número de elementos do segundo 
conjunto, endereço inicial do vetor contendo o conjunto intersecção. Além disso, a 
subrotina deve retornar em AX a cardinalidade do conjunto intersecção. Admita que 
não há repetições de números num mesmo conjunto, e que ambos os conjuntos têm 
pelo menos um elemento. 
 
20ª Questão: 
Escreva a rotina (MEDIA) em ASM-86 que calcule a média de n números (x1, x2, ..., 
xn) inteiros, sem sinal, expressos em um byte. Os parâmetros - endereço a partir de 
onde estão armazenados os números e n - são expressos em 16 bits e são 
passados a MEDIA pela pilha, conforme a convenção vista em aula. O resultado, de 
16 bits, deve ser passado ao programa principal pelo registrador AX. O flag Carry, 
deverá quando setado que houve overflow. 
 
21ª Questão: 
Escreva uma rotina (SORT) em ASM-86 que faça o sort dos bytes contidos num 
determinado vetor. O endereço inicial do vetor, bem como o número de elementos 
deste vetor, são passados à rotina pela pilha. Os elementos do vetor são números 
inteiros com sinal. Utilize variáveis auxiliares locais. 
 
22ª Questão: 
Escreva a rotina MAXIMO em ASM86 que determine o maior de um conjunto de n 
números inteiros sem sinal expressos em 16 bits. O valor de n, expresso em 16 bits, 
e os n bytes são passado a MAXIMO pela pilha, conforme o método discutido neste 
material. O maior valor encontrado deve retornar no registrador AX. Escreva a rotina 
de modo que todos os parâmetros de entrada sejam retirados da pilha antes de 
retornar ao programa principal. Utilize uma variável local para conter o valor máximo 
temporário. 
 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 50 
23ª Questão: Escreva uma subrotina (ESCALAR) em ASM-86 que execute o produto 
escalar entre dois vetores de inteiros de 16 bits com sinal. O tamanho dos vetores 
(expresso em 16 bits) e o endereço inicial de cada um dos dois vetores de entrada, 
bem como o do endereço do vetor de saída são passados à rotina pela pilha. O 
resultado deve retornar ao programa principal pelo registrador AX. Admita que não 
haverá overflow nos cálculos parciais. Utilize variável(eis) local(is). 
 
24ª Questão 
O programa abaixo soma as palavras contidas numa tabela armazenada na memória 
a partir do endereço TABLE, deixando o resultado no registrador AX. Codifique este 
trecho de programa em ASM86. 
 
 SUB AX,AX 
 MOV CX,25 ;carrega CX c/ tamanho da tabela 
 MOV SI,50 
ADD_NEXT: SUB SI,2 
 ADD AX,TABLE[SI] 
 LOOP ADD_NEXT 
 
25ª Questão 
Repita o exercício anterior para a rotina abaixo. Este programa controla um canal de 
comunicação assíncrono. 
 
USART_DATA EQU 0FF0H 
USART_STAT EQU 0FF2H 
 
CHAR_IN PROC NEAR 
 MOV DX,USART_STAT 
AGAIN: IN AL,DX 
 AND AL,2 
 JZ AGAIN 
 MOV DX,USART_DATA 
 IN AL,DX 
 RET 
CHAR_IN ENDP 
 
26ª Questão 
O programa abaixo é um gerador de números aleatórios. Repita o exercício anterior 
para este programa. 
 
SAVE DW ? ; o "offset" de SAVE é 000AH 
RANDOM PROC NEAR 
 MOV CX,2053 
 MUL CX 
 ADD AX,13849 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 51 
 MOV SAVE,AX 
 SUB DX,DX 
 MOV CX,6 
 DIV CX 
 MOV AX,DX 
 RET 
 
RANDOM ENDP 
 
27ª Questão: 
O programa abaixo calcula o fatorial de um número maior do que zero colocado em 
AX. Estime o tempo de execução da rotina abaixo em função do conteúdo de AX. 
Admita que os acessos a dados estão afetados de ciclos de espera, conforme a 
tabela abaixo: 
 leitura escrita 
dados na pilha 1 2 
dados fora da pilha 3 4 
 
FATORIAL PROC NEAR 
 CMP AX,1 
 JE ACABOU 
 PUSH AX 
 DEC AX 
 CALL FATORIAL 
 POP BX 
 MUL BX 
ACABOU: RET 
FATORIAL ENDP 
 
 
28ª Questão: 
Nas subrotinas descritas abaixo, ALFA é uma constante. Estime o tempo de 
execução das subrotinas em função de ALFA, desde o instante em que inicia sua 
execução até o momento em que ocorre o retorno ao programa principal. Observe se 
vale a pena utilizar as instruções de manipulação de string neste caso, do ponto de 
vista do desempenho. Admita que cada acesso de leitura ou escrita a dados é 
afetado respectivamente por um ou dois ciclos de espera. 
 
VERSAO_1 PROC 
NEAR 
 VERSAO_2 PROC NEAR 
 MOV CX,ALFA 
 MOV 
CX,ALFA 
 CLD 
 SUB BL,BL SUB BL,BL 
VOLTA: XOR BL,[SI] VOLTA: LODSB 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 52 
 INC SI XOR BL,AL 
 DEC CX LOOP VOLTA 
 JNZ VOLTA RET 
 RET 
VERSAO_1 ENDP VERSAO_2 ENDP 
 
 
29ª Questão: 
Escreva seqüências de instruções equivalentes a cada uma das instruções de 
manipulação de string. Determine em seguida o tempo de execução da instrução de 
"string" e da seqüência equivalente. Compare os resultados.