中国空间站首次太空授课,设计师免费资源导航,辽宁工程建筑信息网,wordpress首次访问很卡慢A.2.5 ARM 协处理器指令 ARM 支持协处理器操作#xff0c;协处理器的控制要通过协处理器命令实现。表A-7给出全部的ARM协处理器指令。 表A-7 ARM 协处理器指令CDP 协处理器数据操作指令。ARM 处理器通过CDP 指令通知ARM 协处理器执行特定的操作。该操作由协…A.2.5 ARM 协处理器指令 ARM 支持协处理器操作协处理器的控制要通过协处理器命令实现。表A-7给出全部的ARM协处理器指令。 表A-7 ARM 协处理器指令 CDP 协处理器数据操作指令。ARM 处理器通过CDP 指令通知ARM 协处理器执行特定的操作。该操作由协处理器完成即对命令的参数的解释与协处理器有关指令的使用取决于协处理器。若协处理器不能成功地执行该操作将产 生未定义指令异常中断。指令格式如下 CDP{cond} coproc,opcodel,CRd,CRn,CRm{,opcode2} 其中 coproc 指令操作的协处理器名。标准名为pn,n 为015。 opcodel 协处理器的特定操作码。 CRd 作为目标寄存器的协处理器寄存器。 CRN 存放第1 个操作数的协处理器寄存器。 CRm 存放第2 个操作数的协处理器寄存器。 Opcode2 可选的协处理器特定操作码。 CDP 指令举例如下 CDP p7,0,c0,c2,c3,0 ;协处理器7 操作操作码为0可选操作码为0 CDP p6,1,c3,c4,c5 ;协处理器操作操作码为1 LDC 协处理器数据读取指令。LDC 指令从某一连续的内存单元将数据读取到协处理器的寄存器中。协处理器数据的数据的传送由协处理器来控传送的字数。若协处理器不能成功地执行该操作将产生未定义指令异常中断。指令格式如下 LDC{cond}{L} coproc,CRd,地址 其中 L 可选后缀指明是长整数传送。 coproc 指令操作的协处理器名。标准名为pnn 为015 CRd 作为目标寄存的协处理器寄存器。 地址 指定的内存地址 LDC 指令举例如下 LDC p5,c2,[R2,#4];读取R24指向的内存单元的数据传送到协处理器p5的c2寄存器中 LDC p6,c2,[R1] ;读取是指向的内存单元的数据传送到协处理器p6 的c2 寄存器中 STC 协处理器数据写入指令。STC 指令将协处理器的寄存器数据写入到某一连续的内存单元中。进行协处理器数据的数据传送由协处理器来控制传送的字数。若协处理器不能成功地执行该操作将产生未定义指令异常中断。指令格式如下 STC{cond}{L} coproc,CRd,地址 其中 L 可选后缀指明是长整数传送。 coproc 指令操作的协处理器名。标准名为pnn 为015 CRd 作为目标寄存的协处理器寄存器。 地址 指定的内存地址 STC 指令举例如下 STC p5,c1,[R0] STC p5,c1,[Ro,#-0x04] MCR ARM 寄存器到协处理器寄存器的数据传送指令。MCR 指令将ARM 处理器的寄存器中的数据传送到协处理器的寄存器中。若协处理器不能成功地执行该操作将产生未定义指令异常中断。指令格式如下 MCR{cond} coproc,opcodel,Rd,CRn,CRm{,opcode2} 其中coproc 指令操作的协处理器名。标准名为pnn 为015。 cpcodel 协处理器的特定操作码。 CRD 作为目标寄存器的协处理器寄存器。 CRn 存放第1 个操作数的协处理器寄存器 CRm 存放第2 个操作数的协处理器寄存器。 Opcode2 可选的协处理器特定操作码。 MCR 指令举例如下 MCR p6,2,R7,c1,c2, MCR P7,0,R1,c3,c2,1, MRC 协处理器寄存器到ARM 寄存器到的数据传送指令。MRC 指令将协处理器寄存器中的数据传送到ARM 处理器的寄存器中。若协处理器不能成功地执行该操作。将产生未定义异常中断。指令格式如下 MRC {cond} coproc,opcodel,Rd,CRn,CRm{,opcode2} 其中coproc 指令操作的协处理器名。标准名为pnn为015。 opcodel 协处理器的特定操作码。 CRd 作为目标寄存器的协处理器寄存器。 CRn 存放第1 个操作数的协处理器寄存器。 CRm 存放第2 个操作数的协处理器寄存器。 opcode2 可选的协处理器特定操作码。 MRC 指令举例如下 MRC p5,2,R2,c3,c2 MRC p7,0,R0,c1,c2,1A.2.6 ARM 杂项指令 表A-8给出全部的ARM协处理器指令。 表A-8 ARM杂项指令 SWI 软中断指令。SWI 指令用于产生软中断从而实现在用户模式变换到管理模式CPSR保存到管理模式的SPSR 中执行转移到SWI 向量在其它模式下也可使用SWI 指令处理同样地切换到管理模式。指令格式如下 SWI{cond} immed_24 其中immed_24 24 位立即数值为016777215 之间的整数。 SWI 指令举例如下 SWI 0 ;软中断中断立即数为0 SWI 0x123456 ;软中断中断立即数为0x123456 使用SWI 指令时通常使用以下两种方法进行传递参数SWI 异常中断处理程序就可以提供相关的服务这两种方法均是用户软件协定。SWI 异常中断处理程序要通过读取引起软中断的SWI 指令以取得24 位立即数。 A指令24 位的立即数指定了用户请求的服务类型参数通过用寄存器传递。 MOV R0,#34 ;设置了功能号为34 SWI 12 ;调用12 号软中断 B指令中的24 位立即数被忽略用户请求的服务类型由寄存器R0 的值决定参数通过其它的通用寄存器传递。 MOV R0,#12 ;调用12 号软中断 MOV R1,#34 ;设置子功能号为34 SWI 0 ; 在SWI 异常中断处理程序中取出SWI 立即数的步骤为首先确定引起软中断的SWI指令是ARM 指令还时Thumb 指令这可通过对SPSR 访问得到然后要取得该SWI 指令的地址这可通过访问LR 寄存器得到接着读出指令分解出立即数。 读出SWI 立即数 T_bit EQU 0x20 SWI_Hander 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 位) BICNQ R0,R0,#0xFF00000 ;取得ARM 指令的24 位立即数 … LDMFD SP!,{R0-R3,R12,PC}^ ;SWI 异常中断返回 MRS 读状态寄存器指令。在ARM 处理器中只有MRS 指令可以状态寄存器CPSR 或SPSR读出到通用寄存器中。指令格式如下 MRS{cond} Rd ,psr 其中 Rd 目标寄存器。Rd 不允许为R15。 psr CPSR 或SPSR MRS指令举例如下 MRS R1,CPSR ;将CPSR 状态寄存器读取保存到R1 中 MRS R2,SPSR ;将SPSR 状态寄存器读取保存到R2 中 MRS 指令读取CPSR可用来判断ALU 的状态标志或IRQ、FIQ 中断是否允许等在异常处理程序中读SPSR 可知道进行异常前的处理器状态等。MRS 与MSR 配合使用实现CPSR 或SPSR 寄存器的读—修改---写操作可用来进行处理器模式切换()允许/禁止IRQ/FIQ 中断等设置。另外进程切换或允许异常中断嵌套时也需要使用MRS 指令读取SPSR 状态值。保存起来。 使能IRQ 中断例程 ENABLE_IRQ MRS R0,CPSR BIC R0。R0,#0x80 MSR CPSR_c,R0 MOV PC,LR 禁能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 要传送到状态寄存器指定域的数据的源寄存器。 MSR 指令举例如下 MSR CPSR_c,#0xD3 ;CPSR[7…0]0xD3即切换到管理模式。 MSR CPSR_cxsf,R3 ;CPSRR3 只有在特权模式下才能修改状态寄存器。 程序中不能通过MSR 指令直接修改CPSR 中的T 控制位来实现ARM 状态/Thumb 状态的切换必须使用BX 指令完成处理器状态的切换(因为BX 指令属转移指令它会打断流水线状态实现处理器状态切换)。MRS 与MSR 配合使用实现CPSR 或SPSR 寄存器的读-修改-写操作可用来进行处理器模式切换、允许/禁止IRQ/FIQ 中断等设置。 堆栈指令实始化例程 INITSTACK MOV R0,LR ;保存返回地址 ;设置管理模式堆栈 MSR CPSR_c,#0xD3 LDR SP,StackSvc ;设置中断模式堆栈 MSR CPSR_c,#0xD2 LDR SP,StackIrq …A.2.7 ARM 伪指令 ARM 伪指令不是ARM 指令集中的指令只是为了编程方便编译器定义了伪指令使用时可以像其它ARM 指令一样使用但在编译时这些指令将被等效的ARM 指令代替。ARM 伪指令有四条分别为ADR 伪指令、ADRL 伪指令、LDR 伪指令和NOP 伪指令。 ADR 小范围的地址读取伪指令。ADR 指令将基于PC 相对偏移的地址值读取到寄存器中。在汇编编译源程序时ADR 伪指令被编译器替换成一条合适的指令。通常编译器用一条ADD 指令或SUB 指令来实现该ADR 伪指令的功能若不能用一条指令实现则产生错误编译失败。 ADR 伪指令格式如下 ADR{cond} register,exper 其中register 加载的目标寄存器。 exper 地址表达式。当地址值是非字地齐时取值范围-255255 字节之间当地址是字对齐时取值范围-10201020 字节之间。 对于基于PC 相对偏移的地址值时给定范围是相对当前指令地址后两个字处(因为ARM7TDMI 为三级流水线)。 ADR 伪指令举例如下 LOOP MOV R1, #0xF0 … ADR R2, LOOP ;将LOOP 的地址放入R2 ADR R3, LOOP4 可以用ADR 加载地址实现查表 … ADR R0,DISP_TAB ;加载转换表地址 LDRB R1,[R0,R2] ;使用R2 作为参数进行查表 … DISP_TAB DCB 0Xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 ADRL 中等范围的地址读取伪指令。ADRL 指令将基于PC 相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中比ADR 伪指令可以读取更大范围的地址。在汇编编译源程序时ADRL 伪指令被编译器替换成两个条合适的指令。若不能用两条指令实现ADRL 伪指令功能则产生错误编译失败。ADRL 伪指令格式如下 ADR{cond} register,exper 其中register 加载的目标寄存器。 expr 地址表达式。当地址值是非字对齐时取范围-64K64K 字节之间当地址值是字对齐时取值范围-256K256K 字节之间。 ADRL 伪指令举例如下 ADRL R0,DATA_BUF … ADRL R1 DATA_BUF80 … DATA_BUF SPACE 100 ;定义100 字节缓冲区 可以且用ADRL 加载地址实现程序跳转中等范围地址的加载 … ADR LR,RETURNI ;设置返回地址 ADRL R1 Thumb_Sub1 ;取得了Thumb 子程序入口地址且R1 的0 位置1 BX R1 ;调用Thumb 子程序并切换处理器状态 RETURNI … CODE16 Thumb_Sub MOV R1,#10 … LDR 大范围的地址读取伪指令。LDR 伪指令用于加载32 位的立即数或一个地址值到指定寄存器。在汇编编译源程序时LDR 伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV 或MVN 的范围则使用MOV 或MVN 指令代替该LDR 伪指令否则汇编器将常量放入字池并使用一条程序相对偏移的LDR 指令从文字池读出常量。LDR 伪指令格式如下 LDR{cond} register,expr/label_expr 其中register 加载的目标寄存器 expr 32 位立即数。 label_expr 基于PC 的地址表达式或外部表达式。 LADR 伪指令举例如下。 LDR R0,0x123456 ;加载32 位立即数0x12345678 LDR R0,DATA_BUF60 ;加载DATA_BUF 地址60 … LTORG ;声明文字池 伪指令LDR 常用于加载芯片外围功能部件的寄存器地址(32 位立即数)以实现各种控制操作加载32 位立即数 … LDR R0,IOPIN ;加载GPIO 寄存器IOPIN 的地址 LDR R1,[R0] ;读取IOPIN 寄存器的值 … LDR R0,IOSET LDR R1,0x00500500 STR R1,[R0] ;IOSET0x00500500 … 从PC 到文字池的偏移量必须小于4KB。与ARM 指令的LDR 相比伪指令的LDR 的参数有“”号 NOP 空操作伪指令。NOP 伪指令在汇编时将会被代替成ARM 中的空操作比如可能为“MOV R0, R0”指令等NOP 伪指令格式如下 NOP NOP NOP NOP SUBS R1, R1, #1 BNE DELAY1 …转载于:https://www.cnblogs.com/getyoulove/p/3672034.html