Comparar registro con un literal negativo

Buenas. Bueno mi inconveniente surge por que necesito comparar el valor de un registro con un número negativo para saber si hacer o dejar de hacer algo, ESTOY PROGRAMANDO EN ASSEMBLER. Para comparar valores uso lo siguiente

btfsc incrementa ;comprueba el estado del pulsador
goto baja ;se va a la etiqueta "baja"
movlw .31 ;mueve el valor decimal 31 al registro de trabajo
subwf volumen,w ;resta los registros
btfsc STATUS,Z ;comprueba el valor del bit Z
goto baja ;si es 1 se va hacia otra etiqueta
incf volumen ;si es 0 incrementa la variable "volumen"

Con un literal positivo no hay problema pero al querer comparar con un número negativo se complica ya que no puedo escribir movlw -7 por q no me lo toma. Si me dan alguna alternativa les estaría muy agradecido. saludos
 

Chico3001

Moderador
No lo hace por que el PIC no maneja numeros negativos... todo lo maneja en formato complemento a 2... asi que tendrias que convertirlo a ese formato para poder compararlo

7d = 0000 0111b -> 1111 1000b + 1b = 1111 1001b = F9h = 249d

compara contra 249 en decimal o F9 en hexadecimal y no deberias tener problema....

De wikipedia:

Una forma de hallar el opuesto de un número binario positivo en complemento a dos es comenzar por la derecha (el dígito menos significativo), copiando el número original (de derecha a izquierda) hasta encontrar el primer 1, después de haber copiado el 1, se niegan (complementan) los dígitos restantes (es decir, copia un 0 si aparece un 1, o un 1 si aparece un 0). Este método es mucho más rápido para las personas, pues no utiliza el complemento a uno en su conversión.1

Por ejemplo, el complemento a dos de «0011 11010» es «1100 00110»-

Otra forma es negar todos los dígitos (se halla el complemento a 1) y después sumar un 1 al resultado, viene a ser lo mismo que lo anteriormente explicado.

100001 ---> 011110 --> 011111
 
Última edición:
No lo hace por que el PIC no maneja numeros negativos... todo lo maneja en formato complemento a 2... asi que tendrias que convertirlo a ese formato para poder compararlo

7d = 0000 0111b -> 1111 1000b + 1b = 1111 1001b = F9h = 249d

compara contra 249 en decimal o F9 en hexadecimal y no deberias tener problema....

De wikipedia:

Mira lo probé así y no me anduvo el contador se pierde y me tira cualquier cosa.El mismo tiene que ir de un mínimo de -7 a un máximo de 7. No se como puedo implementar para que eso. El máximo es fácil establecerlo ya que es positivo pero el mínimo no se como.
 

Chico3001

Moderador
Mmmm estas cargando 249 en W y despues revisas Z... el resultado de la instruccion siempre sera que Z = 0 por que le cargaste 249

Código:
		btfsc	incrementa		;comprueba el estado del pulsador
		goto	baja2			;se va a la etiqueta mencionada
		movlw	.7				;mueve el literal alregistro de trabajo
		subwf	graves,w		;resta los registros
		btfsc	STATUS,Z		;comprueba el estado del bit Z
		goto	baja2			;si es 1 se mueve a la etiqueta
		incf	graves			;si es 0 incrementa el contador
;		movf	graves,W	;movemos el registro "graves" al registro W
;		call	Tabla_bass	;convertimos dato en byte
		;call	envia_dato	;llamamos a la subrutina de envio de datos
		goto	ver2
		
baja2	movlw	.249
		btfss	STATUS,Z
		goto	decre2
		goto	sigue2

Que es lo que quieres hacer?
 
Arriba