Herramientas de usuario

Herramientas del sitio


arm_saltos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
arm_saltos [2020/05/27 19:26] – [Subrutinas en ensamblador llamadas desde ensamblador] andrewarm_saltos [2020/05/27 19:54] (actual) – [Subrutinas] andrew
Línea 16: Línea 16:
 <cond> Es la condicion para que se ejecute la instrucción. <cond> Es la condicion para que se ejecute la instrucción.
  
-<dirección_destino> Especifica la dirección a donde hay que saltar. +<dirección_destino> Especifica la dirección a donde hay que saltar. Puede ser una etiqueta, pero se codifica en 24 bits. La dirección de destino se calcula de la siguiente manera:  
 +  - 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 */
 +              ...
 +     subrut : mov r3, #3
 +              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 124: 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). El código de operación ocupa 8 de los 32 bits, dejándonos 24 bits para  codificar el destino del salto. En principio con 24 bits podemos direccionar 16 Mb [-2<sup>23</sup>-1; 2<sup>23</sup>-1], sin embargo la arquitectura ARM se aprovecha del hecho de que las instrucciones están alineadas a direcciones múltiplo de 4 (en binario acaban en 00), por lo que el rango real es de 64 Mb [-2<sup>25</sup>-1; 2<sup>25</sup>-1]. +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). Este rango esta determinado por los 24 bits para codificar el destino del salto. 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.
- +
-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{<cond> <immed_24> +
- +
-Donde: +
- +
-<cond> es la condicion donde es ejecutada la instrucción +
- +
-<immed_24> es un valor inmediato de 24-bits y se usa para determinar que servicio del sistema operativo se esta solicitando. Cualquier parametro necesitado por el servicio es pasado por medio de un registro de propósito general +
- +
- +
-Operaciones principales realizadas por la instrucción:+
  
-     Si pasa la condicíon(cond)  +     ldr pc, =etiqueta
-     Luego +
-          R14_svc   dirección de la próxima instrucción despues de SWI +
-          SPSR_svc  = CPSR +
-          CPSR[4:0] = 0b10011  /* Entrar a modo Supervisor */ +
-          CPSR[5]   = 0        /* Ejecutar en estado ARM */ +
-          CPSR[7]   = 1        /* Deshabilitar interrupciones*/     +
-          PC    = 0x00000008+
  
  
  
 [[oc_raspi0|Volver]] [[oc_raspi0|Volver]]
× iphelper toolbox

you see this when javscript or css is not working correct

Untested
IP Address:
First usable:
Subnet:
Last usable:
CIDR:
Amount of usable:
Network address:
Reverse address:
Broadcast address:

arm_saltos.1590607591.txt.gz · Última modificación: 2020/05/27 19:26 (editor externo)