Dudas en este código en MPLAB

#1
PHP:
Bit8_cdu
    clrf    cen
    clrf    dec
    clrf    uni
    movf    dato,f
    btfss    status,z
    goto    no_es_cero_dato    
    return
    
no_es_cero_dato
    movlw    d'10'
    subwf    dato,w
    btfsc    status,c
    goto    dato_es_mayor_igual_a_10
    movf    dato,w
    movwf    uni
    return
dato_es_mayor_igual_a_10
    movlw    d'10'
    subwf    dato,f
    incf    dec,f
    movlw    d'10'
    subwf    dec,w
    btfss    status,z
    goto    no_es_cero_dato
    incf    cen,f
    clrf     dec
    goto    no_es_cero_dato
 
Última edición por un moderador:
#2
Ese código está en lenguaje ensamblador, MPLAB es un entorno de desarrollo.
¿Cuál es la duda?
 
#3
Mi duda es, cómo funciona al restarle respectivamente la centena, decena y unidad 10, es decir, evalúa si la última operación es igual a 0, pero cómo va almacenando cada cifra ya sea centena, decena o unidad que obtiene por la entrada? Gracias de antemano.
 
#4
Para entender el proceso del programa, necesitas estudiar las instrucciones del compilador.
También necesitas estudiar sobre los registros y para qué sirve cada bit de los mismos.

Espero que con el programa comentado lo puedas comprender.
PHP:
Bit8_cdu
    clrf    cen                            ; Limpiar la variable "cen" (La pone en 0)
    clrf    dec                            ; Limpiar la variable "dec" (La pone en 0)
    clrf    uni                            ; Limpiar la variable "uni" (La pone en 0)
    movf    dato,f                        ; Guardar "dato" en el acumulador F
    btfss    status,z                    ; Comparar el bit Z (Cero) del registro STATUS (Saltar si es 1)
    goto    no_es_cero_dato                ; Si está en 0, ir a "no_es_cero_dato"
    return                                ; Si está en 1, Regresar
    
no_es_cero_dato
    movlw    d'10'                        ; Cargar 10 en el acumulador W
    subwf    dato,w                        ; Se resta el valor de "dato" al acumulador W
    btfsc    status,c                    ; Comparar el bit C (Carry = Acarreo) del registro STATUS (Saltar si es 0)
    goto    dato_es_mayor_igual_a_10    ; Si está en 1, ir a "dato_es_mayor_igual_a_10"
    movf    dato,w                        ; Si está en 0, guardar "dato" en el acumulador W
    movwf    uni                            ; Mover el contenido del acumulador W a la variable "uni"
    return                                ; Regresar
dato_es_mayor_igual_a_10
    movlw    d'10'                        ; Cargar 10 en el acumulador W
    subwf    dato,f                        ; Se resta el valor de "dato" al acumulador F
    incf    dec,f                        ; Incrementar la variable "dec"
    movlw    d'10'                        ; Cargar 10 en el acumulador W
    subwf    dec,w                        ; Se resta el valor de "dec" al acumulador W
    btfss    status,z                    ; Comparar el bit Z (Cero) del registro STATUS (Saltar si es 1)
    goto    no_es_cero_dato                ; Si está en 0, ir a "no_es_cero_dato"
    incf    cen,f                        ; Si está en 1, incrementar la variable "cen"
    clrf    dec                            ; Limpiar la variable "dec" (La pone en 0)
    goto    no_es_cero_dato                ; Ir a "no_es_cero_dato"
 
#5
Vale, entonces para millares, tocaría seguir:
movlw d'10'
subwf dato,f
incf cen,f
movlw d'10'
subwf cen,w
btfss status,z
goto no_es_cero_dato1
incf mill,f
clrf cen
Te anexo códigos y simulación.
 

Adjuntos

Última edición:

Temas similares

Arriba