Resolução do Teste

Frequência - 5 de Fevereiro 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. Dado o seguinte programa em linguagem C, converta-o para linguagem Assembly.
    void funcao(int* a)
    {
        a = a - 2;
    }
    void main()
    {
        int a, i;
        for ( i=0;i<=10;i++ )
        {
            a = i;
            funcao(a);
            if ( a <= 0 )
                a = 0;
        }
    }

    Resolução:

    jmp frente
    funcao: proc
        sub bx, 2	; subtrai o apontador
    ret
    frente:
        mov cx, 11	; contador: de 0 a 10 são 11 iterações
        mov al, 0	; al = i
        ciclo:
            mov ah, al	; ah = a
            lea bx, a	; apontador para a
            call funcao
            cmp ah, 0	; if...
            jg teste	; a > 0 salta para teste
            mov ah, 0	; else
        teste:
            inc al		; incrementa i
            loop ciclo
  1. Escreva um programa que calcule a expressão Z = X - Y + 2K.
  2. Pressuponha que Z, X, Y e K são variáveis previamente definidas, e que dispõe apenas das instruções:

    ADD SHL MOV
    NOT SHR XCHG
    NEG ROR JMP
    DIV ROL CMP

        Resolução:

mov al, y
neg al		; y = - y
add al, x	; x + (-y)
mov ah, k
add ah, ah	;k + k = 2 * k
add al, ah
mov z, al
  1. Tenha em consideração o seguinte excerto dum programa Assembly.
  2. 	texto db	"*Teste de AC*"
    	linha	db	41 dup(0)

    Escreva um programa que preencha a string linha com o texto existente em texto. Depois de executar o programa, o vector linha deverá conter:

            "*Teste de AC**Teste de AC**Teste de AC**", 0

    Resolução:

    lea bp, linha	; apontador para linha
    mov dx, 41	; comprimento de linha
    repetir_texto:
        lea bx, texto	; apontador para texto
        mov cx, 13		; comprimento de texto
        ciclo_texto:
            mov al, [bx]
            mov [bp], al
            inc bx
            inc bp
            dec dx	; menos uma posicao para preencher em linha
            jz fim	; se acabaram as posicoes em linha
        teste_texto:
            loop ciclo_texto
    ciclo_2:
        mov cx, dx
        loop repetir_texto
    fim:
  3. Escreva um programa que adicione 3 números de 64 bits (num1, num2 e num3).

25

A8

32

45

B4

C2

C7

90

89

7F

2A

56

B4

38

D1

4D

32

2E

12

3C

1B

BB

95

67

num1

num2

num3

        Resolução:

	lea bx, numeros	; apontador num1
	mov bp, bx
	add bp, 8	; apontador para num2
	mov si, bx
	add si, 16	; apontador para num3
	mov cx, 8	; numero de bytes por numero
	clc		; coloca zero na flag de carry
	ciclo:
		mov ax, [bx]	; word de num1
		adc ax, [bp]	; soma com word de num2 mais o carry
		adc ax, [si]	; soma com word de num3 mais o carry
		mov [bx], ax	; coloca em num1 o resultado da soma das tres words
		add bx, 2	; dois bytes adiante em num1
		add bp, 2	; idem para num2
		add si, 2	; idem para num3
	teste_ciclo:
		loop ciclo

Última actualização: 02 Maio 2005

ÍndiceAC - Testes e Resoluções