Tamaño: 4421
Comentario:
|
Tamaño: 4594
Comentario:
|
Los textos eliminados se marcan así. | Los textos añadidos se marcan así. |
Línea 60: | Línea 60: |
||||||cond|| ||||||| 1 ||0 ||1 ||L ||valor inmediato con signo de 24 bits |||||||||||||||||||||| || |
|||||| cond || 1 || 0 || 1 || L |||||||||||||||||||||||||||||||||||||||||||||||| valor inmediato con signo de 24 bits || |
Línea 78: | Línea 77: |
---- /!\ '''Edit conflict - other version:''' ---- ---- /!\ '''Edit conflict - your version:''' ---- ---- /!\ '''End of edit conflict''' ---- |
Instrucciones de Salto
Estas instrucciones permiten un salto hacia adelante o hacia atras, 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 codigo 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 instruccion 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 tratandolo como un registro de propositos 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 tambien guarda la posicion 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 form:
- 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 |
|
Edit conflict - other version:
Edit conflict - your version:
End of edit conflict