• 沒有找到結果。

ARM 杂项指令 ARM 杂项指令见表 4.10。

在文檔中 1.1 嵌入式系统 (頁 94-97)

第4章 ARM7TDMI(-S)指令系统

8. ARM 杂项指令 ARM 杂项指令见表 4.10。

表 4.10 ARM 杂项指令

助记符 说明 操作 条件码位置

SWI immed_24 软中断指令 产生软中断,处理器进入管理模式 SWI{cond}

MRS Rd,psr 读状态寄存器指令 Rd←psr,psr 为 CPSR 或 SPSR MRS{cond}

MSR psr_fields,Rd/#immed_8r 写状态寄存器指令 psr_fields←Rd/#immed_8r,psr 为 CPSR 或 SPSR MSR{cond}

SWI——软中断指令

SWI 指令用于产生软中断,从而实现在从户模式变换到管理模式,CPSR 保存到管理模 式的SPSR 中,执行转移到 SWI 向量。在其它模式下也可使用 SWI 指令,处理器同样地切 换到管理模式。指令格式如下:

SWI{cond} immed_24

其中: immed_24 24 位立即数,值为 0~16777215 之间的整数。

指令编码格式:

SWI 指令举例如下:

SWI 0 ; 软中断,中断立即数为 0

SWI 0x123456 ; 软中断,中断立即数为 0x123456

使用 SWI 指令时,通常使用以下两种方法进行传递参数,SWI 异常中断处理程序就可 以提供相关的服务,这两种方法均是用户软件协定。SWI 异常中断处理程序要通过读取引 起软中断的SWI 指令,以取得 24 位立即数。

1. 指令中 24 位的立即数指定了用户请求的服务类型,参数通过通用寄存器传递。

MOV R0,#34 ; 设置子功能号为34 SWI 12 ; 调用12 号软中断

2. 指令中的 24 位立即数被忽略,用户请求的服务类型由寄存器 R0 的值决定,参数通 过其它的通用寄存器传递。

- - 85 MOV R0,#12 ; 调用12 号软中断 MOV R1,#34 ; 设置子功能号为34 SWI 0

在 SWI 异常中断处理程序中,取出 SWI 立即数的步骤为:首先确定引起软中断的 SWI 指令是ARM 指令还时 Thumb 指令,这可通过对 SPSR 访问得到;然后要取得该 SWI 指令 的地址,这可通过访问LR 寄存器得到;接着读出指令,分解出立即数。如程序清单 4.2 所 示。

程序清单 4.2 读取 SWI 立即数 T_bit EQU 0x20

SWI_Handler

STMFD SP!, {R0-R3, R12, LR} ; 现场保护 MRS R0, SPSR ; 读取 SPSR STMFD SP!, {R0} ; 保存 SPSR TST R0, #T_bit ; 测试 T 标志位

LDRNEH R0, [LR,#-2] ; 若是 Thumb 指令,读取指令码(16 位) BICNE R0, R0, #0xFF00 ; 取得 Thumb 指令的 8 位立即数 LDREQ R0, [LR,#-4] ; 若是 ARM 指令,读取指令码(32 位) BICEQ R0, R0, #0xFF000000 ; 取得 ARM 指令的 24 位立即数

LDMFD SP!, {R0-R3, R12, PC}^ ; SWI 异常中断返回

MRS——读状态寄存器指令

在ARM 处理器中,只有 MRS 指令可以将状态寄存器 CPSR 或 SPSR 读出到通用寄存器 中。指令格式如下:

MRS{cond} Rd,psr

其中: Rd 目标寄存器。Rd 不允许为 R15。

psr CPSR 或 SPSR。

指令编码格式:

R 用于区别CPSR(R 为 0)或 SPSR(R 为 1 )。

MRS 指令举例如下:

MRS R1,CPSR ; 将CPSR 状态寄存器读取,保存到 R1 中 MRS R2,SPSR ; 将SPSR 状态寄存器读取,保存到 R2 中

MRS 指令读取 CPSR,可用来判断 ALU 的状态标志,或 IRQ、FIQ 中断是否允许等。

在异常处理程序中,读SPSR 可知道进行异常前的处理器状态等。MRS 与 MSR 配合使用,

实现CPSR 或 SPSR 寄存器的读-修改-写操作,可用来进行处理器模式切换、允许/禁止 IRQ/FIQ 中断等设置,如程序清单 4.3、程序清单 4.4 所示。另外,进程切换或允许异常中 断嵌套时,也需要使用MRS 指令读取 SPSR 状态值,并保存起来。

- - 86

程序清单 4.3 使能 IRQ 中断 ENABLE_IRQ

MRS R0, CPSR BIC R0, R0, #0x80 MSR CPSR_c, R0 MOV PC,LR

程序清单 4.4 禁能 IRQ 中断 DISABLE_IRQ

MRS R0 CPSR ORR R0, R0, #0x80 MSR CPSR_c, R0 MOV PC,LR

MSR——写状态寄存器指令

在ARM 处理器中,只有 MSR 指令可以直接设置状态寄存器 CPSR 或 SPSR。指令格式 如下:

MSR{cond} psr_fields,#immed_8r MSR{cond} psr_fields,Rm 其中:psr CPSR 或 SPSR。

fields 指定传送的区域。fields 可以是以下的一种或多种(字母必须为小写):

c 控制域屏蔽字节(psr[7…0]);

x 扩展域屏蔽字节(psr[15…8]);

s 状态域屏蔽字节(psr[23…16]);

f 标志域屏蔽字节(psr[31…24])。

immed_8r 要传送到状态寄存器指定域的立即数,8 位。

Rm 要传送到状态寄存器指定域的数据的源寄存器。

指令编码格式(操作数为立即数):

指令编码格式(操作数为寄存器):

R 用于区别CPSR(R 为 0)或 SPSR(R 为 1 )。

field_mask 域屏蔽。

rotate_imm 立即数对齐。

8_bit_immediate 8 位立即数。

Rm 操作数寄存器。

MSR 指令举例如下:

MSR CPSR_c,#0xD3 ; CPSR[7…0]=0xD3,即切换到管理模式 MSR CPSR_cxsf,R3 ; CPSR=R3

- - 87 只有在特权模式下才能修改状态寄存器。

程序中不能通过MSR 指令直接修改 CPSR 中的 T 控制位来实现 ARM 状态/Thumb 状态 的切换,必须使用 BX 指令完成处理器状态的切换(因为 BX 指令属分支指令,它会打断流 水线状态,实现处理器状态切换)。MRS 与 MSR 配合使用,实现 CPSR 或 SPSR 寄存器的 读-修改-写操作,可用来进行处理器模式切换、允许/禁止 IRQ/FIQ 中断等设置,如程序 清单4.5 所示。

程序清单 4.5 堆栈指令初始化 INITSTACK

MOV R0, LR ; 保存返回地址

; 设置管理模式堆栈

MSR CPSR_c, #0xD3 LDR SP, StackSvc

; 设置中断模式堆栈

MSR CPSR_c, #0xD2 LDR SP, StackIrq

在文檔中 1.1 嵌入式系统 (頁 94-97)