hacer un programa que sume 2 numeros BCD de 2 cifras sin saltos condicionales??

hola a todos lo siguiente es para ver si alguien me ayuda para un trabajo de sistemas embebidos que consiste en la suma de 2 numeros en BCD de dos cifras sin saltos condicionales en assembler; es alli donde se pone interesante la pelicula y la verdad es que no se como hacerlo tengo ideas pero no se como empezar.:cry:
 
la verdad no se pero yo creo que es sin tabla y con BCD comun

el profesor solo dio el enunciado y la condicion de que se haga sin los saltos condicionales
 
Última edición:
Cuando no se quiere/puede usar el condicional, hay que fabricarse un numero "conveniente" a partir del resultado de los registros de estado y sumarlo/restarlo/etc al valor que se tiene que corregir.

En este caso particular, lo mas conveniente es usar el bit de carry ( C ). El tipo de operacion a realizar es arbitraria (mientras el resultado este bien :) ).

Por ejemplo:
Usando como variables de entrada Num1_High,Num1_Low, Num2_High,Num2_Low y CARRY como variable auxiliar, el siguiente fragmento te hace:
Num1 = Num1 + Num2 en BCD
Si el resultado es mayor de 99, te devuelve la centena en CARRY.

Código:
[COLOR=Blue];------------------------------------------------------------
        movf  Num2_Low,0   ; W = Num2_Low
        addwf Num1_Low     ; Num1_Low = Num1_Low + Num2_Low
                           ; Si es > 9 hay carry y que ajustar                            
        movlw d'246
        addwf Num1_Low     ; Si > 9 se activa el bit C
        
        clrf  CARRY
        rlf   CARRY        ; Guardo el bit C en CARRY
        decf  CARRY,0      ;    W = 1111111 si CARRY = 0
                           ; y  W = 0000000 si CARRY = 1
        
        andlw d'10         ;    W = d'10  si CARRY = 0
                           ; y  W = 0     si CARRY = 1
        
        addwf Num1_Low     ; Se corrige el valor de Num1_Low

                           ; Resultado hasta aca:  
                           ;   Num1_Low = Num1_Low + Num2_Low  corregido a BCD
                           ;   CARRY    = acarreo                           
;------------------------------------------------------------
;  Ahora toca el 2do digito.
; 1ro se suma el CARRY de la suma anterior

        movf  CARRY,0 
        addwf Num1_High
                           
                           ; Lo mismo que antes...
        movf  Num2_High,0
        addwf Num1_High
        movlw d'246
        addwf Num1_High         
        clrf  CARRY
        rlf   CARRY
        decf  CARRY,0         
        andlw d'10
        addwf Num1_High
                           ; Resultado:  
                           ;   Num1_Low = Num1_Low + Num2_Low  corregido a BCD
                           ;   Num1_High = Num1_High + Num2_High + CARRY   corregido a BCD
                           ;   CARRY    = acarreo                           
                                                                         
;------------------------------------------------------------[/COLOR]

Esto es un ejemplo corto y horrible,
porque una este tipo de operaciones deben hacerse o bien con macros si son 1 o 2 digitos o llamando a una misma rutina que sume dos digitos+carry.


.
 
gracias eduardo por su ayuda se lo agradezco hermano. ahora una pregunta no entiendo cuando dices que llamar a una misma rutina que sume dos digitos+carry? y a que te refieres con macros? como te puedes dar cuenta apenas estoy aprendiendo sobre los pic y otra cosa el profesor mio esta es loco al ponernos trabajos asi jajaja
 
..ahora una pregunta no entiendo cuando dices que llamar a una misma rutina que sume dos digitos+carry?
Como haces una suma con "a mano"? --> Vas sumando de a dos numeros + el acarreo de la suma anterior.
Haciendo una sola rutina, se empieza poniendo en cero el acarreo y se la va llamando tantas veces como digitos tengas. Primero con las unidades, despues con las decenas etc.

y a que te refieres con macros?
Busca en el Help del MPLAB que es un macro.

En este caso quedaria algo asi:

Código:
;-- Definicion del MACRO --
SumaBCD   MACRO Dest,Num,Carry
        movf  Carry,0
        addwf Num,0
        addwf Dest,0
        addlw d'246
        movf  Dest                
        clrf  CARRY
        rlf   CARRY
        decf  CARRY,0
        andlw d'10
        addwf Dest        
        ENDM
;------------------------

........................
........................
........................

;-- Llamada al MACRO para realizar la suma.
        
        clrf  CARRY        
        SumaBCD  AL,BL,CARRY
        SumaBCD  AH,BH,CARRY

............................
............................
............................
 
buenos dias, estube montando el programa pero al simularlo y meterle el numero maximo "99+99" me da como resultado 49, gracias la atensión prestada

Tiene mal escrita un instruccion en el macro:

Código:
SumaBCD   MACRO Dest,Num,Carry   
        movf  Carry,0            
        addwf Num,0              
        addwf Dest,0             
        addlw d'246              
[B]        movf  Dest      <<<----  movwf  Dest  
[/B]        clrf  CARRY              
        rlf   CARRY              
        decf  CARRY,0            
        andlw d'10               
        addwf Dest               
        ENDM
Ahi devuelve 198 ; 1:carry 9:AH 8:AL

Pero el codigo anterior no devolvia 49 sino 1_99 --> Fijate si no tenes un error en la carga de los argumentos.
 
Última edición:
Atrás
Arriba