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.
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; } }
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
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 |
mov al, y neg al ; y = - y add al, x ; x + (-y)mov ah, k add ah, ah ;k + k = 2 * kadd al, ahmov z, al
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
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:
- O resultado será sempre um número de 64 bits e será colocado em num1.
- Os números encontram-se armazenados no vector numeros, tal como se apresenta na figura;
- As partes menos significativas de cada número estão nas posições de índice mais baixo do vector.
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 |
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