ARM指令集与编程解析课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《ARM指令集与编程解析课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 指令 编程 解析 课件
- 资源描述:
-
1、ARM指令集与编程1ARM指令集与编程1.总体介绍:指令分类,特点,格式,条件码2.数据处理指令:数据传输指令,算术指令,逻辑指令,比较指令,乘法指令(略),前导零计数(略)3.程序状态访问指令4.跳转指令5.单数据访存指令6.多数据访存指令7.其它指令:信号量操作指令,异常中断产生指令,协处理器指令(略)8.伪指令(略)9.基于ARM的编程1 总体介绍指令分类、特点、格式、条件码ARM指令集与编程31.1 指令分类 ARM指令集总体分为6类指令 数据处理指令:数据传输指令,算术指令,逻辑指令,比较指令,乘法指令,前导零计数。程序状态访问指令:mrs和msr。跳转指令:b和bl。访存指令:单数
2、据访存指令,多数据访存指令,信号量操作指令。异常中断产生指令:swi和bkpt。协处理器指令。ARM指令集与编程41.2 指令特点 所有指令都是32bit。大多数指令都在单周期内完成。所有指令都可以条件执行。load/store体系结构。指令集可以通过协处理器扩展ARM指令集与编程51.3 ARM指令的格式s,Cond:指令的条件码。Opcode:指令操作码。S:操作是否影响cpsr。Rn:包含第一个操作数的寄存器编码。Rd:目标寄存器编码。Operand2:第2操作数。Cond001OpcodeSRnRdOperand2011121516192021242527283178ARM指令集与编程
3、61.3 ARM指令的格式(续)ARM指令集与编程71.4 ARM指令的条件执行所有的ARM指令可包含一个可选的条件码,只有在cpsr中的条件标志位满足指定的条件时,指令才会被执行。不符合条件的代码依然占用一个时钟周期(相当于一个NOP指令)。/r0,r1,r2,r3,r4:a,b,c,d,ecmpr0,r1cmpeq r2,r3addeq r4,r4,#1if(a=b)&(c=d)e+;ARM指令集与编程81.4.1 ARM指令的条件域EQ/NE:等于/不等于(equal/not equal)HS/LO:无符号数高于或等于/无符号数小于(higher or same/lower)HI/LS:
4、无符号数高于/无符号数低于或等于(higher/lower or same)GE/LT:有符号数大于或等于/有符号数小于(greater or equal/less than)GT/LE:有符号数大于/有符号数小于或等于(greater than/less or equal)MI/PL:负/非负VS/VC:溢出/不溢出(overflow set/overflow clear)CS/CC:进位/无进位(carry set/carry clear)ARM指令集与编程91.4.2 ARM指令的条件码0000EQZ置位相等/等于00001NEZ清0不等0010CS/HSC置位进位/无符号高于或等于00
5、11CC/LOC清0无进位/无符号低于0100MIN置位负数0101PLN清0非负数0110VSV置位溢出0111VCV清0无溢出ARM指令集与编程101.4.2 ARM指令的条件码(续)1000HIC置位且Z清0无符号高于1001LSC清0或Z置位无符号低于或等于1010GEN等于V有符号大于或等于1011LTN不等于V有符号小于1100GTZ清0且N等于V有符号大于1101LEZ置位或N不等于V有符号小于或等于1110AL任何状态总是(always)1111NV无从不(never)注:AL是默认的,NV不建议使用。ARM指令集与编程11目录1.总体介绍:指令分类,特点,格式,条件码2.数据
6、处理指令:数据传输指令,算术指令,逻辑指令,比较指令,乘法指令(略),前导零计数(略)3.程序状态访问指令4.跳转指令5.单数据访存指令6.多数据访存指令7.其它指令:信号量操作指令,异常中断产生指令,协处理器指令(略)8.伪指令(略)9.基于ARM的编程ARM指令集与编程122 数据处理指令 数据传输指令:mov和mvn 算数指令:add、adc、sub、sbc,rsb和rsc 逻辑指令:and、orr、eor和bic 比较指令:cmp、cmn、tst和teqARM指令集与编程132.1 数据处理指令的特点 所有的操作数要么来自寄存器,要么来自立即数,不会来自内存。如果有结果,则结果一定是为
7、32位宽,并且放在一个寄存器中,不会写入内存。(有一个例外:长乘法指令产生64位结果)每一个操作数寄存器和结果寄存器都在指令中独立指出,即:ARM指令采用3地址模式:Rd,Rn,RmARM指令集与编程142.2 四种寻址方式和s后缀add r0,r1,r2add r0,r1,#0 xffadd r0,r1,r1,LSL r2CondSRnRd第第 2 操作数操作数078111215161920opcode212400X25272831#immed_8#rot078110 0 0 0 0 0 0 0Rm03411方式1:#immed方式2:Rm0 0 0 0 Rm03411Rs78方式3:Rm
8、LSL RsshiftRm03411#immed_567方式4:Rm LSL#immed_5(#immed_5取值范围0-31)add r0,r1,r1,LSL#31ARM指令集与编程152.2.1 四种寻址方式的硬件支持寄存器,可能需要移位。如需移位,移位值可为:5bit的无符号整数(0-31)在指令的最低字节指定的另一寄存器立即数 8比特数8比特数循环右移偶数位右移位数由汇编器自动计算ARM指令集与编程162.2.2 立即数寻址 ARM指令中的立即数,由一个8bit的常数循环右移偶数位得到:立即数=(0-255)循环右移 2N位 例子:合法立即数:0 x3fc,0 x0,0 xf00000
9、00,0 xf0000001 非法立即数:0 x1fe,0 xffff,0 x1010,0 xf0000010ARM指令集与编程172.2.2 立即数寻址(续)同一个立即数可能有多个表示方法。如:0 x3f0=0 x3f 循环右移 28位 0 x3f0=0 xfc 循环右移 30位 对立即数的编码规则:如果立即数在0 0 xff之间,移位数为0。否则,就取决于编译器了。指令“mov r0,#0 x3f0”在ADS1.2中被编译为0 xe3a00ffc,在arm-elf-gcc-2.95.3中被编译为0 xe3a00e3f。ARM指令集与编程182.2.2 立即数寻址(续)对于有互补操作的指令,
10、编译器可以做智能的转换,比如:mvn r1,0 xffffff00-mov r1,0 xff add r1,r1,#0 xffffff00-sub r1,r1,#0 x100 adc r1,r1,#0 xffffff00-sbc r1,r1,#0 xff and r1,r1,#0 xffffff00-bic r1,r1,#0 xff这样,一些原本非法的立即数也可以正常编译通过。如果一个立即数,经过上述转换后是合法的,那么它也可以用在数据操作指令中。ARM指令集与编程192.2.3 寄存器移位寻址ASR 算术右移LSL 逻辑左移LSR 逻辑右移ROR循环右移RRX扩展的循环右移ARM指令集与编程
11、202.2.3 寄存器移位寻址(续)如果移位的位数由立即数(5bit,取值范围0-31)给出,就叫作 immediate specified shift;如果由Rs的低5位决定,就叫做register specified shift。Register specified shift的两点问题:不能使用pc:如果将pc寄存器用在Rn,Rd,Rm和Rs的位置上时,会产生不可预知的结果。额外代价(overhead):需要更多的周期才能完成指令,因为ARM没有能力一次读取3个寄存器。Immediate specified shift 没有上述问题。ARM指令集与编程212.2.3 寄存器移位寻址(续)
12、在register specified shift寻址方式下使用pc寄存器,编译器提示如下警告:在ADS1.2种编译产生如下警告之一:Warning A1477W:This register combination results in UNPREDICTABLE behavior Warning:A1320E:Undefined effect(using PC as Rn or Rm in register specified shift)Warning:A1319E:Undefined effect(using PC as Rs)但是在arm-elf-gcc-2.95.3中没有报告错误。A
13、RM指令集与编程222.2.4 后缀s 数据处理指令可以选择s后缀,以影响状态标志。但是比较指令(cmp、cmn、tst和teq)不需要后缀s,它们总会直接影响cpsr中的状态标志。在数据操作指令中,除了比较指令以外,其它的指令如果带有s后缀,同时又以pc为目标寄存器进行操作,则操作的同时从spsr恢复cpsr。比如:movs pc,#0 xff/*cpsr=spsr;pc=0 xff*/adds pc,r1,#0 xffffff00/*cpsr=spsr;pc=r1+0 xffffff00*/ands pc,r1,r2/*cpsr=spsr;pc=r1&r2;*/如果在user或者syste
14、m模式下使用带有s后缀的数据操作指令,同时以pc为目标寄存器,那么会产生不可预料的结果。因为user和system模式下没有spsr。ARM指令集与编程232.3 数据传输指令语法 s ,#s ,s ,LSL#s ,LSL 伪代码if ConditionPassed(cond)thenRd=第2操作数if s=1 and Rd=pc thencpsr=spsrelse if s=1 thenset NZCV flags in cpsrARM指令集与编程242.3 数据传输指令(续)举例 mov r0,r1/*r0=r1,不修改cpsr*/movr0,#0 x0/*r0=0,不修改cpsr*/m
15、ovsr0,#0 x0/*r0=0,同时设置cpsr的Z位*/movsr0,#-10/*r0=0 xfffffff6,同时设置cpsr的N位*/mvnr0,r2/*r0=NOT r2,不修改cpsr*/mvnr0,0 xffffffff/*r0=0 x0,不修改cpsr*/mvnsr0,0 xffffffff/*r0=0 x0,同时设置cpsr的Z位*/movr0,r1,LSL#1/*r0=r1 r2*/ARM指令集与编程252.3 数据传输指令(续)说明 mvn意为“取反传输”,它把源寄存器的每一位取反,将得到的结果写入结果寄存器。movs和mvns指令对pc寄存器赋值时有特殊含义,表示要求
16、在赋值的同时从spsr中恢复cpsr。对于mov和mvn指令,编译器会进行智能的转化。比如指令“mov r1,0 xffffff00”中的立即数是非法的。在编译时,编译器将其转化为“mvn r1,0 xff”,这样就不违背立即数的要求。所以对于mov和mvn指令,可以认为:合法的立即数反码也是合法的立即数。ARM指令集与编程262.4 算术指令语法 s,#s,s,LSL#s,LSL 伪代码(以加法add为例)if ConditionPassed(cond)thenRd=Rn+第2操作数if s=1 and Rd=pc thencpsr=spsrelse if s=1 thenset NZCV
17、flags in cpsrARM指令集与编程272.4 算术指令(续)举例 addr0,r1,r2/*r0=r1+r2*/adc r0,r1,r2/*r0=r1+r2+carry*/subr0,r1,r2/*r0=r1 r2*/sbcr0,r1,r2/*r0=r1 r2+carry-1*/rsbr0,r1,r2/*r0=r2 r1*/rscr0,r1,r2/*r0=r2 r1+carry 1*/addr0,r1,r1,LSL#31/*r0=r1+r1 31*/addr0,r1,r1,LSL r2/*r0=r1+r1 r2*/说明 adds和adcs在进位时将cpsr的C标志置1;否则置0。su
18、bs和sbcs在产生借位时将cpsr的C标志置0;否则置1。ARM指令集与编程282.5 逻辑指令语法 s,#s,s,LSL#s,LSL 伪代码(以and为例)If ConditionPassed(cond)thenRd=Rn AND 第2操作数if s=1 and Rd=pc thencpsr=spsrelse if s=1 thenset NZCV flags in cpsrARM指令集与编程292.5 逻辑指令(续)举例 andr0,r1,r2/*r0=r1 AND r2*/and r1,r1,#0 xffffff00/*r1=r1 AND 0 xffffff00*/orrr0,r1,r
19、2/*r0=r1 OR r2*/eorr0,r1,r2/*r0=r1 XOR r2*/bicr0,r1,r2/*r0=r1 AND NOT r2*/bicr1,r1,#0 x0f/*清空r1的低4位*/andr0,r1,r1,LSL#31/*r0=r1 AND(r1 r2)*/ARM指令集与编程302.6 比较指令 语法 ,#,LSL#,LSL 伪代码(以cmp为例)If ConditionPassed(cond)thenalu_out=Rn 第2操作数 set NZCV flags in cpsrARM指令集与编程312.6 比较指令(续)举例 cmpr1,r2/*根据r1 r2的结果设置c
20、psr,结果不写回*/cmn r1,r2/*根据r1+r2的结果设置cpsr,结果不写回*/tstr1,r2/*根据r1 AND r2的结果设置cpsr,结果不写回*/teqr1,r2/*根据r1 XOR r2的结果设置cpsr,结果不写回*/cmpr2,#5/*根据r2 5的结果设置cpsr,结果不写回*/cmpr1,r2,LSL#5/*根据r1 (r2 5)设置cpsr*/cmpr1,r2,LSL r3/*根据r1 (r2 r3)设置cpsr*/说明 如果不考虑结果的写回,cmp、cmn、tst和teq分别等价于subs、adds、ands和eors。ARM指令集与编程32目录1.总体介绍
21、:指令分类,特点,格式,条件码2.数据处理指令:数据传输指令,算术指令,逻辑指令,比较指令,乘法指令(略),前导零计数(略)3.程序状态访问指令4.跳转指令5.单数据访存指令6.多数据访存指令7.其它指令:信号量操作指令,异常中断产生指令,协处理器指令(略)8.伪指令(略)9.基于ARM的编程ARM指令集与编程333 程序状态访问指令 当需要修改cpsr/spsr的内容时,首先要读取它的值到一个通用寄存器,然后修改某些位,最后将数据写回到状态寄存器。cpsr/spsr不是通用寄存器,不能使用mov指令来读写。在ARM处理器中,只有mrs指令可以读取cpsr/spsr;只有msr可以写cpsr/
22、spsr。ARM指令集与编程343.1 读指令mrs 语法 mrs,cpsr|spsr 伪代码if ConditionPassed(cond)thenif R=1 thenRd=spsrelse Rd=cpsrARM指令集与编程353.1读指令mrs(续)举例 mrsr0,cpsr/*读取cpsr到r0*/mrsr3,spsr/*读取spsr到r3*/说明 user和system模式没有spsr,因此这些模式下不能读取spsr。ARM指令集与编程363.2 写指令msr的二进制格式0condR1 0f s x c1111操作数操作数011121516192021221 02324#250 02
23、627283118位立即数#rot078110 0 0 0 0 0 0 0Rm03411cpsr/spsr域屏蔽立即数对准操作数寄存器ARM指令集与编程373.2.1 写指令msr的语法 msr _,#msr _,表示合法的立即数:8bit循环右移偶数位 代表cpsr或spsr 指定传送的区域,可进一步细分(只能小写)c控制域字节(psr7:0)x扩展域字节(psr15:8)s状态域字节(psr23:16)f标志域字节(psr31:24)ARM指令集与编程383.2.2 写指令msr的伪代码 伪代码if ConditionPassed(cond)thenif opcode25=1operand
24、=8立即数 Rotate_Right(#rot*2)else/*opcode25=0*/operand=Rmif R=0 thenif field_mask0=1 and InAPrivilegeMode()then cpsr7:0=operand7:0if field_mask1=1 and InAPrivilegeMode()then cpsr15:8=operand15:8if field_mask2=1 and InAPrivilegeMode()then cpsr23:16=operand23:16if field_mask3=1 then cpsr31:24=operand31:2
25、4else/*R=1*/if field_mask0=1 and CurrentModeHasSPSR()then spsr7:0=operand7:0if field_mask1=1 and CurrentModeHasSPSR()then spsr15:8=operand15:8if field_mask2=1 and CurrentModeHasSPSR()then spsr23:16=operand23:16if field_mask3=1 and CurrentModeHasSPSR()then spsr31:24=operand31:24ARM指令集与编程393.2.3 msr举例
展开阅读全文