assembly arm embedded instruction-set thumb

assembly - itte en el brazo



arm embedded (4)

Aparece en la parte de la familia de instrucciones de IT ( if-then ): http://infocenter.arm.com/help/topic/com.arm.doc.qrc0006e/QRC0006_UAL16.pdf (segunda página). La instrucción básica es IT y luego tienes T para "entonces" y E para "else" para dar ITTE y un código de condición de NE == "no es igual".

¿Qué hace la siguiente línea en el montaje del brazo?

000031e6 2916 cmp r1, #22 000031e8 bf1a itte ne

Obtengo la primera línea (comparando r1 con 22) pero ¿qué pasa con la segunda línea (nunca antes había visto el comando itte y Google no devolvió nada)


En palabras simples, ITTE ejecuta después de 3 ejecuciones como IF THEN {} THEN {} ELSE {} basado en la instrucción cmp anterior.

En ARMv6T2 y arquitecturas posteriores, puede usar la instrucción de IT para la ejecución condicional. En las arquitecturas anteriores a ARMv6T2, no hay instrucciones de IT y, por lo tanto, las instrucciones de Pulgar no se pueden ejecutar condicionalmente, excepto la instrucción de rama B ensamblador verifica las instrucciones de TI, pero las omite en el ensamblado al código ARM.

Para su solución, primero entendemos la sintaxis de IT instrucciones de IT simples (introducidas en el Pulgar 2) del ensamblaje ARM, que es la base de ITTE .

IT{pattern} {cond}

Si-entonces, establece las condiciones de ejecución para hasta 4 instrucciones siguientes puede ser cualquier combinación de hasta tres letras T (entonces) y E (otra cosa), la primera instrucción que sigue a TI es siempre cond (T) Instrucciones que pueden modificar el programa El contador debe ser el último en un bloque de TI.

Las condiciones then deben coincidir con el código de condición, y cualquier else condición debe ser la condición opuesta. La siguiente tabla muestra los códigos de condición y sus opuestos:

cmp otra instrucción cmp .

CMP Rn, #imm

Rn debe ser un registro Lo. rango de imm 0-255. Estas instrucciones actualizan los indicadores N, Z, C y V de acuerdo con el resultado.

Recuerde: IT permite que una a cuatro siguientes instrucciones de Thumb (el bloque de TI) sean condicionales o puede decir que aquí se usa ITTE para manejar pequeñas secuencias de código condicional, hasta 4 instrucciones.

Ejemplos simples

Ej 1:

cmp r1, #22 Compare r1 value with 22 IT EQ Read this as If EQual Then ADD R1,R1,#1 ADD R1,R1,#1 <- This will only be executed if above r1 value equal to 22(means when z condition flag is equal to 1)

Ex 2:

cmp r1, #22 Compare r1 value with 22 ITE EQ Read this as If EQual Then ADD R1,R1,#1 Else ADD R0,R0,#1 ADD R1,R1,#1 <- This will only be executed if the Z condition flag is 1 ADD R0,R0,#1 <- This will only be executed if the Z condition flag is 0

¿Qué hace ITTE? es tu pregunta aquí

CMP R1, #22 Compare r1 value with 22 ITTE NE Read this as IF NotEqual Then ADD R1,R1,#1 Then ADD R0,R0,#1 Else ADD R2,R2,#1 ADD R1,R1,#1 <- This will only be executed if the Z condition flag is 0 ADD R0,R0,#1 <- This will only be executed if the Z condition flag is 0 ADD R2,R2,#1 <- This will only be executed if the Z condition flag is 1

Aquí ITTE impone la condición NE en las dos primeras instrucciones siguientes y la condición EQ en la siguiente.

NOTA: Cualquier rama que exista en un bloque de TI debe ser la última instrucción en el bloque. Tomar referencia here siguiente ejemplo tendrá un comportamiento indefinido porque la instrucción de rama se usa en medio de la instrucción de rama.

ite eq blxeq some_label @ UNPREDICTABLE during an IT block. movne r0, #0

La forma correcta de implementar lo anterior sería poner el mov antes del blx, de la siguiente manera:

ite ne movne r0, #0 blxeq some_label @ Ok at the end of an IT block.

Para obtener más información Manual de referencia del juego de instrucciones THUMB -2 Página 4-92

