Bienvenido: Ingresar

Empty target given.

Quitar mensaje
location: WebHome / ASMIntroduccionARM / ASMSaltoARM

Instrucciones de Salto

Estas instrucciones permiten un salto hacia adelante o hacia atrás, cubriendo una brecha de +/-32Mb.

Al ser el PC un registro de propósitos generales (R15) un salto puede ser generado también al escribir un valor en el PC, estos saltos no utilizan instrucciones específicas de salto, se sirven de las instrucciones de movimiento y carga.

Con respecto a las subrutinas, existe una variante del Salto, permitiendo saltar dentro de la franja de +/-32 Mb, el Salto conservando el Vinculo (Branch with Link o BL), reserva la dirección de la instrucción posterior al salto en el LR (R14).

Otra modalidad de salto es el Salto y Cambio (Branch and Exchange BX), esta instrucción copia el contenido de un registro de propósitos generales (Rm) al PC (igual que Mov PC,Rm) con la funcionalidad adicional de que si el bit[0] del valor transferido es 1, el procesador conmuta a Thumb, esto permite trabajar conjuntamente con código ARM y Thumb.

Si sumamos a esto, una instrucción que guarde el contenido del PC al LR nos queda.

MOV LR,PC
BX Rm

Esto permite llamar a subrutinas desde ARM a Thumb y Thumb a ARM.

Las restricciones de los 32Mb, se eliminan utilizando instrucciones de carga que modifiquen directamente el PC, permitiendo saltar a cualquier posición de los 4Gb de espacio, ( esto se conoce como salto largo) al igual que el caso de la instrucción BX, la carga del PC puede ser precedida de Mov LR,PC para llamar a subrutinas.

Algo a tener en cuenta, es que en la carga de PC desde un valor de memoria, no tiene en cuenta el valor del bit[0], no permitiendo cambiar de modo Thumb - ARM,

Ejemplos

Instrucciones Específicas de Salto

B, BL Salto y Salto Conservando el Vinculo.

El Salto convencional (B) o el Salto conservando el vinculo (BL) permiten el salto a un determinada posición en forma incondicional o condicional. El Salto BL también guarda la posición de retorno en el LR o R14

B{L}{<cond>} <direcciondestino>

donde:

L

Determina si se guarda o no la posición de retorno.

cond

Es la condición que debe ser cierta para que el salto se efectúe, si esta condición es omitida, se usa la condición AL (always) transformándose en una salto incondicional.

direcciondestino

Especifica la dirección a saltar, la misma es calculada de la siguiente forma:

Esta instrucción permite un rango de salto de aproximadamente +/-32Mb

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

1

0

1

L

valor inmediato con signo de 24 bits

BX Salto y Cambio

BX{<cond>}  <Rm>

cond

Idem a B y BL.

Rm

Registro de propósitos múltiples que posee la dirección de salto o dirección de destino, si bit[0] de Rm es 0 el destino es una rutina ARM si el bit es 1 el destino es una rutina Thumb

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

0

1

0

0

1

0

llenar con 1

llenar con 1

llenar con 1

0

0

0

1

Rm