Motorola 6800 – Divisão Inteira

O Motorola 6800 não possui uma instrução específica para divisão de dois números. Uma solução simples é fazer a divisão através de múltiplas subtrações. Contudo, podemos pensar mecanismos mais eficientes. Uma solução  esta descrita no código-abaixo. Esse algoritmo é mais eficiente na maiora dos casos, pois com apenas 8 deslocamentos efetua a divisão de dois números de 8 bits.

O primeiro caso é quando temos números absolutos.

                LDAA Divisor       
                BEQ __end        ; caso Divisor = 0

                ; o contador ira deslocar 8 vezes,
                ; mas como já começo decrementando
                ; carrego com 9.

                LDAA #$09      
                STAA Contador
                CLRA
                BRA loop_div

empurra_zero:   ASL Resposta  

loop_div:       DEC Contador  ; decrementa contador
                BEQ __end

                ASL Dividendo ; desloca o dividendo p/ Carry
                ROLA          ; desloga do Carry p/ ACCA
                CMPA Divisor  ; Acumulador - Dividor > 0

                BCS empurra_zero

                SEC           ; set carry 
                ROL Resposta  ; empurra '1' na resposta
                SUBA Divisor
                BRA loop_div

__end:          NOP

Se os números forem sinalizados precisamos considerar isso na conta, portanto antes de dividir o número devemos verificar seu sinal. O código abaixo utiliza duas posições de memória para o sinal do número.  No final é feito uma OU-Exclusivo para definir qual sinal da resposta.

            CLR Neg_Divisor
            CLR Neg_Dividendo               
            LDAA Divisor
            BEQ __end        ; caso Divisor = 0
            BPL skip

            NEG Divisor
            DEC Neg_Divisor  ; Neg_Divisor = 1 (0xff)

skip:       LDAA Dividendo
            BPL __div        ; Neg_Dividendo = 1 (0xff)

            NEG Dividendo
            DEC Neg_Dividendo

            ; o contador ira deslocar 8 vezes, mas
            ; como já começo decrementando
            ; carrego com 9.

__div:          LDAA #$09      
                STAA Contador
                CLRA
                BRA loop_div

empurra_zero:   ASL Resposta  

loop_div:       DEC Contador   ; decrementa contador
                BEQ __end

                ASLA Dividendo ; desloca o dividendo p/ Carry
                ROLA           ; desloga do Carry p/ ACCA
                CMPA Divisor   ; Acumulador - Dividor > 0

                BCS empurra_zero

                SEC           ; set carry 
                ROL Resposta  ; empurra '1' na resposta
                SUB Divisor
                BRA loop_div

__end:          LDAA Neg_Divisor
                EORA Neg_Dividendo 
                ; a lógica da XOR garante o estudo dos sinais
                BPL _end 

                NEG Resposta          
_end:           NOP    

Uma resposta

  1. eeee… parece q tem alguem estudando micro 1 por aqui … eahuaehua

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: