Bienvenido: Ingresar
location: Diferencias para "WebHome/ASMIntroduccionARM/ASMAritmeticaARM"
Diferencias entre las revisiones 4 y 7 (abarca 3 versiones)
Versión 4 con fecha 2010-06-04 16:55:51
Tamaño: 10336
Comentario:
Versión 7 con fecha 2010-09-09 13:53:33
Tamaño: 10382
Comentario:
Los textos eliminados se marcan así. Los textos añadidos se marcan así.
Línea 1: Línea 1:
## page was renamed from ASMAritmeticaARM
Línea 42: Línea 43:
El Op2 puede ser considerado como una segunda instruccion dentro de otra [[ASMOperador2ARM|Descripción]] El Op2 puede ser considerado como una segunda instrucción dentro de otra [[/ASMOperador2ARM|Descripción]]
Línea 48: Línea 49:
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 [[ASMOperador2ARM|Estructura de una Instrucción ARM]] se puede ver con mas detalle cada campo 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 [[/ASMOperador2ARM|Estructura de una Instrucción ARM]] se puede ver con mas detalle cada campo

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

  • El ARM posee 16 instrucciones encargadas de realizar las operaciones aritméticas/lógicas y de comparación.

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

  • {cond} Como cualquier otra instruccion ARM, este campo indica la condicional para la ejecución de la instrucción.

  • {S} Con este campo se indica si la instruccion modifica las banderas del CPSR, solo se utiliza en las operaciones logicas y aritméticas, no usadas en las de comparación donde es implicita.

  • Rd,Rn,Op2 son los operadores utilizados en la isntrucción.

Rd

  • Operador de destino, donde se guardan los resultados, es cualquier registro de propósitos múltiples

Rn

  • Operador Nro 1, puede ser también cualquier registro de propósitos múltiples.

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:

  • Usan los tres parámetros, son las instrucciones aritméticas o lógicas que realiza el calculo entre los dos operadores (Rn y Op2) y al resultado lo guarda en el registro destino.
  • Destino y Op2, aquellas instrucciones que solo copian o copian y niegan un valor o registro a un registro destino, al usarse solo un operador fuente, se usa el operador 2 que permite corrimiento.
  • Rn y OP2, las instrucciones de comparación solo realizan cálculos aritméticos o lógicos para actualizar las banderas, el resultado se pierde, por lo tanto no es utilizado el Rd.

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)

  • Para realizar una sumar tenemos dos instrucciones Suma sin acarreo (ADD) Suma el primero operador (Rn) con Op2, el resultado es guardado en Rd, se puede además, con el agregado del bit S, podemos cambiar las banderas del CPSR con el resultado obtenido.

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.

  • N = 1, el resultado es un numero negativo.
  • C = 1, se produjo un desborde (considerando al numero sin signo).
  • V = 1, se produjo un desborde (considerando al numero con signo).
  • Z = 1, los 32 bits mas altos son ceros.

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:

  • C = 1; no se a producido préstamo (no borrow).
  • C = 0; se a producido un préstamo (borrow).

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

  • Realizan las operaciones AND OR exclusivo y OR inclusivo bit a bit entre el operador Rn y el Op2, el resultado lo guarda en Rd.

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 logico 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.

Ademas, 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, 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:

Copiar el valor de un registro a otro

Copiar una constante a un registro.

Realizar una operación de corrimiento a un registro.

Copiar el PC al LR para guardar la dirección de retorno de una subrutina.

UntitledWiki: WebHome/ASMIntroduccionARM/ASMAritmeticaARM (última edición 2011-06-29 14:17:08 efectuada por GuillermoSteiner)