Resolução do Teste

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.

AC - Testes e Resoluções


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

Resolução:

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

Resolução:

	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:

Resolução:

	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

Resolução:

	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

ÍndiceAC - Testes e Resoluções