Bienvenido: Ingresar

Empty target given.

Quitar mensaje
location: WebHome / ASMIntroduccionARM / ASMAritmeticaARM

Instrucciones Aritméticas/Logicas y de comparación del ARM

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

Parámetros usados

Los campos utilizados por estas instrucciones son los siguientes

Rd

Rn

Op2

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

Instrucción de tres parámetros

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

Instrucción con Destino y Op2

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

Instrucción con Rn y Op2

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.

Descripción de las instrucciones

Suma (ADD y ADC)

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)

Resta (SUB, SBC, RSB y RSC)

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

Lógicos AND,EOR,ORR,BIC

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.

Comparación TST,TEQ,CMP,CMN

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

Mover MOV,MVN

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: