4.4.3立即操作数循环
????μμóé Foxit Reader ±à?-°?è¨??óD ·-°?2?????1??à1à?£
立即操作数的循环量是五位的无符号整数,它指定了8位立即数的位移量,这个值可以从零扩展的到32,如果循环量为m,则立即数循环的结果为立即数*2m。4.4.4写R15
当Rd(目的寄存器)不包含R15,CPSR中的条件标志位就可以由ALU标志位修改,如上所述。当Rd是R15,且指令中的S位没有被置位,操作结果会被放到R15并且CPSR不受影响。当Rd是R15,且指令中的S位被置位,操作结果会被放到R15并且当前模式下SPSR保存到CPSR。这就允许状态改变(PC,CPSR的值自动恢复),这种指令格式在用户模式中不被用到。
4.4.5R15作为操作数
如果R15(PC)在数据处理指令中被当作操作数,那么这个寄存器可以直接应用。PC的值是指令的地址,依据指令预取加8或者12字节。如果位移在指令中指定,PC是当前指令地址8个字节之前,如果位移量在寄存器中指定,PC将是当前指令地址之前12个字节。4.4.6TEQ,TST,CMP和CMN操作码
这些指令不写操作结果,但是修改CPSR的标志位,编译器自动置位S(对这些指令)即使指令中没有置位S。
以前处理器用到的TEQP指令格式没有用在32位模式,取而代之的是PSR传输指令。如果在这些模式中用到,处理器处于管理模式它的作用相当于保存SPSR_
数据处理指令依照incremental周期数不同时间也不同,如下所示:
正常数据处理1S寄存器指定位移量的数据处理1S+1IDataProcessingwithPCwritten2S+1N寄存器指定位移量的数据处理和PC写指令2S+1N+1I
31
This file is generated by AlienTools PDF Generator, unregister version
4.4.8汇编语法(1)(2)(3)
MOV,MVN-单操作数指令
<操作码>{条件代码}{S}Rd,<操作数2>CMP,CMN,TEQ,TST不改变执行结果<操作码>{条件代码}{S}Rd,Rn,<操作数2>AND,EOR,SUB,RSB,ADD,ADC,SBC,RSC,ORR,BIC<操作码>{条件代码}{S}Rd,Rn,<操作数2>
操作数2可以是Rm,
{S}-如果S存在,则需要设置条件代码(用于CMP,CMN,TEQ,TST)
如果用到<表达式>,编译器将会尝试产生一个移位的8位立即数与表达式匹配,如果尝试失败,将报错。
ADDEQR2,R4,R5TEQSR4,#3
SUBR4,R5,R7,LSRR2MOVMOVS
PC,R14PC,R14
;如果Z标志位为1,R2:=R4+R5;
;测试R4是否等于3(编译器自动加入S,所以S为冗余);将R7中的值逻辑右移,位移量包含在R2的低字节,从R15;中减去移位结果,并送入R4;从子程序返回
;从异常返回,从SPSR模式释放CPSR
32
This file is generated by AlienTools PDF Generator, unregister version
4.5PSR传输(MRS,MSR)
????μμóé Foxit Reader ±à?-°?è¨??óD ·-°?2?????1??à1à?£
此指令只有在条件为真时才执行。不同条件已经在本章开始时定义。
MSR和MRS指令由数据处理操作的子集构成,经常和没有设置S标志位的指令关联(TEQ,TST,CMN,CMP),编码在图17显示。
此指令允许访问CPSR,SPSR。MRS指令允许转移CPSR或SPSR到通用寄存器中,同样MSR允许转移通用寄存器的内容到CPSR或SPSR.。
MSR指令允许立即数或寄存器的值传送到CPSR或SPSR的条件代码标志位(N,V,Z,C),但不影响控制位。在这种情况下,指定寄存器的高4位或32位立即数被写入到相关的PSR的高4位。4.5.1操作数制
在用户模式,CPSR的控制位被保护而不能改变,所以只有CPSR的条件代码标志位可以改变,在其它的模式(管理模式),整个CPSR都可以改变。
SPSR可否访问要看正在执行的模式,比如只有在FIQ模式下SPSR_fiq才可以访问。R15不能被指定为源或者目的寄存器。
在用户模式下不要试图访问SPSR,因为此寄存器根本不存在。
33
This file is generated by AlienTools PDF Generator, unregister version
MRS(传递PSR的内容到寄存器)312827232221COND00010PS1615001111RD12110000000000000目标寄存器源PSR0=CPSR1=SPSR_<当前模式>条件代码MSR(传送寄存器的值到PSR)312827232221COND00010PD121110100111110000000043RM0源寄存器目标PSR条件代码区MSR(仅传送寄存器的值或立即数到PSR的标志位)
312827232221COND00I10PD10100011111211源操作数0源PSR0=CPSR1=SPSR_<当前模式>立即操作数0=源操作数为寄存器1100000000条件代码区源寄存器1=源操作数位立即数43Rm0RotateImm立即数的循环移位量无符号的8位立即数图17:PSR传输
34
This file is generated by AlienTools PDF Generator, unregister version
4.5.2保留位
在ARM7的PSR寄存器中,只定义了11位(N,Z,C,V,I,F和M[4:0]);其余的位(=PSR[27:8,5])保留,以备以后版本的ARM处理器应用,为了保证处理器最大限度地兼容,必须遵守以下规则:
(1)在改变PSR的值时,保留位保持不变。
(2)程序不应该依靠保留位的值来查检查PSR的状态,因为这些保留位在以后版本的处
理其中,可能被读为’1’,也可能被读为’0’。当改变任何PSR的控制位时,应该用到读-改-写指令,如下:用MRS指令传送相应的PSR寄存器到通用寄存器中,只改变相关联的位,然后用MSR指令传送已经改变的值到PSR寄存器中。
例下面一系列语句执行模式改变:
MRSBICORRMSR
R0,CPSRR0,R0,#0X1F
R0,R0,#new_modeCPSR,R0
;复制CPSR到R0;清除模式位;选择新模式;回写
如果只是简单地改变PSR中条件代码标志位的值,数据可以直接写到标志位,不会改变控制位。下面的指令设置N,Z,C和V标志位。
MSRCPSR_flg,#0XF0000000
;设定所有的标志位而不管他们之前出于什么状态;(不会影响控制位)
不要尝试写一个8位的立即数到PSR,因为这样操作会改变保留位。4.5.3指令周期
PSR传输花费1Sincremental周期,S在5.1指令类型中定义。(65页)4.5.4编译器语法
(1)MRS-传送PSR的值到寄存器
MRS{cond}Rd,
MSR-传送寄存器的值到PSRMSR{cond}
MSR-只传送寄存器的值到PSR的标志位MSR{cond}
寄存器最高4位分别被写入N,Z,C,和V标志位。
(4)MSR-只传送立即数到PSR的标志位
MSR{cond}
表达式应该计算出一个32位值,其中的最高四位分别被写入N,Z,C,和V标志位。{cond}-条件代码
RdandRm为寄存器的序列号,0-15
一样)
35
This file is generated by AlienTools PDF Generator, unregister version