¿Cómo funciona la instrucción BRGE en ensamblaje? ¿Por qué este código no funciona correctamente?

3
.cseg
ldi r16, 0x01
ldi r17, 0x01


add r16,r17
cpi r16,0xFF
brge greater
jmp less


greater:inc r1
        jmp done

less:   jmp done

done: jmp done

Estoy escribiendo un código de ensamblaje en AVR studio 4, y no estoy seguro de cómo funciona la sucursal. Cuando comparo r16 (que debería tener el valor 2) con el valor 255 en hexadecimal, la rama brge (mayor o igual que) salta a la etiqueta "mayor", que luego incrementa r1 para indicar que el valor fue mayor que 255 . Esto no tiene sentido ya que 2 no es mayor que 255. ¿Qué estoy haciendo mal?

    
pregunta MrWiseguy818

1 respuesta

9

BRGE es una instrucción de rama firmada, lo que significa que interpreta los argumentos como los números firmados están representados en Complemento de dos  formato. Para los números de 8 bits, los valores de dos complementan el rango de -128 ( 1000 0000 ) a +127 ( 0111 1111 )

Para que su código funcione según lo previsto con los literales hexadecimales, debe utilizar el operador de comparación de rama no firmado BRSH , que hace una comparación de sin signo .

Para consultar todas las instrucciones de sucursales disponibles, puede consultar esta lista en el sitio web de la atmel

La mayoría de las instrucciones de bifurcación funcionarán al verificar un indicador de estado establecido por operaciones anteriores, BRGE y BRSH verifican el indicador firmado y el indicador de acarreo, respectivamente. La conveniencia de los dos números con signo del complemento (que explota la arquitectura) es que las operaciones aritméticas se realizan de manera idéntica a los números sin signo, por lo que solo se trata de cómo interpreta los operandos y los resultados. El comando cpi es independiente de los números firmados o no firmados y establecerá ambos indicadores para la comparación . La instrucción de bifurcación verificará una u otra

    
respondido por el crasic

Lea otras preguntas en las etiquetas