tutorial raspberry instruction ensamblador data assembly arm

assembly - instruction - ensamblador en raspberry pi



EjecuciĆ³n condicional para "Y" en la sintaxis de ARM (2)

Así que creo que he encontrado una solución para mi problema. Para aquellos que también pueden necesitar esta ayuda. Tuve un profesor que me ayudó por suerte.

Entonces digamos que el código es:

if ( (R0 > 5) && (R2 != R3) ) ; != means not equal, && mean AND { R4-- ; // R4 = R4 - 1 }

La solución condicional de ARM podría ser:

CMP R0, #5 BLE Somewhere CMP R2, R3 SUBNE R4, #1 Somewhere:

En algún lugar hay que alejarse de la próxima comparación porque, dado que es un "&&" y ha fallado, debe asegurarse de no continuar en la instrucción if.

BLE significa rama si es menor o igual

Estoy tratando de controlar la ejecución condicional dentro de la programación ARM.

Entonces entiendo una situación como esta:

if ( (R0 != 5) || (R2 != R3) ) ; != means not equal, || mean OR { R4-- ; // R4 = R4 - 1 }

Y la versión ARM de esto sería:

CMP R0, 5 CMPEQ R2, R3 SUBNE R4, R4, 1

Tenía curiosidad de cómo ARM sabe que eso es un "O" (||). Entonces hace dos comparaciones. Pero, ¿qué sucede si ambas versiones no son correctas? ¿Es eso lo que hace NE? Qué sucede si fueran diferentes (como el ejemplo a continuación).

Entonces digamos que el código es este:

if ( (R0 > 5) && (R2 != R3) ) ; != means not equal, && mean AND { R4-- ; // R4 = R4 - 1 }

¿Cómo escribirías esto con instrucciones condicionales en ARM?

¡Gracias!


Esta es una lógica simple que parece contra intuitiva para el caso ''O''. El ''Y'' es más simple en mi opinión. La clave es que la segunda condición solo debe evaluarse si la primera pasó por ''AND''. Para el caso ''O'' es todo lo contrario. Usted cortocircuita la lógica y no se molesta en ejecutar la segunda condición.

Estos son los pasos para el caso ''AND'',

  1. prueba cc1
  2. si prueba cc1 cc2
  3. ejecutar si cc2

Si ''cc1 == cc2'' y el primero es falso, el paso 2 no se ejecuta y, por lo tanto, tampoco 3.

Para tomar su ejemplo,

if((R0 > 5) && (R2 != R3)) R4--;

Se traduciría como,

TST R2, R3 ; step 1 as (R2 != R3) MSREQ CPSR_f,#3<<30 ; set N and Z flags (also APSR_nz) CMPNE R0, #5 ; step 2 as (R0 > 5) SUBPL R4, #1 ; step 3

Se debe tener cuidado para asegurar que la primera prueba en el paso 1 no influya en la ejecución del paso 3. Las pruebas se pueden reordenar para la condición ''Y'' ya que ambas deben probarse.

Ver:
Espacio de Dave en ejecución condicional
HeyRick en registro de estado