Exame de Recurso - 13 de Setembro de 1999
Nota: As soluções apresentadas são apenas uma forma de resolver os exercícios, poderão existir outras igualmente válidas e eficientes.
1. Faça um programa que dado um ARRAY de bytes sem sinal, de comprimento LEN, some os elementos do vector que sejam diferentes de VALOR e guarde o resultado na variável RESULT.
Exemplo:
ARRAY =
| 1 | 3 | 4 | 3 | 1 | 2 | 2 | 3 |
LEN = 8
VALOR = 3
RESULT = 10
LEN DB ? VALOR DB ? RESULT DB ? ARRAY DB ?
inicio: lea BX, ARRAY mov CX, LEN mov AL, VALOR xor DL, DL ; DL faz de acumulador
ciclo: mov AH, [BX] cmp AL, AH je salto add DL, AH salto: inc BX loop ciclo
mov RESULT, AH
2. Desenvolva um programa em Assembly que converta o valor (representado em segundos) situado na posição de memória TEMPO (correspondente a uma word) para horas, minutos e segundos a colocar nas posições de memória HOR, MIN, SEG (correspondentes a bytes sem sinal).
TEMPO DW ? HOR DB ? MIN DB ? SEG DB ?
SEGHORA EQU 3600 ; 3600 segundos = 1 hora SEGMIN EQU 60 ; 60 segundos = 1 minuto
inicio: mov AX, TEMPO xor DX, DX mov BX, SEGHORA div BX ; AX = AX:DX / BX, DX = AX:DX mod BX mov HOR, AL ; AX =< 0ffh logo AX = AL
mov AX, DX mov BL, SEGMIN div BL ; AH = AX / BL, AL = AX mod BL mov MIN, AL mov SEG, AH
3. Considere as seguintes variáveis: VARA e VARB - bytes sem sinal; VARC - word sem sinal. Considere três registos do processador 8086, aqui designados por VARX, VARY e VARZ. Escreva um programa que implemente o seguinte algoritmo:
VARA DB ? VARB DB ? VARC DW ?
; AX = VARX ; BL = VARY ; DX = VARZ
inicio: mov AL, VARA xor AH, AH mov BL, VARB xor DX, DX
mov cx, 8
ciclo: shr BL, 1 jnc nada ADD DX, AX nada: shl AX, 1 loop ciclo
mov VARC, DX
4. Faça um programa que conte quantos dígitos pares e ímpares tem um determinado número. Considere que esse número é de 16 bits. O número encontra-se na posição de memória NUM, colocando o total dos dígitos pares em PARES (variável de 8 bits) e o total dos dígitos ímpares na posição de memória IMPARES (variável de 8 bits).
Exemplo:
NUM= 23453
PARES = 2
IMPARES = 3
NUM DW ? PARES DB ? IMPARES DB ?
inicio: mov AX, NUM mov BL, 10 ; base decimal
ciclo: div BL ; AH = AX / BL, AL = AX mod BL shr AL, 1 ; teste ao lsb (less significative bit) jc impar ; se for um o algarismo é impar... inc PARES ; ... se não, é par jmp teste impar: inc IMPARES teste: cmp AH, 0 jne ciclo
Última actualização: 02-05-2005