赞
踩
注意:有一个约定,编号低的寄存器在存储数据或者加载数据时对应于存储器的低地址。
Load/Store指令13-2
例如 LDMIA/IB/DA/DB R13!,{R0-R1,R3};
各指令执行完后,结果如图所示。
Load/Store指令13-4
FD、ED、FA和EA指定是满栈还是空栈,是升序栈还是降序栈,用于堆栈寻址。
一个满栈的栈指针指向上次写的最后一个数据单元.
空栈的栈指针指向第一个空闲单元。
一个降序栈是在内存中反向增长而升序栈在内存中正向增长。
Load/Store指令13-5
格式:
LDM{<cond>}{<type>} <Rn>{!},<regs>{^};
{!}:若选用了此后缀,则当指令执行完毕后,将最后的地址写入基址寄存器。
{^}:当regs中不包含PC时,该后缀用于指示指令所用的寄存器为用户模式下的寄存器,否则指示指令执行时,将寄存器SPSR的值复制到CPSR中。
Load/Store指令14-1
14.STM 批量数据存储指令
格式:STM{<cond>}{<type>} <Rn>{!},<regs>{^};
功能:将各个寄存器的值存入一片连续的内存单元中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。
该指令一般用于多个寄存器数据的入栈。
{^}:指示指令所用的寄存器为用户模式下的寄存器。
其他参数用法同LDM指令。
例如:
STMEA R13!,{R0-R12,PC}
;将寄存器R0~R12以及程序计数器PC的值保存到R13指示的堆栈中
Load/Store指令14-2
举例:其中R1为指令执行前的基址寄存器,R1’则为指令执行后的基址寄存器
Load/Store指令14-3
堆栈操作和数据块传送指令类似,也有4种模式,它们之间的关系如下表所示:
Load/Store指令15
15.SWP 字数据交换指令
格式:SWP{<cond>} <Rd>,<op1>,[<op2>];
功能: Rd=[op2],[op2]=op1
从op2所表示的内存装载一个字并把这个字放置到目的寄存器Rd中,然后把寄存器op1的内容存储到同一内存地址中。
op1,op2均为寄存器。
例如:
SWP R0,R1,[R2]
;将R2所表示的内存单元中的字数据装载到R0,然后将R1中的字数据保存到R2所表示的内存单元中
Load/Store指令16
16.SWPB 字节数据交换指令
格式:SWP{<cond>}B <Rd>,<op1>,[<op2>];
功能:从op2所表示的内存装载一个字节并把这个字节放置到目的寄存器Rd的低8位中,Rd的高24位设置为0;然后将寄存器op1的低8位数据存储到同一内存地址中。
例如:
SWPB R0,R1,[R2]
;将R2所表示的内存单元中的一个字节数据装载到R0的低8位,然后将R1中的低8位字节数据保存到R2所表示的内存单元中
程序状态寄存器指令
用于状态寄存器和通用寄存器间传送数据。
总共有两条指令:MRS和MSR。
两者结合可用来修改程序状态寄存器的值。
程序状态寄存器指令1
1.MRS 程序状态寄存器到通用寄存器的数据传送指令
格式:MRS{<cond>} <Rd>,CPSR/SPSR;
功能:用于将程序状态寄存器的内容传送到目标寄存器Rd中。
当进入中断服务程序或进程切换时,该指令可用来保存当前状态寄存器的值。
例如:
MRS R0,CPSR
;状态寄存器CPSR的值存入寄存器R0中
程序状态寄存器指令2
2.MSR 通用寄存器到程序状态寄存器的数据传送指令
格式:MSR{<cond>} CPSR/SPSR_<field>,<op1>;
功能:用于将寄存器Rd的值传送到程序状态寄存器中。
当退出中断服务程序或进程切换时,该指令可用来恢复状态寄存器的值。
操作数op1可以是通用寄存器或立即数。
<field>:用来设置状态寄存器中需要操作的位。
32位的状态寄存器可以分为4个域:
位[31:24]为条件标志位域,用f表示。
位[23:16]为状态位域,用s表示。
位[15:8]为扩展位域,用x表示。
位[7:0]为控制位域,用c表示。
例如:MSR CPSR_f,R0
;用R0的值修改CPSR的条件标志域
MSR CPSR_fsxc,#5; CPSR的值修改为5
协处理器指令
ARM处理器最多可支持16个协处理器,用于辅助ARM完成各种协处理操作。
在程序执行过程中,各协处理器只执行自身的协处理指令,而忽略属于ARM处理器和其他协处理器的指令。
ARM协处理器指令可分为3类:
(1)ARM处理器用于初始化协处理器的数据操作指令(CDP)。
(2)协处理器寄存器和内存单元之间的数据传送指令(LDC,STC)。
(3)ARM处理器寄存器和协处理器寄存器之间的数据传送指令(MCR,MRC)。
CDP协处理器操作指令
格式:CDP{<cond>}<p>,<opcode1>,<CRd>,<CRm>,<CRn>,<opcode2>;
功能:用于传递指令给协处理器p,要求其在寄存器CRn和CRm上,进行操作opcode1,并把结果存放到CRd中,可以使用opcode2提供与操作有关的补充信息。
指令中的所有寄存器均为协处理器的寄存器,操作由协处理器完成。
指令中:
P为协处理器编号;
CRd为目的寄存器的协处理器寄存器;
CRm和CRn为存放操作数的协处理器寄存器;
Opcode1和opcode2为协处理器即将执行的操作。
例如:CDP p5,5,c0,c1,c2,9;
该指令用于通知协处理器p5,在c1和c2上执行操作5和9,并将结果存放到c0中。
LDC协处理器数据读取指令
格式:LDC {<cond>}{L}<p>,<CRd>,<addr>;
功能:将addr表示的内存地址中的连续数据传送到目的寄存器CRd中。
L表示指令为长读取操作,比如用于双精度数据的传输;
目的寄存器CRd为协处理器的寄存器;
addr的寻址方式同LDR指令,其寄存器为ARM处理器的寄存器。
例如:
LDC p5,c1,[R1+5]:该指令用于将R1+5所对应的存储单元中的数据,传送到协处理器p5的寄存器c1中。
STC协处理器数据存储指令
格式:STC{<cond>}{L}<p>,<CRd>,<addr>;
功能:将寄存器CRd的值传送到addr表示的内存地址中。指令中各参数用法同LDC。
例如:STC p5,c1,[R1+5];
该指令用于将协处理器p5中寄存器c1的数据传送到R1+5所对应的存储单元中。
MCR ARM寄存器到协处理器寄存器的数据传送指令
格式:MCR{<cond>}<p>,<op1>,<Rd>,<CRn>,<CRm>{,op2};
功能:将ARM处理器的寄存器Rd中的数据传送到协处理器p的寄存器CRn,CRm中;op1,op2为协处理器将要执行的操作。
例如:MCR p5,5,R1,C1,C2,9;该指令将R1中的数据传送到协处理器p5的寄存器C1,C2中,协处理器执行操作5和9。
MRC 协处理器寄存器到ARM寄存器的数据传送指令
格式:MRC {<cond>}<p>,<op1>,<Rd>,<CRn>,<CRm>{,op2};
功能:将协处理器p的寄存器CRn,CRm的数据传送到ARM处理器的寄存器Rd中;op1,op2为协处理器将要执行的操作。
例如:MRC p5,5,R1,C1,C2,9;该指令将寄存器C1,C2中的数据传送到R1中,协处理器p5协处理器执行操作5和9。
异常中断指令1
1.SWI 软件中断指令
格式:SWI {<cond>} 24位的立即数;
功能:用于产生软件中断,以使用户程序调用操作系统的系统例程。
指令中24位的立即数指定用户程序调用系统例程的类型,其参数通过通用寄存器传递。
当24位的立即数被忽略时,系统例程类型由寄存器R0指定,其参数通过其他通用寄存器传递。
例如:
SWI 0X05; 调用编号为05的系统例程。
异常中断指令3
2.BKPT 断点中断指令
格式:BKPT 16位的立即数;
功能:用于产生软件断点中断,以便软件调试时使用。16位的立即数用于保存软件调试中额外的断点信息。
指令操作的伪代码:
if (not overdiden by debug hardware) then
R14_abt = adderss of BKPT instruction + 4
SPSR_abt = CPSR
CPSR[4:0] = 0b10111
CPSR[5] = 0
CPSR[7] = 1
if high vectors configured then
PC = 0xFFFF000C
else
PC = 0x0000000C
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。