Algoritmo para dividir dos enteros en el sim8085

Algoritmo para dividir dos enteros en el sim8085

Una de las asignaturas más interesantes de mi formación universitaria fue la programación del microprocesador 8085. Eran unas prácticas que había que resolverlas en 1 hora y, si no precisabas correctamente el algoritmo que te pedían, se te podía convertir la práctica en una carrera de fondo contra el tiempo bastante estresante.

En cualquier caso, voy a ir dejando en una serie de artículos, los algoritmos que me requirieron en las prácticas de la asignatura. Podéis descargar los códigos desde mi repositorio en github.

Sin más preámbulo, os dejo los dos algoritmos para realizar una división en el microprocesador 8085.

Algoritmo de división 1

CPU "8085.TBL"
HOF "INT8"
ORG 1000H


       LDA 1800H   ; (1800) -> A   
       MOV B,A     ; A -> B        
       LDA 1801H   ; (1801) -> A   
       MOV C,A     ; A -> C        

       LDA 1900H   ; (1900) -> A    
       MOV D,A     ; A -> D        
       LDA 1901H   ; (1901) -> A   
       MOV E,A     ; A -> E        
 
       MVI M,00H   ; 0000H -> (HL) 

SIGUE: MOV A,C     ; C -> A        
       SUB E       ; A - E -> A    
       MOV C,A     ; A -> C        
       
       MOV A,B     ; B -> A        
       SBB D       ; A -D -CY -> A 
       MOV B,A     ; A -> B        

       INX H       ; HL + 1 -> HL  

       MOV A,B     ; B -> A        
       CMP D       ; COMPARACION   

       JZ PBAJA    ; SALTO COND. SI CERO (Z=1)        

       JC FIN      ; SALTO COND. SI ACARREO (CY=1)    
                   ;	                              
 
       JMP SIGUE   ; SALTO INCOND. 

PBAJA: MOV A,C     ; C -> A        
       CMP E       ; COMPARACION   

¿?jnc  JNC FIN     ; SALTO COND. SI NO ACARREO (CY=0) 
o jc
       JMP SIGUE   ; SALTO INCOND. 

FIN:   MOV A,H     ; H -> A        
       STA 1950H   ; A -> (1950)   
       MOV A,L     ; L -> A        
       STA 1951H   ; A -> (1951)   

       MOV A,B     ; B -> A        
       STA 1952H   ; A -> (1952)   
       MOV A,C     ; C -> A        
       STA 1953H   ; A -> (1953)   

       END;

Algoritmo de división 2

CPU "8085.TBL"
 HOF "INT8"
 ORG 1000h

        ; COPIAR LOS DATOS EN LAS POSICIONES DE MEMORIA
        XRA A

        ; DIVIDENDO
        MVI A, 0FFh
        STA 1800h
        MVI A, 0FFh
        STA 1801h

        ; DIVISOR
        MVI A, 22h
        STA 1900h
        MVI A, 22h
        STA 1901h

        XRA A

        ; DIRECCIONES DEL DIVIDENDO Y DEL DIVISOR.
        MVI B, 0FFh
        MVI C, 0FFh

        MVI D, 22h
        MVI E, 22h

        ; COMPROBAMOS SI SEE PUEDEN DIVIDIR
        MOV A, B
        CMP D
        JNC POSIC

POSIC:  XRA A           ; PONEMOS EL ACUMULADOR A 0
        STA 1950
        STA 1951
        STA 1952
        STA 1953

        ; RESTAMOS LOS NUMERO DE 16 BITS SUCESIVAMENTE HASTA QUE EL DIVIDENDO
        ; SEA MENOR QUE EL DIVISOR O CERO

        LXI H, 0000h

LOOP:   MOV A, C        ; MOVEMOS EL CONTENIDO DE C AL ACUMULADOR
        SUB E           ; RESTAMOS C - E
        MOV C, A        ; GUARDAMOS EL RESULTADO A C
        MOV A, B        ; MOVEMOS EL CONTENIDO DE B AL ACUMULADOR
        SBB D           ; RESTAMOS B - D
        MOV B, A
        INX H
        MOV A, B
        CMP D
        JC COMPAR2
        JC COMPAR2

COMPAR2:    MOV A, C
            CMP E
            JC RESUELVE
            JNC LOOP

        ; GUARDAR EL COCIENTE Y EL RESTO EN LAS POSICIONES INDICADAS
        ; COCIENTE
RESUELVE:       MOV A, H
                STA 1950h
                MOV A, L
                STA 1951h

        ; RESTO
                MOV A, B
                STA 1952h
                MOV A, C
                STA 1953h
                JMP SALIR
       
SALIR:  END

Conclusión

Dejo abierto la sección de comentarios para que me dejéis vuestra opinión, vuestras aportaciones, o bien, vuestros códigos alternativos.

No Comments

Post a Comment