Conjunto de Problemas

1. Conversão para BCD

Escreva uma subrotina (denominada CONVBCD) que receba um número de 0 (0h) a 99 (63h) no registrador A e retorne, também pelo registrador A, o número representado em BCD.

Exemplo

	MOV A, #024d
	CALL CONVBCD  ; Chama a subrotina que voce deve criar
	; Agora A deve conter #024h

2. Fatorial recursivo

Escreva uma subrotina (denominada FATORIAL) que receba um número de 8 bits no registrador A e retorne, pelos registradores B e A, a parte mais significativa e menos significativa, respectivamente, do fatorial em 16 bits do número recebido.

Sua subrotina deve ser recursiva. Ou seja, ao receber como argumento um número n diferente de zero, a subrotina deve, antes de tudo, chamar a si mesma passando como argumento n-1. Depois disso, ela deve multiplicar o valor resultante por n (note que essa é uma multiplicação de 16 bits por 8 bits) e retorná-lo.

Apesar de esse método de implementar o fatorial ser muito menos eficiente que um loop, esse exercício serve para entender como uma subrotina recursiva pode ser implementada no Assembly do 8051.

Exemplo

	MOV A, #03h
	CALL FATORIAL	; Chama a subrotina que voce deve criar
	; Agora A deve conter 6, e B deve conter 0

3. Sequencia de Fibonacci

Escreva uma subrotina (denominada FIBO) que receba pelo registrador R0 um número n de 8 bits e retorne, pelos registradores R1 e R2, a parte mais significativa e menos significativa, respectivamente, do enésimo elemento da Sequencia de Fibonacci em 16 bits.

Os dois primeiros elementos da Sequencia de Fibonacci valem 1. Os elementos seguintes são iguais à soma dos dois elementos imediatamente anteriores. O início da sequencia é: 1 1 2 3 5 8 ...

Exemplo

	MOV R0, #06h
	CALL FIBO	; Chama a subrotina que voce deve criar
	; Agora R2 deve conter 8, e R1 deve conter 0

4. Crivo de Erastótenes

Esse é um método bastante rápido para encontrar números primos. Utilize os endereços 7000h a 70FFh da memória externa para armazenar o crivo. O crivo é uma tabela cujo cada byte, ao final do seu programa, deve conter 0 se a posição corresponder a um primo, e 1 caso contrário.

Comece inicializando toda a região do crivo com 0. Depois, comece a percorrer desde a posição correspondente ao número 2 (7002h) até a última posição do crivo (70FFh). Se a posição atualmente percorrida contiver 1, não é necessário fazer nada, pode-se passar para a próxima posição. Se contiver 0, é necessário marcar com 1 as posições correspondentes aos múltiplos do número atual.

Por exemplo, quando o programa percorrer a posição correspondente ao número 2 (7002h), esta conterá 0, indicando que os múltiplos devem ser marcados. Portanto, será gravado o byte 1 em todas as posições pulando de 2 em 2 até o final do crivo (7004h, 7008h, 700Ah, ..., 70FEh).

5. Fábrica de açúcar

Mirko trabalha em uma fábrica de açúcar como entregador. Ele acabou de receber um serviço: ele tem de entregar exatamente N kg de açúcar para uma loja de doces. Mirko pode usar dois tipos de pacotes, os que contém 3 kg, e os que contém 5 kg de açúcar.

Mirko gostaria de levar o menor número possível de pacotes. Por exemplo, se ele tem de entregar 18 kg de açúcar, ele poderia usar seis pacotes de 3 kg. Mas seria melhor usar 3 pacotes de 5 kg e um único pacote de 3 kg, resultando em um total de 4 pacotes.

Ajude Mirko a criar uma calculadora de bolso com um microprocessador 8051 para encontrar o menor número de pacotes necessário para transportar exatamente N kg de açúcar.

Crie uma subrotina denominada PACOTES que receba pelo registrador A a quantidade de kg de açúcar que devem ser entregues (Mirko pode requisitar valores somente de 3 até 255). A subrotina deve retornar, no registrador R0, o número mínimo de pacotes que Mirko deve usar. Se for impossível entregar exatamente N kg, retorne o valor 0.

Exemplo

	MOV A, #04d
	CALL PACOTES
	; Aqui R0 deve conter 0

	MOV A, #09d
	CALL PACOTES
	; Aqui R0 deve conter 3

	MOV A, #018d
	CALL PACOTES
	; Aqui R0 deve conter 4