第四章 ARM指令系统
- 格式:wps
- 大小:598.00 KB
- 文档页数:10
ARM指令系统.txt蜜蜂整日忙碌,受到赞扬;蚊子不停奔波,人见人打。
多么忙不重要,为什么忙才重要。
1.ARM指令的寻址方式有几种?试分别举例说明。
答:立即数寻址:MOV R0,#15寄存器寻址:ADD R0,R1,R2寄存器间接寻址:LDR R0,[R4]寄存器移位寻址:ADD R0,R1,R2,LSL #1基址变址寻址:LDR R0,[R1,#4]多寄存器寻址:LDMIA R0!,{R1-R4}相对寻址:BL proc;跳转到子程序proc处执行…proc MOV R0,#1堆栈寻址:STMFD R13!,{R0-R4};LDMFD R13!,{R0-R4};2.ARM指令系统对字节、半字、字的存取是如何实现的?LDR/STR字数据加载/存储指令LDRB/STRB字节数据加载/存储指令LDRH/STRH半字数据加载/存储指令LDRSB/LDRSH有符号数字节/半字加载指令3.如何从ARM指令集跳转到Thumb指令集?BX指令跳转到指令中所指定的目标地址,并实现状态的切换。
Rm是一个表达目标地址的寄存器。
当Rm中的最低位Rm[0]为1时,强制程序从ARM指令状态跳到Thumb指令状态;当Rm中的最低位Rm[0]为0时,强制程序从Thumb指令状态跳到ARM指令状态。
4.ARM指令集支持哪几种协处理器指令?CDP LDC STC MCR MRC5.ARM指令的条件码有多少个?默认条件码是什么?15个默认条件码是AL6.ARM指令中的第二操作数有哪几种形式?试举例说明。
寄存器形式MOV R1,R0;将寄存器R0的值传送到寄存器R1立即数形式MOV R0,#5;将立即数5传送到寄存器R0被移位的寄存器形式MOV R1,R0,LSL#37.MOV指令与LDR指令有何区别?LDR指令用于在存储器和处理器的寄存器之间传送数据MOV主要用于将一个寄存器中的数据传送到另一个寄存器,或者将一个立即数传送到寄存器,8.判断下列指令正误,并说明理由?(1)LDR R3,[R4]!(2)ADD R6,R5,#4!(3)LDMIA R6,{R3-R7}!(4)LDMFD R13!,{R2,R4}(5)ADD R1,R2,#0x104(6)ADD R1,R2,#0x101(7)MOV R0,R0(8)MVN R7,#0x2F100(9)MVN R0,R3,#2_011100(10)SBC R15,R6,LSR R5(11)AND R5,[R6],R7(12)MRS R15,CPSR(13)MSR CPSR,#0x001(14)MUL R3,R3,R6(15)MUL R4,R6,#0x80(16)STRB SPLDRB R1,[R6,R4],R6(18)STRB R0,[R15,#0x04]!(19)LDRB PC,[R5](20)LDRSB R5,[R4,#0x101](21)STRSH R6,[R5]9.下列指令在什么条件下被执行SUBMI R3,R3,#0x08负数ADDNE R0,R0,R4不等10.下列两段代码是用来实现打开中断和关闭中断,请补齐空白处内容MRS R1,CPSRBIC R0,R1,__ #0x80MSR CPSR_c,R0MRS R1,CPSRORR R1,___MSR CPSR_c,R111.举例说明B和BL指令的区别、BX和BLX的区别?B指令示例:backword SUB Rl,R1,#1CMP R1,#0;比较R1和0BEQ forward;如果R1=0则跳转到forward处执行SUB R1,R2,#3SUB R1,R1,#1forward ADD R1,R2,#4ADD R2,R3,#2B backword;程序无条件跳转到标号backword处执行BL指令示例…BL func;跳转到子程序ADD R1,R2,#2;子程序调用完返回后执行的语句,返回地址…func;子程序…;子程序代码MOV R15,R14;复制返回地址到PC,实现子程序的返回BX指令示例CODE32;ARM程序段,32位编码arm1 ADR R0,thumb1+1;伪指令,把语句标号thumb1所在的地址赋;给R0,末位R0[0]置1,要跳转到THUMB指令集MOV LR,PC;设置返回地址BX R0;跳转ADD R1,R2,#2;返回地址处,第4条指令CODE16;THUMB程序段,16位编码thumb1 ADD R1,R3,#1;THUMB程序…BX LR;跳转到返回地址处,执行第4条指令BLX指令示例CODE32;ARM程序段,32位编码arm1 ADR R0,thumb1+1;伪指令,把语句标号thumb1所在的地址赋;给R0,末位R0[0]置1,要跳转到THUMB指令集;MOV LR,PC;该指令注销,比较BL指令BLX R0;跳转,同时设置返回地址即PC?LRADD R1,R2,#2;返回地址处,第4条指令CODE16;THUMB程序段,16位编码thumb1 ADD R1,R3,#1;THUMB程序…BX LR;跳转到返回地址处,执行第4条指令分析:使用BLX指令代替BX指令简化了Thumb例程的调用,因为BLX指令在连接寄存器LR中自动设置了返回地址。
一、ARM处理器寻址方式寻址名称指令格式举例指令说明备注立即寻址SUBS R0,R0,#1 R0减1,结果放入R0,并且影响标志位立即数要以“#”号为前缀,“0x”表示16进制数值MOV R0,#0xFF000 将立即数0xFF000装入R0寄存器中寄存器寻址MOV R1,R2 将R2的值存入R1 操作数的值在寄存器中SUB R0,R1,R2 将R1的值减去R2的值,果保存到R0中寄存器移位寻址MOV R0,R2,LSL#3 R2的值左移3位,结果放入R0,即时R0=R2*8 ANDS R1,R1,R2,LSL R3 R2的值左移R3位,然后和R1相与,结果放入R1 可采取的移位操作LSL 逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0LSR 逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0ASR 算数右移(Arithmetic Shift Right),移位过程中保持符号位不变,即若源操作数为正数,则字的高端空出的位补0,否则补1。
ROR 循环右移(Rotate Right),由字的低端移出的位填入字的高端空出位.RRX 带扩展的循环右移(Rotate Right eXtended by 1 place),操作数右移一位,高端空出的位用原C标志值填充。
寄存器间接寻址LDR R1,[R2] 将R2指向的存储单元的数据读出,保存在R1中即寄存器为操作数的地址指针。
SWP R1,R1,[R2] 将寄存器R1的值和R2指定的存储单元的内容交换多寄存器寻址LDMIA R1!,{R2--R7,R12} 将R1指向的单元中的数据读出到寄存器R2~R7、R12中(R1自动加1)使用多寄存器寻址指令时,寄存器子集的顺序是由小到大的顺序排列,连续的寄存器可用“--”连接,否则用“,”分隔书写。
STMIA R0!,{R2--R7,R12} 将寄存器R2~R7、R12的值保存到R0指向的存储单元中(R0自动加1)块拷贝寻址STMIA R0!,{R1-R7} 将R1~R7的数据保存到存储器中。
存储指针在保存第一个值之后增加,增长方向为向上增长块拷贝寻址指令用于将一块数据从存储器的某一位置拷贝到令一位置STMIB R0!,{R1-R7} 将R1~R7的数据保存到存储器中。
存储指针在保存第一个值之前增加,增长方向为向上增长STMDA R0!,{R1-R7} 将R1~R7的数据保存到存储器中。
存储指针在保存第一个值之后增加,增长方向为向下增长STMDB R0!,{R1-R7} 将R1~R7的数据保存到存储器中。
存储指针在保存第一个值之前增加,增长方向为向下增长堆栈寻址 STMFD SP!,{R1-R7,LR}将R1~R7、LR 入栈。
满递减堆栈。
堆栈是一种按特定顺序进行存取的存储区,操作顺序分为“后进先出”或“先进后出”。
存储器堆栈分为两种:1、向上生长:向高地址方向生长,称为递增堆栈;2、向下生长:向低地址方向生长,称为递减堆栈。
LDMFD SP!,{R1-R7,LR} 数据出栈,放入R1~R7、LR 寄存器。
满递减堆栈堆栈类型 FA(满递增) 堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。
指令如LDMFA 、STMFA 等。
EA(空递增)堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。
指令如LDMEA 、STMEA 等。
FD(满递减) 堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。
指令如LDMFD 、STMFD 等。
ED(空递减) 堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。
指令如LDMED 、STMED 等基址寻址 LDR R2,[R3,#0x0C]读取R3+0x0C 地址上的存储单元的内容,存入R2基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。
STR R1,[R0,#-4] 先R0=R0-4,然后把R1的值保存到R0指定的存储单元LDR R1,[R0,R3,LSL#1]将R0+R3*2地址上的存储单元的内容读出,存入R1相对寻址 BL SUBR1 ;调用到SUBR1子程序BEQ LOOP ;条件跳转到LOOP 标号处……LOOP: MOV R6,#1 …… SUBR1: …… 相对寻址是基址寻址的一种变通。
操作数的有效地址=基准地址+偏移量二、ARM 指令集1、指令格式ARM 指令的基本格式:<opcode> {<cond>} {S} <Rd>,<Rn> {,<operand 2>} 其中,<>号内的项是必需的,{}号内的项是可选的。
基本格式中各部分的意义如下表:第2个操作数的三种使用形式如下表:#immed_8r —常数表达式该常数必须对应8位位图,即常数是一个8位的常数循环移位偶数位得到。
例:合法常量:0x3FC(0xFF<<2)、0、0xF0000000(0xF0<<24) 非法常量;0x1FE 、511、0xFFFF 等。
指令;AND R1,R2,#0x0F Rm —寄存器方式在寄存器方式下,操作数即为寄存器的数值。
应用指令举例: SUB R1,R1,R2 MOV PC,R0 Rm,shift —寄存器移位方式 将寄存器的移位结果作为操作数,但Rm 的值保持不变。
移位方法如下: LSL #n 逻辑左移n 位(1≤n ≤31)LSR #n 逻辑右移n 位(1≤n ≤32) ASR #n 算术右移n 位(1≤n ≤32) ROR #n 循环右移n 位(1≤n ≤31) RRX 带扩展的循环右移1位type RsType 为LSL 、LSR 、ASR 和ROR 中的一种;Rs 偏移量寄存器,低8位有效。
若其值≥32,则第2个操作数的结果为0(ARS 、ROR 例外)。
例如:ADD R1,R1,R1,LSL#3 ;R1=R1*9R15为处理器的程序计数器PC ,一般不要对其进行操作,而且有些指令不允许使用R15的,如UMULL 指令。
2、条件码:使用指令条件码可实现高效的逻辑操作,提高代码效率。
指令条件码表如下: 操作码 条件码助记符 标志 含义 0000 EQ Z=1 相等 0001 NE Z=0 不想等 0010 CS/HS C=1 无符号数大于或等于 0011 CC/LO C=0 无符号数小于 0100 MI N=1 负数 0101 PL N=0 正数或零 0110 VS V=1 溢出 0111 VC V=0 没有溢出 1000 HI C=1,Z=0 无符号数大于opcode 指令助记符,如LDR 、STR 等 cond 执行条件,如EQ 、NE 等 S 是否影响CPSR 寄存器的值,书写时影响CPSR Rd 目标寄存器 Rn 第1个操作数的寄存器operand 2 第2个操作数1001 LS C=0,Z=1 无符号数小于或等于1010 GE N=V 有符号数大于或等于1011 LT N!=V 有符号数小于1100 GT Z=0,N=V 有符号数大于1101 LE Z=1,N!=V 有符号数小于或等于1110 AL 任何无条件执行(指令默认条件)1111 NV 任何从不执行(不要使用)对于Thumb指令集,只有B指令具有条件码执行功能,此指令的条件码同上表。
如果为无条件执行时,条件码助记符AL不能在指令中书写。
条件码应用举例CMP R0,R1 R0和R1比较ADDHI R0,R0,#1 若R0>R1,则R0=R0+13、ARM存储器访问指令ARM存储器访问指令表如下:助记符说明操作条件码位置LDR Rd,addressing 加载字数据Rd←[addressing], addressing索引LDR{cond} LDRB Rd,addressing 加载无符号字节数据Rd←[addressing], addressing索引LDR{cond}B LDRT Rd,addressing 以用户模式加载字数据Rd←[addressing], addressing索引LDR{cond}T LDRBT Rd,addressing 以用户模式加载无符号字节数据Rd←[addressing], addressing索引LDR{cond}BT LDRH Rd,addressing 加载无符号半字数据Rd←[addressing], addressing索引LDR{cond}H LDRSB Rd,addressing 加载有符号字节数据Rd←[addressing], addressing索引LDR{cond}SB LDRSH Rd,addressing 加载有符号半字数据Rd←[addressing], addressing索引LDR{cond}SH STR Rd,addressing 存储字数据[addressing]←Rd, addressing索引STR{cond} STRB Rd,addressing 存储字节数据[addressing]←Rd, addressing索引STR{cond}B STRT Rd,addressing 以用户模式存储字数据[addressing]←Rd, addressing索引STR{cond}T STRBT Rd,addressing 以用户模式存储字节数据[addressing]←Rd, addressing索引STR{cond}BT STRH Rd,addressing 存储半字数据[addressing]←Rd, addressing索引STR{cond}H LDM{mode} Rn{!},reglist 多寄存器加载reglist←[Rn....],Rn回写等LDM{cond}{mode} STM{mode} Rn{!},reglist 多寄存器存储[Rn....]←reglist,Rn回写等STM{cond}{mode} SWP Rd,Rm,Rn 寄存器和存储器字数据交换Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond} SWPB Rd,Rm,Rn 寄存器和存储器字节数据交换Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}B LDM、STM的主要用途是现场保护、数据复制、参数传送等。
其模式有如下8种。
1 IA 每次传送后地址加4 用于数据块传输多寄存器传送指令映射2 IB 每次传送前地址加4 向上生长向下生长3 DA 每次传送后地址减4 满空满空4 DB 每次传送前地址减4 增加之前STMIB、STMFA LDMIB、LDMED5 FD 满递减堆栈用于堆栈操作之后STMIA、STMEA LDMIA、LDMFD6 ED 空递减堆栈减少之前LDMDB、LDMEA STMDB、STMFD7 FA 满递增堆栈之后LDMDA、LDMFA STMDA、STMED8 EA 空递增堆栈4、ARM数据处理指令数据处理指令大致可分为3类:数据传送指令、算术逻辑运算指令和比较指令。