## page was renamed from ASMInstruccionesStatusARM = Instrucciones de transferencias de los registros de Status y Registros Status = A continuación describimos por un lado el registro status, y por otro las instrucciones que permiten realizar transferencia desde o hacia estos registros == Registros Status (Program Status Register PSR) == Son dos: * El registro actual (Current Program Status Register CPSR ) el mismo es accesible desde cualquier modo de procesador, y contiene las banderas de condición, los bits de de manejo de las interrupciones, el modo del procesador, etc. * Cada excepción posee además un Saved Program Status Register (SPSR), el cual es utilizado para preservar el valor del CPSR cuando ocurre una excepción. Las únicas excepciones que no poseen SPSR son las User y System. Modificando el CPSR se puede: * establecer el valor de las banderas de condición. * establecer el valor de los bits de interrupciones. * establecer el modo y estado del procesador. === Estructura de PSR === || 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 || || N || Z || C || V |||||||||| Reset.bits |||||||||||||||||||||||||||||| Reserved bits || I || F || T || M4 || M3 || M2 || M1 || M0 || |||||||||||||||||| Banderas |||||||||||||||||||||||||||||| |||||||||||||||| Control || Podemos clasificar a las banderas en grupos según la forma de accederlas * Reserved bits, se reservan para futuras implementaciones, no deben ser tocados. * User-writable bits, pueden ser escritos en cualquier modo, a este grupo pertenecen N,Z,C,V * Privileged bits, pueden ser escritos en modos de privilegios, en modo usuario, cualquier intento de modificar estos bits es ignorado, a este grupo pertenece I,F y M[4:0] * Execution state bits, al igual que el anterior, solo se pueden modificar en modos de privilegios, pero no debe modificarse a través de instrucciones de escritura en el PSR como la instrucción MSR ya que producirían resultados impredecibles, en este grupo solo existe un bit el T, el cual determina si el procesador funciona en modo ARM o Thumb, los cambios en este bits se deben realizar por otra via, por ejemplo la instrucción BX explicada dentro de las instrucciones de Salto, esta restricción es aplicada al CPSR y no al SPSR. Con la tabla de arriba, podemos armar las mascaras que afectaran a las distintas banderas según === Banderas de condición o Campo de banderas === Las banderas N,Z,C, y V (Negative, Zero,Carry y oVerflow), forman el grupo conocido como banderas de código de condición o (condition code flags) a las que comúnmente se las refiere simplemente como banderas. Estas banderas son testeadas desde las instrucciones que posean condición y de esta forma determinar si son ejecutadas o no Además son modificadas por las instrucciones de comparación (CMN,CMP,TEQ o TST) o por cualquier instrucción aritmética, lógica o de movimiento con el agregado de la opción S. Otra forma de modificar estas banderas es directamente a traves del registro PSR con alguna instrucción que lo modifique Las descripciones de estas banderas son las siguientes. Negativo N (Negative) representa el bit 31 del resultado de la instrucción. 1 si el resultado es negativo ( complemento a dos ) o 0 si es positivo. Cero Z (Zero) es 1 si el resultado de la instrucción es cero, 0 si es cualquier otro valor Acarreo C (Carry) este valor puede representar lo siguiente según la instrucción ejecutada. * en una suma (CMN donde es una comparación a través de una suma) el C es 1 si la suma produce un acarreo, esto indica un desborde en caso de suma sin signo, 0 si no se produce acarreo. * en una resta o CMP, C es 0 si la resta produce préstamo esto indica un desborde por debajo o underflow, 1 en otro caso ( como se puede apreciar, el acarreo en este caso es 0 para desborde y 1 en otro caso esto es asi porque carry esta representando el borrow o prestamo negado para mas detalle ver la operación de resta). * en operaciones que involucre corrimiento. * en las operaciones que no involucre corrimiento y no sean de suma o resta, generalmente el acarreo permanece sin cambios. Desborde V (oVerflow) esta bandera indica un desborde en la instrucción ejecutada, y puede ser modificada en las siguientes situaciones. * en una suma o resta, V es 1 si se produjo un desborde con signo. * operaciones que no son suma o resta, generalmente no modifican esta bandera pero debe verse la instrucción en particular. === Campo de Control === Está formado por * Banderas de interrupción * Bits de modos * El bit T ==== Banderas de interrupción ==== * I bit, Desactiva las interrupciones IRQ cuando es 1 * F bit, Desactiva las interrupciones FIQ cuando es 1 ==== Bits de modos ==== Determina el modo de funcionamiento del procesador. ||M[4:0]|| Modo||Registros accesibles|| ||10000|| User ||PC, R14 to R0, CPSR|| ||10001|| FIQ ||PC, R14_fiq(lr) to R8_fiq, R7 to R0, CPSR, SPSR_fiq|| ||10010|| IRQ ||PC, R14_irq(lr), R13_irq(sp), R12 to R0, CPSR, SPSR_irq|| ||10011|| Supervisor ||PC, R14_svc(lr), R13_svc(sp), R12 to R0, CPSR, SPSR_svc|| ||10111|| Abort ||PC, R14_abt(lr), R13_abt(sp), R12 to R0, CPSR, SPSR_abt|| ||11011|| Undefined ||PC, R14_und(lr), R13_und(sp), R12 to R0, CPSR, SPSR_und|| ||11111|| System ||PC, R14 to R0, CPSR|| Solo esta combinación de bits definen un modo valido. ==== El bit T ==== El bit T determina el modo de funcionamiento del procesador (ARM o Thumb) ver BX en Instrucciones de Salto == Instrucciones de transferencia del registro Status == Las instrucciones de transferencias del registro Status, transfieren desde o hacia CPSR o SPSR con un registro de propósitos múltiples Existen dos instrucciones para mover el contenido del CPSR desde o hacia un registro de propósitos múltiples, ambos registros (CPSR y SPSR) pueden ser accedidos mediante este método. == MRS mover el PSR a un registro de propósitos múltiple. == Esta instrucción, copia un el CPSR o SPSR a un registro de propósitos múltiples Utilización: Cuando una excepción ocurre, y es posible que una próxima excepción del mismo tipo ocurra, el SPSR corre peligro de ser corrompido, para evitar esto, el SPSR debe ser guardado inmediatamente cuando entramos en la excepción y recuperado antes de salir de la misma, para recuperar entonces el SPSR antes de salir de la excepción, utilizamos una MRS del mismo modo ocurre, cuando cambiamos de modo en el ARM, al restablecer el modo anterior, debe recuperarse el CPSR con una instrucción MRS . Notas: En modo usuario o sistema, modificar el SPSR produce resultados impredecibles {{{ MRS{} ,CPSR MRS{} ,SPSR }}} || 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 || R || 0 || 0 |||||||| llenar con 1 |||||||| Rd |||||||||||||||||||||||| llenar con 0 || R = 1 SPSR R = 0 CPSR == MSR copia el contenido de un registro o un valor literal al PSR. (CPSR o SPSR) == Esta instrucción copia el valor de un registro o un valor literal a alguno de los PSR (CPSR o SPSR), la modificación de los bits dentro de ese registro, dependerá del modo en que este funcionando el procesador en el momento de la copia, y de la mascara que se indique en la instrucción {{{ MSR{} CPSR_, # MSR{} CPSR_, MSR{} SPSR_, # MSR{} SPSR_, }}} En esta instrucción se agrega el componente fields, este campo, indica que grupo de banderas voy a reemplazar || modificador || bit || grupo de banderas || || c || 16 || grupo de control || || s || 18 || grupo de status || Utilización: El MSR es utilizado para modificar el contenido de un PSR, el proceso normal, es copiar el PSR a un registro de propósitos múltiples (mediante una instrucción MRS), modificarlo y luego copiarlo nuevamente al PSR por medio de una instrucción MSR. Por ejemplo si queremos cambiar a modo Supervisor en el ARM desde otro modo con privilegio, hacemos: {{{ MRS R0,CPSR ; Leer CPSR BIC R0,R0,#0x1F ; borrar el modo actual ORR R0,R0,#0x13 ; copiar el modo Supervisor ( 10011 a partir del bit 0) MSR CPSR_c,R0 ; escribir el resultado en el CPSR (solo actualizo los bits de control bit0 a bit7) }}} para máxima eficiencia, el MSR solo deberia escribir aquellos campos que van a modificarse, por ejemplo en la última instruccion, solo modifica el campo de control. De todas formas, si la única razón de que la instrucción MSR no pueda cambiar un bit determinado, es que ese bit no tiene función asignada, debería intentar escribirse lo mismo, para asegurar compatibilidad en futuras versiones. Se puede también usar un MSR con un valor inmediato, pero debe ser cuidadoso con el uso de esta instrucción, puesto que esto equivale a reemplazar todos los bits del campo que está escribiendo, esta forma se debe usar cuando la intensión es modificar todos los bits del campo especificado, si alguno de estos bits no fueron asignados en esta versión el ARM, puede perder compatibilidad con futuras versiones al no saber cual será su uso. Una excepción a esta regla es el grupo de status, por ejemplo establecer a 1 las cuatros banderas de este grupo mediante la instrucción {{{ MSR CPSR_f,#0xF00000000 }}} no producirá problema, cualquier versión futura, se diseña para que no produzca efectos impredecibles. Como ejemplo, versiones posteriores del ARM establecen el flag Q a continuación de los 4 de esta versión, el Q es otra bandera en este caso para funciones del DSP, borrar la misma no genera ningún problema. Notas En el modo Usuario, el intento de escribir en los bits enominados "Privileged bits" dentro del CPSR son ignorados. En el modo Usuario o System, el intento de acceder al SPSR produce efectos impredesibles. Las instrucciones MSR no deben ser usadas para modificar el bit T, el efecto de esta operación es impredecible de Inmediato || 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 || 1 || 1 || 0 || R || 1 || 0 |||||||| mascara de campo |||||||| llenar con 1 |||||||| rotac.inmediato |||||||||||||||| inmediato || de Registro || 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 || R || 1 || 0 |||||||| mascara de campo |||||||| llenar con 1 |||||||| llenar con 0 || 0 || 0 || 0 || 0 |||||||| Rm || R = 1 SPSR R = 0 CPSR === Ejemplos de MRS y MSR === {{{ MRS R0, CPSR ; Leer el CPSR BIC R0, R0, #0xF0000000 ; Borrar las banderas de N, Z, C y V MSR CPSR_f, R0 ; Actualiza el campo de banderas del CPSR ; ahora las banderas N, Z, C y V estan en cero MRS R0, CPSR ; Leer el CPSR ORR R0, R0, #0x80 ; poner en 1 la bandera de desactivación de IRQ MSR CPSR_c, R0 ; Actualizar solo el campo e control del CPSR ; la interrupción (IRQ) esta ahora desabilitada MRS R0, CPSR ; Leer el CPSR BIC R0, R0, #0x1F ; Borrar los bits de modo ORR R0, R0, #0x11 ; Elegir modo de FIQ MSR CPSR_c, R0 ; Actualiza solo el campo de control del CPSR ; ahora estamos en modo FIQ }}}