arm_saltos
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
arm_saltos [2020/05/27 19:17] – [Convención AAPCS] andrew | arm_saltos [2020/05/27 19:54] (actual) – [Subrutinas] andrew | ||
---|---|---|---|
Línea 16: | Línea 16: | ||
< | < | ||
- | < | + | < |
+ | - Extender a 30 bits el signo de los 24 bits en complemento A dos (signed_immed_24). | ||
+ | - Hacer un shift a izquierda de dos bits para formar un valor de 32 bits (SignExtend_30). | ||
+ | - El nuevo PC es: PC = PC + (SignExtend_30(signed_immed_24) << 2) | ||
Si agregamos el sufijo L, la instrucción B es BL y se llama (Branch and Link), y se usa para llamar a una subrutina, mediante un salto a la subrutina y escribiendo en el registro LR (R14) la dirección de la siguiente instrucción. | Si agregamos el sufijo L, la instrucción B es BL y se llama (Branch and Link), y se usa para llamar a una subrutina, mediante un salto a la subrutina y escribiendo en el registro LR (R14) la dirección de la siguiente instrucción. | ||
Línea 42: | Línea 44: | ||
En particular, en el retorno de una subrutina se usa Rm=LR. El retorno se logra copiando el registro LR (R14) al PC (Program Counter). | En particular, en el retorno de una subrutina se usa Rm=LR. El retorno se logra copiando el registro LR (R14) al PC (Program Counter). | ||
+ | |||
+ | |||
+ | Continuemos analizando el ejemplo de subrutina anterior | ||
+ | |||
+ | main : mov r1, #1 | ||
+ | mov r2, #2 | ||
+ | bl subrut | ||
+ | mov r4, #4 /* Siguiente instrucción */ | ||
+ | ... | ||
+ | | ||
+ | bx lr | ||
+ | |||
+ | Si seguimos el flujo del programa primero cargamos r1 a 1, luego r2 a 2 y lo siguiente que hay es una llamada a la subrutina. En dicha llamada el procesador carga en **lr** la dirección de la siguiente instrucción “mov r4, #4” y salta a la etiqueta subrut. Se ejecuta el “mov r3, #3” de la subrutina y después **“bx lr”** que vendría a ser la instrucción de retorno. Es decir, salimos de la subrutina retomando el flujo del programa principal, ejecutando “mov r4, #4”. | ||
Línea 58: | Línea 73: | ||
- | Cuando programamos | + | Cuando programamos |
+ | |||
+ | Para poder reusar nuestras funciones en otros proyectos | ||
Lo mejor para entender estas reglas es con una serie de ejemplos: | Lo mejor para entender estas reglas es con una serie de ejemplos: | ||
Línea 97: | Línea 114: | ||
swi 0 // Salida al sistema operativo | swi 0 // Salida al sistema operativo | ||
- | Continuemos analizando el primer ejemplo sencillo de subrutina | ||
- | |||
- | main : mov r1, #1 | ||
- | mov r2, #2 | ||
- | bl subrut | ||
- | mov r4, #4 /* Siguiente instrucción */ | ||
- | ... | ||
- | | ||
- | bx lr | ||
- | |||
- | Si seguimos el flujo del programa primero cargamos r1 a 1, luego r2 a 2 y lo siguiente que hay es una llamada a subrutina. En dicha llamada el procesador carga en **lr** la dirección de la siguiente instrucción “mov r4, #4” y salta a la etiqueta subrut. Se ejecuta el “mov r3, #3” de la subrutina y después **“bx lr”** que vendría a ser la instrucción de retorno. Es decir, salimos de la subrutina retomando el flujo del programa principal, ejecutando “mov r4, #4”. | ||
==== Subrutinas anidadas ==== | ==== Subrutinas anidadas ==== | ||
Línea 133: | Línea 139: | ||
Vemos en el último nivel (nivel2) podemos ahorrarnos el tener que almacenar y recuperar lr en la pila. | Vemos en el último nivel (nivel2) podemos ahorrarnos el tener que almacenar y recuperar lr en la pila. | ||
- | Las instrucciones de salto en la arquitectura ARM abarcan una zona muy extensa, hasta 64 Mb (32 Mb hacia adelante y otros 32 Mb hacia atrás). | + | Las instrucciones de salto en la arquitectura ARM abarcan una zona muy extensa, hasta 64 Mb (32 Mb hacia adelante y otros 32 Mb hacia atrás). |
- | + | ||
- | En caso de necesitar un salto mayor recurrimos a la misma solución de la carga de inmediatos del mov, solo que el registro a cargar es el pc. | + | |
- | + | ||
- | ldr pc, = etiqueta | + | |
- | + | ||
- | ==== SWI ==== | + | |
- | SWI (Software Interrupt) provoca la excepción SWI | + | |
- | + | ||
- | Sintaxis | + | |
- | + | ||
- | SWI{< | + | |
- | + | ||
- | Donde: | + | |
- | + | ||
- | < | + | |
- | + | ||
- | < | + | |
- | + | ||
- | + | ||
- | Operaciones principales realizadas por la instrucción: | + | |
- | Si pasa la condicíon(cond) | + | ldr pc, =etiqueta |
- | | + | |
- | R14_svc | + | |
- | SPSR_svc | + | |
- | CPSR[4:0] = 0b10011 | + | |
- | CPSR[5] | + | |
- | CPSR[7] | + | |
- | PC = 0x00000008 | + | |
[[oc_raspi0|Volver]] | [[oc_raspi0|Volver]] |
×
iphelper toolbox
you see this when javscript or css is not working correct
Untested
arm_saltos.1590607041.txt.gz · Última modificación: 2020/05/27 19:17 (editor externo)