por brasilma » 02 Out 2021 17:22
Tenho várias rotinas matemáticas em 24 bits que utilizava em um projeto, inclusive raiz
Vamos ver como fica a formatação...
; |##################################################################|
; ----=| DIVISAO 24:24 |=----------
; | INPUT= Dividendo R2, R3, R4 (MSB), Divisor R5, R6, R7 (MSB) |
; | OUTPUT= R5, R6, R7 (MSB) |
; | used regs: A, B, R2, R3, R4, R5, R6, R7, 08, 09, 0A, 0B, 0C, 0D |
; |##################################################################|
; Rotina de divisão 24:24bits dividendo em R2, R3 e R4 (MSB) e divisor (e resultados) R5, R6 e R7 (MSB)
; usa 08-0DH. Processo: desloca com carry o divisor para a esquerda ate obter carry (o 1 mais a esquerda
; estoura o byte mais significativo, isto faz com que o divisor obtenha o mesmo numero de casas do
; dividendo), conta-se qtos shifts são necessários (B guarda o valor), na sequencia começa a desloca-lo
; (divisor) novamente para a direita, e enquanto faz isso tenta subtrai-lo do dividendo; qdo for possível
; começa a deslocar o dividendo, da direita para a esquerda, pelo resultado ate zerar B.
DIV24_24: MOV B,#00h ; Limpa B, que ira contar o numero de deslocamentos a esquerda
MOV 0BH,#0 ; !não pode haver sujeira nestas posições!
MOV 0CH,#0
MOV 0DH,#0
DIV24_24L1: INC B ; INC a cada deslocamento do divisor (p/ assumir tamanho igual ao dividendo)
MOV A,R5 ; Desloca divisor a esquerda
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
JNC DIV24_24L1 ; Repete o deslocamento ate haver o carry
DIV24_24L2: MOV A,R7 ; Desloca divisor a direita
RRC A
MOV R7,A
MOV A,R6
RRC A
MOV R6,A
MOV A,R5
RRC A
MOV R5,A
CLR C ; Limpa carry que não e útil
MOV 0AH,R4 ; Copia do dividendo (MSB)
MOV 09H,R3
MOV 08H,R2
MOV A,R2 ; R2 = Dividendo (LSB)
SUBB A,R5 ; Dividendo - Divisor deslocado = carry (0 or 1)
MOV R2,A ; Guarda Dividendo resultante
MOV A,R3
SUBB A,R6
MOV R3,A
MOV A,R4
SUBB A,R7
MOV R4,A
JNC DIV24_24L3 ; Se não houve carry o resultado e 1 (Dividendo > Divisor)
MOV R4,0AH ; Se houve, o resultado e 0 (Dividendo ainda < Divisor)
MOV R3,09h ; Recupera valor original (antes da subtração) do Dividendo
MOV R2,08h
DIV24_24L3: CPL C ; Inverte o carry, o copia diretamente nos registro do resultado
MOV A,0BH ; e vai deslocando-o para a esquerda (O carry nesta situação e uma
RLC A ; copia do Dividendo)
MOV 0BH,A
MOV A,0CH
RLC A
MOV 0CH,A
MOV A,0DH
RLC A
MOV 0DH,A
DJNZ B,DIV24_24L2 ; Repete os deslocamentos e as subtrações ate zerar B
MOV R7,0DH ; Copia o resultado nos registros de saída
MOV R6,0Ch
MOV R5,0Bh
RET
" A Teoria orienta e a Prática decide"
