Bienvenido: Ingresar
location: WebHome / ASMIntroduccionARM / ASMInstruccionesStatusARM

Instrucciones de transferencias de los registros de Status y Registros Status

Registros Status (Program Status Register PSR)

Modificando el CPSR se puede:

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

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

Campo de Control

Está formado por

Banderas de interrupción

Bits de modos

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

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{<cond>} <Rd>,CPSR
MRS{<cond>} <Rd>,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{<cond>} CPSR_<fields>, #<immediate>
MSR{<cond>} CPSR_<fields>, <Rm>
MSR{<cond>} SPSR_<fields>, #<immediate>
MSR{<cond>} SPSR_<fields>, <Rm>

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

UntitledWiki: WebHome/ASMIntroduccionARM/ASMInstruccionesStatusARM (última edición 2011-09-20 18:37:10 efectuada por GuillermoSteiner)