IT{x{y{z}}}<q> <Firstcondition>

Condición <x> para la segunda instrucción en el bloque de TI

Condición <y> para la tercera instrucción en el bloque de TI

<z> condición para la cuarta instrucción en el bloque de TI

<q> especifica calificadores de ensamblador opcionales en la instrucción

Dos calificativos definidos aquí:

.N Meaning Narrow. Assembler has to choose 16-bit encoding for the instruction if it is not possible then error. .W Meaning Wide. Assembler has to select 32-bit encoding for the instruction if is not possible then error.

<Firstcondition> para la primera instrucción en el bloque IT, es decir, EQ, NE, CC, CS.


Es la instrucción IF-THEN-ELSE de la ARM, que se introdujo en el conjunto de instrucciones Thumb-2. (Basado en el ejemplo específico anterior, hubiera sido útil si hubiera mostrado las siguientes 3 instrucciones que siguieron a la instrucción ITTE , entenderá por qué cuando ITTE leer esta respuesta).

Esta instrucción se usa para manejar pequeñas secuencias de código condicional, hasta 4 instrucciones. Piense en ello como una manera diferente de implementar la ejecución condicional de ARM (por ejemplo, BNE: la instrucción de bifurcación solo se ejecuta si no se establece el indicador cero).

El beneficio de esto es que evita la penalización de tomar una sucursal (presumiblemente, has aprendido sobre tuberías, etc.)

La instrucción es un poco complicada, pero una vez que la envuelves, es bastante elegante.

Toma la forma:

IT<x><y><z><cond>

donde x , y , z son opcionales, y deben ser T (para "entonces") o E (para "else"). <cond> es cualquiera de las condiciones tales como NE o EQ o GT , etc. que se reflejan en los indicadores APSR.

Así que siempre tienes una T después de la I (¡la instrucción es IT después de todo!), Y luego 0-3 E ''s o T '' s. Para cada T y cada E , debe tener una instrucción posterior en el mismo orden que coincida. Cada instrucción posterior coincidente debe tener condiciones que coincidan con la instrucción de IT .

Tenga paciencia conmigo, sé que esto es confuso. Daré un par de ejemplos aquí para ilustrar.

La forma mínima de la instrucción sería algo como:

IT LT SUBLT.W R2, R1

En este caso, si LT es verdadero (según las banderas APSR), la resta tendrá lugar. Observe que el LT en el SUB coincide con el LT en la instrucción de IT .

Un ejemplo completo sería algo como:

ITETT NE ADDNE R0, R0, R1 ADDEQ R0, R0, R3 ADDNE R2, R4, #1 MOVNE R5, R3

Por lo tanto, ENTONCES TETT LUEGO ENTONCES ( TETT ), con condición NE Observe en las 4 instrucciones condicionales que siguen (4 instrucciones, 1 para cada TETT ), las instrucciones "ENTONCES" tienen la condición NE y la instrucción "ELSE" (la segunda instrucción después de la instrucción de IT : recuerde que la E fue la segunda de 4 E''s y T''s) tiene la condición opuesta. No puede ser otra cosa, es decir, sería un error si fuera algo así como LT lugar de EQ . EQ es lo opuesto a NE .

Entonces, si NE es verdadero, entonces las instrucciones 1, 3 y 4 serían ejecutadas. De lo contrario ( EQ ), solo se ejecutaría la instrucción 2 ( ADDEQ ).

He dado ejemplos de instrucciones 1 y 4, pero también puede tener formularios 2 (IT{T,E} ) y 3 instrucciones ( IT{T,E}{T,E} ).

Finalmente, para resaltar el punto, daré un ejemplo de cómo se puede implementar el siguiente código C usando esta instrucción:

if (R4 == R5) { R7 = R8 + R9; R7 /= 2; } else { R7 = R10 + R11; R7 *= 2; }

se convierte a

CMP R4, R5 ITTEE EQ ADDEQ R7, R8, R9 ; if R4 = R5, R7 = R8 + R9 ASREQ R7, R7, #1 ; if R4 = R5, R7 /= 2 ADDNE R7, R10, R11 ; if R4 != R5, R7 = R10 + R11 LSLNE R7, R7, #1 ; if R4 != R5, R7 *=2

Eso debería darle suficiente para masticar por un tiempo.