2012-05-15 37 views
7

Pregunta rápida para ustedes, en mi ciclo Necesito usar CMP, BLT y BGT para comparar algunos valores. ¿Cómo usaría esas instrucciones en el siguiente ciclo?ARM Assembler - ¿Cómo uso CMP, BLT y BGT?

Estoy tratando de usar BGT, BLT y CMP cuando los necesito para hacer que mi aplicación funcione. El problema es que no tengo idea de cómo usarlos. Si quisiera usar CMP para comparar r6, con r4 y poner la diferencia en r7, ¿cómo lo haría? La misma pregunta si quería usar BLT si r7 es menor que 0, ¿cómo lo haría?

BGT ??????? ; branch if greater than 5 
    CMP ???????? ; compare r6 with r4 , put difference into r7 
    BLT ???????? ;branch if r7 is less than 0 
    BGT ???????? ;branch if r7 is greater than 0 

Aquí es toda mi bucle:

LoopStart 

    BL WaitBUT1 
    BL readTemp 
    BL checkTemp 
    BGT ??????? ; branch if greater than 5 
    BL errorVal 
    CMP ???????? ; compare r6 with r4 , put difference into r7 
    BLT ???????? ;branch if r7 is less than 0 
    BL FanOn 
    BL errorLedOn 
    BL systemLedOn 
    BL heaterOn 
    BGT ???????? ;branch if r7 is greater than 0 
    BL FanOff 
    BL errorLedOff 
    BL systemLedOff 
    BL heaterOff 
    BL WaitBUT2 
    BL FanOff 
    BL errorLedOff 
    BL systemLedOff 
    BL heaterOff 

    B LoopStart 
+0

Sus preguntas no están claras. Por favor aclara –

+1

He agregado una descripción más detallada a mi pregunta. – user1080390

Respuesta

9

No se puede hacer una bifurcación condicional sin establecer primero el registro de condición de alguna manera. Esto se puede hacer con cmp o agregando s a la mayoría de las instrucciones. Consulte la documentación del ensamblaje de ARM para más detalles. Ejemplo rápido:

Bifurcación si r0 mayor que 5:

cmp r0, #5 ;Performs r0-5 and sets condition register 
bgt label_foo ;Branches to label_foo if condition register is set to GT 

Compare r6 con r4, diferencia poner en r7, sucursal si r7 < 0:

subs r7, r6, r4 ;Performs r7 = r6 - r4 and sets condition register 
blt label_bar ;Branches to label_bar if r7 < 0 (in which case r6 < r4) 
1

si quería use CMP para comparar r6, con r4 y ponga la diferencia en r7, ¿cómo lo haría?

subs r7, r6, r4 /* r7 ← r6 - r4 */ 

La misma pregunta que si quería utilizar BLT si R7 es inferior a 0, ¿cómo voy a hacer esto?

bmi _exit   /* branch if r7 < 0 */ 

BMI (menos/negativo) cuando n es habilitado (N es 1), donde N es una bandera que se habilita si el resultado de la instrucción proporciona un número negativo. Deshabilitado de lo contrario.

¿Por qué subS en lugar de sub? Como S es un sufijo opcional que cuando se especifica, los indicadores de condición (como N) se actualizan en el resultado de la operación.

Atentamente.

Cuestiones relacionadas