Las mismas se enumeran en la siguiente tabla
Opcode |
Mnemonico |
Operación |
Acción |
Asembler |
0000 |
AND |
AND logica |
Rd = Rn AND Op2 |
AND{cond}{S} Rd,Rn,Op2 |
0001 |
EOR |
Or Exclusiva |
Rd = Rn EOR Op2 |
EOR{cond}{S} Rd,Rn,Op2 |
0010 |
SUB |
Resta |
Rd = Rn - Op2 |
SUB{cond}{S} Rd,Rn,Op2 |
0011 |
RSB |
Resta reversa |
Rd = Op2 - Rn |
RSB{cond}{S} Rd,Rn,Op2 |
0100 |
ADD |
Suma |
Rd = Rn + Op2 |
ADD{cond}{S} Rd,Rn,Op2 |
0101 |
ADC |
Suma con Acarreo |
Rd = Rn + Op2 + Acarreo |
ADC{cond}{S} Rd,Rn,Op2 |
0110 |
SBC |
Resta con Acarreo |
Rd = Rn - Op2 - NOT(Acarreo) |
SBC{cond}{S} Rd,Rn,Op2 |
0111 |
RSC |
Resta reversa con Acarreo |
Rd = Op2 - Rn - NOT(Acarreo) |
RSC{cond}{S} Rd,Rn,Op2 |
1000 |
TST |
Test |
Actualiza banderas con el resultado de (Rn AND Op2) |
TST{cond} Rn,Op2 |
1001 |
TEQ |
Test Equivalente |
Actualiza banderas con el resultado de (Rn EOR Op2) |
TEQ{cond} Rn,Op2 |
1010 |
CMP |
Comparar |
Actualiza banderas con el resultado de (Rn - Op2) |
CMP{cond} Rn,Op2 |
1011 |
CMN |
Comparar Negativo |
Actualiza banderas con el resultado de (Rn + Op2) |
CMN{cond} Rn,Op2 |
1100 |
ORR |
Or Inclusiva |
Rd = Rn OR Op2 |
ORR{cond}{S} Rd,Rn,Op2 |
1101 |
MOV |
Mover |
Rd = Op2 |
MOV {cond}{S} Rd,Op2 |
1110 |
BIC |
Borrar Bit |
Rd = Rn AND NOT(Op2) |
BIC{cond}{S} Rd,Rn,Op2 |
1111 |
MVN |
Mover negado |
Rd = NOT(Op2) |
MVN{cond}{S} Rd,Op2 |
Los campos utilizados por estas instrucciones son los siguientes
{cond} Como cualquier otra instrucción ARM, este campo indica la condicional para la ejecución de la instrucción.
{S} Con este campo se indica si la instrucción modifica las banderas del CPSR, solo se utiliza en las operaciones lógicas y aritméticas, no usadas en las de comparación donde es implícita.
Rd,Rn,Op2 son los operadores utilizados en la instrucción.
Es el segundo operador, el mismo puede ser un valor inmediato u otro registro de propósitos múltiples, como se explico cuando se describió una instrucción genérica, en el caso de ser un registro se le puede adicionar un corrimiento fijo o a través de otro registro.
Según cuales de estos parámetros requiera, las instrucciones se pueden dividir en:
El Op2 puede ser considerado como una segunda instrucción dentro de otra Descripción
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
cond |
0 |
0 |
I |
opcode |
S |
Rn |
Rd |
Op2 puede ser el inmediato o el registro |
El bit[25] o I indica 0 si el operador 2 es un literal o 0 en caso de que sea un registro con corrimiento en Estructura de una Instrucción ARM se puede ver con mas detalle cada campo
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
cond |
0 |
0 |
I |
opcode |
S |
llenar con 0 |
Rd |
Op2 puede ser el inmediato o el registro |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
cond |
0 |
0 |
I |
opcode |
1 |
Rn |
llenar con 0 |
Op2 puede ser el inmediato o el registro |
en este caso el bit 20 es siempre 1, al existir solo operaciones que modifican las banderas.
Suma con Acarreo (ADC) A la suma de Rn con Op2 le agrega el acarreo de la operación anterior, esto permite realizar suma de números cuya longitudes son de varios word.
ejemplo de sumar dos números de 2 word cada uno Numero 1 = R3 R2 Numero 2 = R1 R0 Resultado = R5 R4
ADDS R4,R0,R2 ADCS R5,R1,R3
Como vemos el último adc actualiza también las banderas, con las mismas podemos interpretar el resultado de 64bit.
Otros ejemplos
ADD R1, R2, #1 ;Sumar 1 a R1 ADD R1, R2, R2, LSL 3 ;R1 = R2 + R2 x 2 ^3 = R2 x ( 1 + 2 ^ 3) o R1 = R2 x 9 (multiplicar por una constante)
Al igual que la suma, tenemos resta con acarreo y resta sin acarreo.
Resta sin acarreo (SUB) le resta a Rn el valor de Op2 el resultado lo guarda en Rd
Resta con acarreo le resta a Rn el valor de Op2 y el valor del acarreo negado
Si se especifica S en la instrucción se actualizan las banderas, en particular, el acarreo se modifica de la siguiente forma:
En otras palabras el acarreo funciona como un NOT(borrow), esto es utilizado en las operación de resta con acarreo, en el cual en lugar de borrow utilizan NOT(Carry).
Las operaciones RSB y RSC son el equivalente a SUB y SBC.
La diferencia es que los operadores se invierten, es decir:
SUB realiza Rd = Rn - Opc2 RSB realiza Rd = Opc2 - Rn
Esta característica de resta reversa, es utilizada para poder aplicar un corrimiento al minuendo.
Ejemplo de restar dos números de 2 word cada uno
Numero 1 = R3 R2
Numero 2 = R1 R0
Resultado = R5 R4
SUBS R4,R0,R2 SBC R5,R1,R3
Ejemplos:
SUB R1,R1,#1 ; restar uno a R1 SUBS R1,R1,#1 ; se utiliza como loop, al modificar las banderas, se puede verificar la bandera de cero RSB R1,R1,#0 ; R1 = 0 - R1, calcula el valor negativo RSB R1, R2, R2, LSL 2 ; R1 = R1 x (2 x 4 - 1); R1 = R1 x 7
La instrucción AND, es muy utilizada para realizar mascaras dentro de los registros, esto es por ejemplo poner a 0 todos los bits menos un grupo particular, que interesa analizar.
La instrucción BIC, realiza el AND lógico bit a bit del operador Rn con el complemento de Op2, esto permite al igual que la instrucción AND generar mascaras para borrar o dejar bits
Al igual que las anteriores el agregado de S permite que la instrucción modifique las bandera con el resultado.
ORR R1,R1,R1 ; borrar todos los bits AND R1,R1,#3 ; borrar todos los bits, exceptuando los dos bits menos significativos BIC R1,R1,#3 ; borrar solo los dos bits menos significativos.
Estas instrucciones, tienen la característica de no poseer registro destino, esto es, porque son para comparar valores sin que esto implique la modificación de un registro con su resultado.
Además, esto explica que la opción S no sea optativa y se encuentre implícita en la instrucción, ya que una operación de este tipo que no modifique las banderas, no tendría sentido.
Comparar (CMP) compara un registro de propósitos múltiples con Op2, esta comparación es una resta cuyo resultado modifica las banderas, de esta forma es posible detectar si un numero es mayo a otro (N=1) si dos números son iguales (Z=1), etc.
Comparar Negado (CMN) compara dos registro, realizando la resta del primero con el complemento a dos del segundo.
Test (TST) realiza una comparación a través de un AND lógico bit a bit entre dos los dos operadores, es muy utilizado para probar el estado de uno o varios bits dentro de un registro.
Test Equivalente (TEQ) realiza un OR exclusivo lógico bit a bit de los dos operadores, es utilizado para comprobar si dos numero son iguales sin afectar la bandera de desborde (V) o por ejemplo, para ver si dos números tienen el mismo signo, ( N tendrá el OR exclusivo de los dos bit de signo)
CMP R1,R2 ; comparar dos registros
Copian el valor del Op2 al registro destino Rd
Estas instrucciones, no poseen Operador 1 o Rn, utilizan como operador fuente el Op2, con las ventajas que tienen este operador de poder cargar desde un literal o desde otro registro desplazado.
Mover (MOV) esta instrucción solo copia el valor de Op2 a Rd, esta instrucción se la suele usar para: