Buenas pues tengo un programa que tiene que hacer una suma una multiplicación y una resta (la función es : Y=2(A+B)-C), si el resultado me da correcto siempre y cuando no sea negativo el resultado, por ejemplo hago:Y=2(1+4)-6 me sale 4
pero si hago: Y=2(1+3)-10 me da 252
aqui os dejo el código a ver si veis algo raro:
Uso MPLAB para programarlo y simularlo.
Gracias
Fox_Neo[/size]
pero si hago: Y=2(1+3)-10 me da 252

aqui os dejo el código a ver si veis algo raro:
Código (mpasm) [Seleccionar]
list p=16F84 ;indicamos el pic que se vaa usar
include "P16F84.INC";indicamos la librería del PIC que tiene que cargar
REGA equ 0x11 ;Damos un nombre a esta posición de memoria REGISTRO A
REGB equ 0x12 ;Damos un nombre a esta posición de memoria REGISTRO B DE USUARIO
REGC equ 0x13 ;Damos un nombre a esta posición de memoria REGISTRO C DE USUARIO
REGY equ 0x14 ;Damos un nombre a esta posición de memoria REGISTRO DE USUARIO DE RESULTADO
REGAUX equ 0x15 ;Este registro lo vamos a usar para almacenar temporalmente resultados de pasos de operaciones intermedias
org 0x00 ;vector de reset
goto inicio
org 0x05 ;el programa empieza en la posición 5 de la memoria
;*********************
;INICIO DE PROGRAMA
;*********************
inicio MOVLW 0X01 ; Como no se puede cargar directamente un valor a una posición de memoria cualquiera, es necesario cargarlo previamente primero en el registro REGW
MOVWF REGA ;Ahora si se puede mover el valor de REGW a una posición de memoria deseada
MOVLW 0X02 ;Con los siguientes pasa lo mismo
MOVWF REGB
MOVLW 0X0A
MOVWF REGC
;______________________________
BUCLE ; es necesario poner un bucle para que no finalice el programa el programa
;Suma de A+B
MOVF REGA,0 ;CARGA EL VALOR REGA EN W
ADDWF REGB,0 ;SUMA EL VALOR DE W + REGB Y COMO ES 0 SE GUARDA EN W
MOVWF REGAUX ;EL VALOR DE LA SUMA ESTÁ EN EL REGISTRO AUXILIAR como ahora vamos a necesitar usar el registro REGW lo movemos a una posicón de memoria temporal
;Multiplicación 2(A+B) ->(A+B)+(A+B)
ADDWF REGAUX,1 ;SUMA EL VALOR DE W + REGAUX Y COMO ES 0 SE GUARDA EN REGAUX. Como el valor de A+B ya lo teníamos en REGW y tiene el mismo valor que el REGAUX si se suman ambos será como una multiplicación.
MOVF REGC,0 ;CARGA EL VALOR DE REGC EN W PARA PODER HACER LA RESTA Y=REGAUX-C ya que la instrución hace la resta en dirección contraria: F-W
;resta 2(A+B)-C
SUBWF REGAUX,0 ;REALIZA LA RESTA Y LO GUARDA EN W
MOVWF REGY ;CARGAMOS EL RESULTADO EN LA POSICIÓN REGY
GOTO BUCLE ; Devuelve a donde esté la palabra bucle
END ; fin de programa
Uso MPLAB para programarlo y simularlo.
Gracias
Fox_Neo[/size]