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.
Es parte de la familia de instrucciones If-Then (que es la única forma de usar la ejecución condicional para el código Thumb-2)
Consulte este enlace: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cjabicci.html