Instrucción para interrupcion por software SWI
Esta instruccion genera un excepción, esta excepción permite que desde un modo usuario sin privilegio, se pueda correr una rutina en modo sistema.
Los procesadores ARM poseen un nivel de privilegios lo cual permite al menos dos formas de trabajar
- un hambiente donde exista un solo programa corriendo con el mas alto privilegio de acceso a todos los recursos del procesador.
- un hambiente con jerarquias, donde exista un Sistema Operativo corriendo con altos provilejios, y la aplicación corriendo en un modo usuario con privilegios acotados.
En este último caso, es necesario a veces que la aplicación requiera recursos que no le son permitido por sus restricciones, lo mas apropiado cuando esto ocurre, es crear un servicio desde el SO que efectue lo que la aplicación necesita, y luego sea llamada por esta a travez de un SWI.
una llamada SWI hará lo siguiente:
- Guardar en R14_svc la direccion que sigue a la instruccion SWI
- Copiar en SPSR_svc el CPSR
- Pasar a modo Supervisor (bit 4:0 = 10011 del CPSR)
- Pasar a modo ARM si no lo estubiera (bit 5 = 0 del CPSR
- Deshabilitar las interrupciones Normales (bit 7 = 1 del CPSR)
- Cargar en el Program Counter PC = 0x00000008
Esta instrucción posee un valor inmediato de 24bits, estos 24bits no son usados por el procesador, sirven principalmente para especificar el servicio a usar o algun parámetro del servicio, otra via para pasar el numero del servicio, es a travez de R0, pudiendo usarse los demás registros para pasar otros parámetros.
Código
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 |
1 |
1 |
1 |
valor inmediato de 24 bits |
donde
cond Es la condición que debe ser cierta para que se ejecute la instrucción.