------------------------------------------------------------------------------------------------------------------------------------- -- Exemplo de um arquivo de entrada de dados. -- -- Um comentario tem inicio com '--' ou apos a coluna 20 -- -- A primeira coluna contem o endereco de um dado e a segunda coluna a instrucao. -- -- Tome cuidado com nas instrucoes que ocupam duas posicoes de memoria consecutivas como: 'LDmS,mm', 'Jump,mm' -- Nestes casos, nao esqueca de reservar uma posicao de memoria logo apos a instrucao para que o dado seja armazenado. -- -- Dados num endereco podem ser identificados na forma: Endereco H#valor. Note: somente na base hexadecimal e' permitida -- ------------------------------------------------------------------------------------------------------------------------------------- -- Programa exemplo: multiplicacao de valores de 8 bits positivos -- Chamada da subrotina: -- Posicoes de memoria: A1 = dado_a (8 bits) -- Posicoes de memoria: A5 = dado_b (8 bits) -- Posicoes de memoria: AE = resultado (8 bits mais significativos) AF = resultado (8 bits menos significativos) -- -- Pseudo-codigo: -- Limpa 'resultado_parcial', posicoes A2 e A3 -- Limpa posicao A0 -- Repita 8 vezes: -- Desloca dado_b para direita e verifica se o bit deslocado = 1 -- Se = 1: 'resultado' <= 'resultado_parcial' +'dado_a' -- 'resultado_parcial' <= 'resultado' -- Desloca 'dado_a' para esquerda -- -- -- Posicoes de memoria empregadas: -- A0 armazena dado_a deslocado para esquerda (1 bit a cada iteracao) -- A1 dado_a (8 bits) -- A2 resultado_parcial_H (8 bits mais significativos) -- A3 resultado_parcial_L (8 bits menos significativos) -- A5 dado_b (8 bits) -- A6 contador de iteracoes -- A7 armazena valor 1 para decrementar contador de iteracoes -- AE resultado_H (8 bits mais significativos) -- AF resultado_L (8 bits menos significativos) ------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------- -- Prepara o ponteiro da pilha e pagina dos registradores ------------------------------------------------------------------------------------------------------- 00 LDmS,FF -- Sp <= FF (inicia o ponteiro de pilha com valor FF) 01 02 LDmP,A -- Pg <= A (inicia o registrador de pagina com valor A) 03 Call,23 (chama subrotina de soma) 04 05 Halt -- (fim do programa) ------------------------------------------------------------------------------------------------------- -- Subrotina de Multiplicacao de dois numeros positivos de 8 bits ------------------------------------------------------------------------------------------------------- -- Prepara contador de iteracoes i, endereco A6 -- Armazena valor 1 na posicao A7 -- Limpa 'resultado_parcial' (16 bits) para primeira iteracao, enderecos A2 e A3 -- Limpa posicao A0, empregada para acumular 'dado_a' deslocado -- Limpa posicoes AE,AF, empregadas para o resultado final 23 LDmA,08 -- numero de iteracoes do contador 24 25 STdA,6 -- armazena valor na posicao A6 26 LDmA,01 -- numero 1 27 28 STdA,7 -- armazena valor na posicao A7 29 SBdA,7 -- zera acumulador, Acc <= Acc - [A7] 2A STdA,2 -- valor de Acc armazenado nas posicoes: A2, A3, A0, AE e AF 2B STdA,3 2C STdA,0 2D STdA,E 2E STdA,F -- Desloca 'dado_b' para direita e verifica se bit menos significativo e' igual a 1 -- Caso ele seja igual a 1, uma soma parcial e' executada 2F SRdA,5 -- Desloca para direita 'dado_b' 30 STdA,5 -- Armazena resultado deslocado 31 JP_C,35 -- Se ocorreu carry, salto para executar uma soma parcial 32 33 Jump,3B -- Menos significativo de 'dado_b' igual a 0, deslocar 'dado_a' 34 35 Call,0A -- soma 36 -- Transfere o resultado da soma para posicoes que acumulam o resultado parcial 37 LDdA,E -- Byte mais significativo da operacao de soma 38 STdA,2 -- Acumula no resultado parcial das somas: 'parcial_H' (posicao A2). 39 LDdA,F -- Byte menos significativo da operacao de soma 3A STdA,3 -- Acumula no resultado parcial das somas: 'parcial_L' (posicao A3). -- Deslocamento para esquerda de 'dado_a' (16 bits) 3B SLdA,0 -- Desloca byte mais significativo de 'dado_a': dado_a_H (posicao A0). 3C STdA,0 3D SLdA,1 -- Desloca byte menos significativo de 'dado_a': dado_a_L (posicao A1). 3E STdA,1 3F JP_C,50 -- Se ocorreu carry no deslocamento, adiciona 1 ao byte mais significativo 40 -- De i=8 Ate 0 Repita 41 LDdA,6 -- [A6]= valor atual de i 42 SBdA,7 -- [A7]= 1, valor de decremento 43 STdA,6 -- armazena valor decrementado 44 JPNZ,2F -- se zero fim da iteracao de i => fim da subrotina 45 46 Retn -- Fim da multiplicacao -- Insere 1 no bit menos significativo de 'dado_a' 50 LDmA,01 -- Prepara Acc 51 52 ADdA,0 -- Soma insere '1' no bit menos significativo de 'dado_a_H'. LSB de 'dado_a_H' igual a zero devido ao deslocamento 53 STdA,0 54 Jump,41 -- Retoma operacao 55 ------------------------------------------------------------------------------------------------------- -- Subrotina de Soma de dois numeros de 16 bits ------------------------------------------------------------------------------------------------------- -- Transfere dado_b_H para posicao de rascunho A4 0A LDdA,2 -- Acc <= [A2] (Acc <= dado_b_H) 0B STdA,4 -- [A4] <= Acc ([A4] <= dado_b_H) -- Soma entre dado_a_L e dado_b_L 0C LDdA,1 0D ADdA,3 0E STdA,F -- ([AF] <= dado_a_L + dado_b_L) -- Se Carry, posicao A4 (que contem dado_b_H) e' incrementada 0F JP_C,15 10 -- Soma entre dado_a_H e dado_b_H e Carry 11 LDdA,0 12 ADdA,4 13 STdA,E -- ([AE] <= dado_a_H + dado_b_H + Carry) 14 Retn -- (Fim da subrotina) -- Incremento de dado_b_H devido ao Carry 15 LDmA,01 -- Acc <= 01 (Valor do Carry a ser adcionado a dado_b_H) 16 17 ADdA,4 -- (([A4] <= dado_b_H + Carry) 18 STdA,4 19 Jump,11 -- (Retorna a operacao de soma) ------------------------------------------------------------------------------------------------------------ A1 H#55 -- dado_a = 85 A5 H#AA -- dado_b = 170 -- AE,AF = 38,72 = 14450 -- -- A1 H#AA -- dado_a = 170 -- A5 H#A2 -- dado_b = 162 -- AE,AF = 6B,94 = 27540 -- -- A1 H#FF -- dado_a = 255 -- A5 H#00 -- dado_b = 0 -- AE,AF = 00,00 = 0 -- -- A1 H#00 -- dado_a = 0 -- A5 H#FF -- dado_b = 255 -- AE,AF = 00,00 = 0 -- -- A1 H#55 -- dado_a = 85 -- A5 H#AA -- dado_b = 170 -- AE,AF = 38,72 = 14450 -- -- A1 H#AA -- dado_b = 170 -- A5 H#55 -- dado_a = 85 -- AE,AF = 38,72 = 14450