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
B label ; Salto incondicional a label BCC label ; Salto condicional a label si el acarreo es cero BEQ label ; Salto condicional a label si la bandera de cero es uno de otra forma si los numero comparados son iguales MOV PC, #0 ; R15 = 0, saltar a la posición 0 BL func ; llamar a la subrutina func . . MOV PC, LR ; R15=R14, retornar a la posición posterior a un BL MOV LR, PC ; guardar la dirección de en la instrucción siguiente en LR LDR PC, =func ; cargar una dirección de 32-bit
Instrucciones Específicas de Salto
- Veremos a continuación solo las instrucciones específicas de salto, quedando las instrucciones que modifican al PC tratándolo como un registro de propósitos generales como un caso particular de las instrucciones de carga y modificación
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:
- Se extiende con signo de 24 bits a un nro de 30 bits.
- Se corre dos bits a la izquierda (se multiplica por 4).
- Se suma el contenido del PC. (en el momento de la suma el PC ya estará desplazado 8 bytes hacia adelante)
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
- Salta a una posición de memoria con la opción de cambio a modo Thumb.
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 |