第8章 ARM汇编指令_第1页
第8章 ARM汇编指令_第2页
第8章 ARM汇编指令_第3页
第8章 ARM汇编指令_第4页
第8章 ARM汇编指令_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第八章 ARM汇编指令8.1 ARM指令格式(掌握)ARM指令的一般编码格式ARM指令的条件域指令的第二源操作数8.2 ARM寻址方式(掌握)立即寻址寄存器直接寻址寄存器移位寻址寄存器间接寻址基址变址寻址多寄存器直接寻址相对寻址堆栈寻址8.3 ARM指令集(掌握)数据处理指令转移指令程序状态寄存器访问指令加载/存储指令异常产生指令伪指令 ARMARM采用三地址指令格式:采用三地址指令格式:ARM汇编指令书写格式汇编指令书写格式 S , 其中号内的项是必须的,号内的项可选。opcode:操作码助记符:操作码助记符( ( 英语单词缩写英语单词缩写) );cond:执行条件;执行条件;S:是否影响:

2、是否影响CPSRCPSR寄存器的值;寄存器的值;Rd:目标寄存器;:目标寄存器;Rn:第:第1 1个操作数的寄存器;个操作数的寄存器;operand2:第:第2 2个操作数(个操作数(#immed_8r#immed_8r、RmRm、Rm,shiftRm,shift););指令语法目标寄存器(Rd) 源寄存器1(Rn ) 源寄存器2(Rm)ADD r3,r1,r2r3r1r2yyyy-M-d2/95ARM机器指令编码格式机器指令编码格式操作码条件助记符标志含义0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1无符号数大于或等于0011CC/LOC=0无符号数小于0100MIN

3、=1负数0101PLN=0正数或零0110VSV=1溢出0111VCV=0没有溢出1000HIC=1,Z=0无符号数大于1001LSC=0,Z=1无符号数小于或等于1010GEN=V有符号数大于或等于 1011LTN!=V有符号数小于 1100GTZ=0,N=V有符号数大于 1101LEZ=1,N!=V有符号数小于或等于 1110AL任何无条件执行 (指令默认条件) 1111NV任何从不执行(不要使用) 1. 1.所有的所有的ARMARM指令都可以条指令都可以条件执行,而件执行,而ThumbThumb指令只指令只有有B B(跳转)(跳转)指令具有条件指令具有条件执行执行 功能。功能。2.2.如

4、果指令不如果指令不标明条件代码,标明条件代码,将默认为无条将默认为无条件(件(ALAL)执行)执行ARM指令条件码指令条件码cond4/95ARM指令中的第指令中的第2操作数操作数0 x120 0 0 1 0 0 1 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x801 0 0 0 0 0 0 00 x040 0 0 0 0 1 0 08位常数循环右移位常数循环右移10位位常数常数#immed_8r#immed_8r由一个由一个8位常

5、数通过循环右移偶数位得到:位常数通过循环右移偶数位得到:Rm,shiftRm,shift由由RmRm移位得到。移位不消耗额外时间,且移位得到。移位不消耗额外时间,且RmRm值不变。值不变。ALU桶形移位器桶形移位器Rd结果结果N预预处处理理未未预预处处理理RmRnLSL0LSR0ASRRORRRXCyyyy-M-d数据处理指令第二操作数编码格式ARM处理器寻址方式处理器寻址方式 寻址方式是根据指令中给出的地址码寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。字段来实现寻找真实操作数地址的方式。 ARM ARM处理器具有几种基本寻址方式:处理器具有几种基本寻址方式:1. 1.

6、立即寻址立即寻址2.2.寄存器寻址寄存器寻址 3.3.寄存器间接寻址寄存器间接寻址移位寻址移位寻址、间接寻址间接寻址、基址变址寻址基址变址寻址、多寄存器寻址(块寻址)多寄存器寻址(块寻址) 4.4.堆栈寻址堆栈寻址 5.5.相对寻址相对寻址7/951. 操作数包含在指令当中;2. 指令地址码部分就是数据本身;3. 取指时就取出了可立即使用的操作数;MOVR0,#0 xFF00 ; R0 = #0 xFF00 SUBSR0,R0,#1 ; R0 =R0-10 x55R0MOV R0,#0 xFF00立即寻址立即寻址0 xFF00从代码中获得数据从代码中获得数据10进制数:进制数:#21,#0d5

7、72进制数:进制数: #0b0110016进制数:进制数:#0 x3a001影响标志位影响标志位寄存器寻址寄存器寻址yyyy-M-d8/95立即数规则 因为指令长度是32位的,32位的指令中,即有指令码还有立即数所以要表示比较宽的数据范围,只能取某些特殊的数了,例如通过移位来实现。如果不能用该方法得到立即数,则可以使用LDR伪指令实现(先把数据放到ROM中,然后再通过地址加载到寄存器中) 如果第二个源操作数不能由一个8位常数通过循环右移偶数位得到,则可以通过后面提到的伪指令实现。例如,不能使用使用MOV R0, #0 x32000001指令,需要转换为: LDR R0, = 0 x320000

8、01 (注意0 x前没有“#” ,有”=”) (伪指令LDR对于不能被MOV和MVN指令所读取的立即数, 可以将其转换为如下格式: LDR R0, 0 x00008040 即把数据“0 x32000001”放在内存地址0 x8040处,然后用存储器访问指令LDR得到该存储单元的值: 0 x32000001 )ARM指令中的第指令中的第2操作数特例操作数特例1. 操作数存放在寄存器中;2.指令地址码字段给出寄存器编号(名);3.指令执行时直接取出寄存器值来操作;MOV R1, R2; R1 = R2 SUB R0, R1, R2 ; R0 = R1-R2 0 xAA0 x55R2R1寄存器直接寻

9、址寄存器直接寻址0 xAAyyyy-M-d11/951. 操作数存放在寄存器中;2.指令地址码字段给出寄存器编号(名)及移位表达式;3.指令执行时取出寄存器值并移位,再将结果作为源操作数;MOV R0, R2, LSL #3 ; R0=R28 ANDS R1, R1, R2, LSL R3 ; R1 = R1 and (R2R3)0 x55R0R20 x01寄存器移位寻址寄存器移位寻址0 x080 x08逻辑左移逻辑左移3位位寄存器寻址寄存器寻址影响标志位影响标志位LSL、LSRASRROR、RRX寄存器间接寻址寄存器间接寻址1. 操作数存放在内存单元中;2.指令地址码字段给出 寄存器编号(名

10、);3.指令执行时根据寄存器值(指针)找到相应的存储单元;LDRR1,R2; R1= R2SWPR1,R1,R2; R1 R20 x55R0R20 x400000000 xAA0 x400000000 xAA内存单元内存单元yyyy-M-d13/951. 操作数存放在内存单元中;2.指令地址码字段给出 寄存器编号(名)和偏移量;3.指令执行时将基址寄存器的内容与偏移量(4K)相加/减,形成操作数的有效地址。4. 常用于查表、数组操作、功能部件寄存器访问等。LDRR2,R3,#0 x0C ;R2=R3+0 x0CSTR R1,R0,#-4! ;R1=R0-4, R0=R0-4LDRR0,R1 ,

11、#4 ;R0=R1,R1R14基址变址寻址基址变址寻址前索引前索引后索引后索引0 x55R2R30 x400000000 xAA0 x4000000C0 xAA内存单元内存单元14/951. 操作数存放在内存单元中;2.指令地址码字段给出 寄存器编号(名)列表;3.编号高的寄存器总是对应内存中的高地址单元;4. 可完成存储块和16个寄存器或其子集之间的数据传送。 LDMIAR1!,R2-R4,R6 ; R2= R1 , R3= R1+4; R4= R1+8 , R6= R1+C, R1=R1+10 STMDBR1,R2-R4,R6 ; R1-4= R6 , R1-8=R4; R1-C =R3,

12、 R1-10=R2多寄存器直接寻址多寄存器直接寻址0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C0 x010 x020 x030 x040 x40000010内存单元内存单元(Increase After)Decrease Before相相 对对 寻寻 址址1. 操作数为指令存放地址;2.指令地址码字段为地址偏移量;3.指令执行时同基址寻址,由PC提供基地址根据偏移量完成跳转; BL SUB;调用SUB子程序SUB BEQLOOP;条件跳转

13、到LOOP处.LOOP MOV R6,#1yyyy-M-d16/95堆栈寻址堆栈寻址1. 操作数存放在内存栈顶单元中;2.指令地址码字段固定使用栈顶指针SP(初始化为栈底);3.指令执行时同多寄存器/块寻址,可完成多个数据的入栈和出栈; ARM支持的四种堆栈类型支持的四种堆栈类型1. 满递增(FA):堆栈指针SP的值增加,SP指向最后放入数据的位置2. 空递增(EA) :堆栈指针SP的值增加,SP指向下一个将要放入数据的空位置3. 满递减(FD) :堆栈指针SP的值减小, SP指向最后放入数据的位置4. 空递减(ED) :堆栈指针SP的值减小, SP指向下一个将要放入数据的空位置yyyy-M-

14、d18/94注意:入栈和出栈的堆栈类型一定要相同注意:入栈和出栈的堆栈类型一定要相同。堆栈的递增与递减堆栈的递增与递减1. 递增堆栈:向高地址方向生长,即向上生长2. 递减堆栈:向低地址方向生长,即向下生长栈底栈底栈顶栈顶栈区栈区SP堆栈存储区栈顶栈顶栈底栈底栈区栈区SP地址减少地址增加0 x123456780 x12345678递增堆栈压栈递减堆栈压栈yyyy-M-d19/940 x10100 x1000注意:SP初始化时指向栈底栈顶栈顶SP栈顶栈顶SP栈底栈底栈底栈底堆栈的空与满堆栈的空与满1. 空堆栈:堆栈指针SP指向下一个待压入数据的空位置2. 满堆栈:堆栈指针SP指向最后压入的堆栈的

15、有效数据项0 x123456780 x12345678栈顶栈顶SP0 x12345678栈顶栈顶SP满堆栈压栈满堆栈压栈空堆栈压栈空堆栈压栈yyyy-M-d20/94数据处理指令数据处理指令 ARMARM的数据处理指令大致可分为以下几类:的数据处理指令大致可分为以下几类: 数据传送指令数据传送指令:MOVMOV、MVNMVN 算术运算指令算术运算指令: :ADDADD、SUBSUB、RSBRSB、ADCADC、SBCSBC、RSCRSC、MULMUL、MLAMLA、UMULLUMULL、UMLALUMLAL、SMULLSMULL、SMLALSMLAL 逻辑运算指令逻辑运算指令 :ANDAND、

16、ORRORR、EOREOR、BICBIC 比较指令比较指令:CMPCMP、CMNCMN、TSTTST、TEQTEQv 数据处理指令只能对数据处理指令只能对寄存器寄存器的内容进行操作,而不的内容进行操作,而不能对内存中的数据进行操作。能对内存中的数据进行操作。v 所有所有ARMARM数据处理指令均可选择使用数据处理指令均可选择使用S S后缀,以使指后缀,以使指令影响状态标志。令影响状态标志。 21/95数据处理指令的编码格式数据处理指令的编码格式指令条件码I=1I=1:立即数;:立即数; I=0I=0:寄存器移位:寄存器移位第二操作数RdRd目标寄存器目标寄存器RnRn第一操作数寄存器第一操作数

17、寄存器S=1S=1:根据结果设置:根据结果设置CPRSCPRS中的条件码中的条件码S=0S=0:不设置:不设置CPRSCPRS中的条件码中的条件码带进位加法带进位加法ADCADC01010101带进位减法指令带进位减法指令SBCSBC01100110带进位逆向减法指令带进位逆向减法指令RSCRSC01110111位测试指令位测试指令TSTTST10001000相等测试指令相等测试指令TEQTEQ10011001比较指令比较指令CMPCMP10101010负数比较指令负数比较指令CMNCMN10111011逻辑或操作指令逻辑或操作指令ORRORR11001100数据传送数据传送MOVMOV110

18、11101位清除指令位清除指令BICBIC11101110数据非传送数据非传送MVNMVN11111111加法运算指令加法运算指令ADDADD01000100逆向减法指令逆向减法指令RSBRSB00110011减法运算指令减法运算指令SUBSUB00100010逻辑异或操作指令逻辑异或操作指令EOREOR00010001逻辑与操作指令逻辑与操作指令ANDAND00000000说明说明指令助记符指令助记符操作码操作码22/95数据传送指令数据传送指令MOV R11,#0 xF000000B;R1= 0 xF000000B MOV R0,R1;R0=R1 MOVS R3,R1,LSL #2;R3=

19、R12,并影响标志位,并影响标志位 MOV PC,LR;PC=LR,子程序返回,子程序返回 MVN R1,#0 xFF;R1=0 xFFMVN R1,R2;将将R2按位取反,结果存到按位取反,结果存到R1指 令 格 式说 明操 作MOVcondS Rd,operand2数据传送Rdoperand2 MVNcondS Rd,operand2数据非传送Rd(operand2)v 当有后缀当有后缀S S时指令将根据结果更新标志时指令将根据结果更新标志NN和和Z Z,在计算,在计算operand2operand2( 8 8位立即数或寄存器位立即数或寄存器)时更新标志时更新标志C C,不影响标志,不影响

20、标志V V。 v MVN MVN指令具有取反功能,所以可以装载范围更广的立即数。指令具有取反功能,所以可以装载范围更广的立即数。23/95算术运算指令算术运算指令指 令 格 式说 明操 作ADDcondS Rd,Rn,operand2加法RdRn+operand2SUBcondS Rd,Rn,operand2减法RdRn-operand2RSBcondS Rd,Rn,operand2逆向减法Rdoperand2-RnADCcondS Rd,Rn,operand2带进位加法RdRn+operand2+CSBCcondS Rd,Rn,operand2带进位减法RdRn-operand2-CRSCc

21、ondS Rd,Rn,operand2带进位逆向减法Rdoperand2-Rn-C可影可影响响NN,Z Z,C C和和V V标标志位。志位。ADDSR1,R1,#1020;R1=R1+1020,并影响标志位,并影响标志位ADDR1,R1,R2,LSL #2;R1=R1+R210,则比较则比较R1与与R2,并设置相关标志位,并设置相关标志位CMNR0,#1 ;比较比较R0与与-1,判断,判断R0是否为是否为1的补码的补码-1,是则设置,是则设置Z标志标志TSTR1,#0 x0F;判断判断R1的低的低4位是否为位是否为0 TEQR0,R1;较较R0与与R1是否相等是否相等 (不影响不影响V位和位和

22、C位位) TST指令的下一条指令常与指令的下一条指令常与EQ、NE条件码配合使用:当所条件码配合使用:当所有测试位均为有测试位均为0时,时,EQ有效(有效(Z=1),否则),否则NE有效(有效(Z=0););计算计算R0+1 TEQ指令的下一条指令常与指令的下一条指令常与EQ、NE条件码配合使用:当两条件码配合使用:当两个数据相等时,个数据相等时,EQ有效(有效(Z=1),否则),否则NE有效(有效(Z=0););yyyy-M-d25/95逻辑运算指令逻辑运算指令指 令 格 式说 明操 作ANDcondS Rd, Rn, operand2逻辑与操作RdRn & operand2ORRcondS

23、 Rd, Rn, operand2逻辑或操作RdRn | operand2EORcondS Rd, Rn, operand2逻辑异或操作RdRn operand2BICcondS Rd, Rn, operand2位清除RdRn & (operand2)可标志可标志NN和和Z Z。计算。计算Operand2Operand2时更新标志时更新标志C C,不影响标志,不影响标志V V。ANDS R0,R0,#0 x01;取取R0的最低位数据,并影响标志位的最低位数据,并影响标志位 ORR R0,R0,#0 x0F;将将R0的低的低4位置位置1 ,其它位不变,其它位不变 EOR R1,R1,#0 x0F

24、;将将R1的低的低4位取反,其它位不变位取反,其它位不变 BIC R1,R1,#0 x0F;将将R1的低的低4位清零,其它位不变位清零,其它位不变 ANDEQ R2,R1,R3;若若Z1,则则R2=R1&R3BIC R1,R2,R3;将将R3的反码和的反码和R2相逻辑相逻辑“与与”MOV R1,R2,LSR #24 ; 将将R2的高的高8位移入到位移入到R3低低8位位ORR R3,R1,R3,LSL #826/95乘(加)法乘(加)法 指指 令令指 令 格 式说 明操 作MULcondS Rd,Rm,Rs32位乘法RdRm*RsMLAcondS Rd,Rm,Rs,Rn32位乘加RdRm*Rs+

25、RnUMULLcondS RdLo,RdHi,Rm,Rs64位无符号乘法(RdLo,RdHi) Rm*RsUMLALcondS RdLo,RdHi,Rm,Rs64位无符号乘加(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)SMULLcondS RdLo,RdHi,Rm,Rs64位有符号乘法(RdLo,RdHi) Rm*RsSMLALcondS RdLo,RdHi,Rm,Rs64位有符号乘加(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)MULR1,R2,R3 ;R1=R2R3,结果的低结果的低32位保存位保存MLASR1,R2,R3,R0;R1=R2R3+R0,影响标志位影

26、响标志位UMULL R0,R1,R5,R8;(R1、R0)=R5R8 UMLAL R0,R1,R5,R8;(R1、R0)=R5R8+(R1、R0)SMULL R2,R3,R7,R6;(R3、R2)=R7R6 SMLAL R2,R3,R7,R6;(R3、R2)=R7R6+(R3、R2) 注:注: R R不能为不能为R15R15且且 RdRmRdRm ; 可影响可影响NN、Z Z标志位;标志位; 32 32位指令不影响位指令不影响V V,C C不确定;不确定;6464位指令位指令V V 和和C C不确定;不确定;27/95分分 支支 指指 令令 在在ARMARM中有两种方式可以实现程序的跳转,一中

27、有两种方式可以实现程序的跳转,一种则是直接种则是直接向向PCPC寄存器赋值寄存器赋值实现跳转,另一种是使实现跳转,另一种是使用用分支指令分支指令直接跳转。直接跳转。 以下三种分支指令跳转范围限制在当前指令的以下三种分支指令跳转范围限制在当前指令的32M32M字节地址内,且字节地址内,且ARM指令为字对齐,因此指令为字对齐,因此最最低低2位地址固定为位地址固定为0。指指 令令 格格 式式说说 明明操操 作作B cond label分支指令分支指令PClabelBLcond label带链接的分支指令带链接的分支指令LRPC-4,PClabel适用于子程序调用适用于子程序调用BXcond Rm带状

28、态切换的分支指令带状态切换的分支指令PCRm根据跳转地址(根据跳转地址(Rm)的最低位)的最低位来切换处理器状态来切换处理器状态yyyy-M-d28/95BL LabelxxxxxxLabelxxxMOV PC,LRAddr1Addr2xxxxxxLRPC分支指令应用示例分支指令应用示例Addr1LabelAddr2Addr21. 1.当程序执行到当程序执行到BLBL跳转指跳转指令时,硬件将下一条指令时,硬件将下一条指令的地址令的地址Addr2Addr2装入装入LRLR寄存器,并把跳转地址寄存器,并把跳转地址装入程序计数器(装入程序计数器(PCPC)2. 2. 程序跳转到目标地址程序跳转到目标

29、地址LabelLabel继续执行,当子程继续执行,当子程序执行结束后,将序执行结束后,将LRLR寄寄存器内容存入存器内容存入PCPC,返回,返回调用函数继续执行调用函数继续执行B WAITA; ; 跳转到跳转到WAITAWAITA标号处标号处 B0 x1234; ; 跳转到绝对地址跳转到绝对地址0 x12340 x1234处处BL Label;调用子程序;调用子程序ADRL R0,ThumbFun+1 ; ;将将ThumbThumb程序的入口地址加程序的入口地址加1 1存入存入R0R0BX R0 ; ; 跳转到指定地址并切换到跳转到指定地址并切换到ThumbThumb状态状态 29/95yyy

30、y-M-d程序状态寄存器程序状态寄存器访问指令指指 令令 格格 式式说说 明明操操 作作MRScond Rd, psr读读PSRRdpsrMSRcond psr_fields,Rd/#immed_8r写写PSRpsr_fieldsRd/#immed_8ru 读读CPSRCPSR可了解当前工作状态可了解当前工作状态; ; 读读SPSRSPSR可以了解进入异常前的状态可以了解进入异常前的状态; ; uMSRMSR与与MRSMRS配合使用,可以切换处理器模式或允许配合使用,可以切换处理器模式或允许/ /禁止中断等。禁止中断等。(1)(2)(3)(4) 应用示例应用示例1 1:; ;子程序:使能子程序

31、:使能IRQIRQ中断中断ENABLE_IRQ MRS R0, CPSR BIC R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 应用示例应用示例2 2:; ;子程序:禁能子程序:禁能IRQIRQ中断中断DISABLE_IRQ MRS R0, CPSR ORR R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 1. 1.将将CPSRCPSR寄存器内容读出到寄存器内容读出到R0R0;2.2.修改对应于修改对应于CPSRCPSR中的中的I I控制位;控制位;3.3.将修改后的值写回将修改后的值写回 CPSRCPSR寄存器寄存器的对应控制域;的对

32、应控制域;4.4.返回上一层函数;返回上一层函数;yyyy-M-d30/95加载存储指令加载存储指令指 令 格 式说 明操 作LDR cond Rd,addressing 加载字数据Rdaddressing 注意addressing的寻址方式及索引方式LDRcondT Rd,addressing以用户模式加载字数据LDRcondBT Rd, addressing 以用户模式加载无符号字节LDRcondB Rd,addressing 加载无符号字节数据LDRcondH Rd, addressing 加载无符号半字数据LDRcondSB Rd, addressing 加载有符号字节数据LDRcon

33、dSH Rd, addressing加载有符号半字数据LDRcondD Rd, addressing加载双字数据STRcond Rd, addressing 存储字数据addressingRd注意addressing的寻址方式及索引方式STRcondT Rd,addressing 以用户模式存储字数据STRcondB Rd,addressing 存储字节数据STRcondBT Rd,addressing 以用户模式存储字节数据STRcondH Rd,addressing 存储半字数据STRcondD Rd,addressing 存储双字数据符号数加载时用符号扩展到符号数加载时用符号扩展到323

34、2位,否则用零扩展到位,否则用零扩展到3232位;位;半字读写的指定地址必须为偶数,否则将产生不可靠的结果;半字读写的指定地址必须为偶数,否则将产生不可靠的结果;单寄存器存取指令的寻址方式单寄存器存取指令的寻址方式基址寄存器(任一通用寄存器)基址寄存器(任一通用寄存器)+ +地址偏移量地址偏移量立即数立即数:LDR R1,R0,#0 x12 ;R1-R0+0 x12寄存器寄存器:LDR R1,R0,-R2 ; R1-R0-R2寄存器移位寄存器移位:LDR R1,R0,R2,LSL #2 ;R1R3-R8/4;将将R0+R3指向的字节存入指向的字节存入R1,高,高24位符号扩展位符号扩展;将将R

35、2指向的半字存入指向的半字存入R6,高,高16位位0扩展扩展;R2=R2+2;双字装载,;双字装载,R6R11,R7R11+4 ;双字存储,双字存储,R4R9+24,R5R9+2833/95数据块存取指令数据块存取指令指 令 格 式说 明操 作LDMcond mode Rn!,reglist 多寄存器加载reglistRn.STMcond mode Rn!,reglist 多寄存器存储Rn.reglistu reglistreglist表示寄存器列表(由小到大),如表示寄存器列表(由小到大),如R1,R2,R6-R9R1,R2,R6-R9;u ! ! 表示在操作结束后,将最后的地址写回表示在操

36、作结束后,将最后的地址写回RnRn中;中;u允许在用户模式或系统模式下使用。它有以下两个功能:允许在用户模式或系统模式下使用。它有以下两个功能:1 1)异常模式下)异常模式下LDMLDM指令中寄存器列表包含指令中寄存器列表包含R15R15时,除正常多寄存器传送外,时,除正常多寄存器传送外,还将还将SPSRSPSR也复制到也复制到CPSRCPSR中。常用于中。常用于异常处理返回异常处理返回。2 2)使用)使用用户模式下的寄存器用户模式下的寄存器,而不是当前模式的寄存器。,而不是当前模式的寄存器。地址增长模式数据块传送操作说明地址增长模式堆栈操作说明IA传送后地址加4FD满递减堆栈IB传送前地址加

37、4ED空递减堆栈DA传送后地址减4FA满递增堆栈DB传送前地址减4EA空递增堆栈34/95数据块存取指令应用示例数据块存取指令应用示例R1R1:指令指令执行执行前前的的基址寄存基址寄存器器R1R1:指令指令执行执行后后的的基址寄存基址寄存器器R1 R1 指令指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR1 R1 指令指令STMDA R1!,R5-R74008H4004H4000H4014H4010H400CHR1 R1 指令指令STMIB R1!,R5-R74008H4004H4000H4014H4010H400CHR1 R1 指令指令STMD

38、B R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R5R6R7R5R6R7R5R6R735/95堆栈寻址堆栈寻址-多寄存器寻址多寄存器寻址堆栈图例堆栈图例 满递减满递减 空递减空递减 满递增满递增 空递空递增增数据块传送数据块传送存储存储堆栈操作堆栈操作压栈压栈说明说明数据块传送数据块传送加载加载堆栈操作堆栈操作出栈出栈说明说明STMDASTMED空递减空递减LDMIBLDMED空递减空递减STMIASTMEA空递增空递增LDMDBLDMEA空递增空递增STMDBSTMFD满递减满递减LDMIALDMFD满递减满递减STMIBSTMFA满递增满递增L

39、DMDALDMFA满递增满递增;使用数据块传送指令进行堆栈操作使用数据块传送指令进行堆栈操作STMDAR0!,R5-R6. . .LDMIBR0!,R5-R6;使用堆栈指令进行堆栈操作使用堆栈指令进行堆栈操作STMEDR13!,R5-R6. . .LDMEDR13!,R5-R6 两段代码的执行结果是一样的,但是使用堆栈指令的压栈和两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。进行压栈和出栈操作则需要考虑空与满、加与减对应的问

40、题。堆栈操作和数据块传送指令之间的关系如下表所示:堆栈操作和数据块传送指令之间的关系如下表所示:注意:入栈和出栈的堆栈类型一定要相同注意:入栈和出栈的堆栈类型一定要相同。多寄存器寻址与堆栈寻址的比较多寄存器寻址与堆栈寻址的比较堆栈寻址是多寄存器寻址的一种特殊方式。堆栈寻址是多寄存器寻址的一种特殊方式。 寻址方式指令基址寄存器指令选项多寄存器寻址多寄存器寻址 LDM(读内存)STM(写内存)通用寄存器IA,IB,DA,DB堆栈寻址堆栈寻址LDM(出栈)STM(入栈)固定为SPFD,ED FA,EA(出栈(出栈)(入栈(入栈)(装载(装载)(保存(保存)寄存器和存储器交换指令寄存器和存储器交换指令

41、指指 令令 格格 式式说说 明明操操 作作SWPcond Rd, Rm, Rn 字数据交换字数据交换RdRn,RnRm (RnRd或或Rm)SWP cond B Rd, Rm, Rn 字节数据交换字节数据交换u 若若RmRm与与RdRd相同,则为寄存器与存储器内容相同,则为寄存器与存储器内容进行互换;进行互换;u RnRn为要进行数据交换的存储器地址,为要进行数据交换的存储器地址,RnRn不不能与能与RdRd和和RmRm相同。相同。 yyyy-M-d40/95软中断指令软中断指令 主要用于用户程序主要用于用户程序调用操作系统的系统服务调用操作系统的系统服务: :切换到管切换到管理模式理模式,

42、,并将并将CPSRCPSR保存到管理模式的保存到管理模式的SPSRSPSR中,然后程序跳中,然后程序跳转到转到SWISWI异常入口。不影响条件码标志。异常入口。不影响条件码标志。 根据根据SWISWI指令传递的参数指令传递的参数SWISWI异常处理程序可以作出相应异常处理程序可以作出相应的处理。的处理。SWISWI指令指令传递参数传递参数有以下两种方法有以下两种方法: 1. 1. 指令中的指令中的2424位立即数指定服务类型,参数通过通用寄存器传递。位立即数指定服务类型,参数通过通用寄存器传递。 MOV R0,#34; ;设置子功能号为设置子功能号为34 34 SWI 12; ;调用调用121

43、2号软中断号软中断 2.2.指令中的指令中的2424位立即数被忽略,服务类型由位立即数被忽略,服务类型由R0R0的值决定,参数通过其它的的值决定,参数通过其它的通用寄存器传递。通用寄存器传递。 MOV R0,#12; ;调用调用1212号软中断号软中断 MOV R1,#34; ;设置子功能号为设置子功能号为34 34 SWI 0 yyyy-M-d41/95在在SWISWI异常中断处理程序中,取出异常中断处理程序中,取出SWISWI指令中立即数的步骤为:指令中立即数的步骤为:首先确定引起软中断的首先确定引起软中断的SWISWI指令是指令是ARMARM指令还是指令还是ThumbThumb指令,这可

44、通过对指令,这可通过对SPSRSPSR访问得到;访问得到;然后取得该然后取得该SWISWI指令的地址,这可通过访问指令的地址,这可通过访问LRLR寄存器得到;寄存器得到;接着读出该接着读出该SWISWI指令,分解出立即数。指令,分解出立即数。 SWI_Handler STMFD SP!, R0-R3, R12, LR; 现场保护现场保护 MRS R0, SPSR ; 读取读取SPSR STMFD SP!, R0 ; 保存保存SPSR TST R0, #0 x20 ; 测试测试T标志位标志位 LDRNEH R0, LR,#-2 ; 若是若是Thumb指令,读取指令码指令,读取指令码(16位位) BICNE R0, R0, #0 xFF00; 取得取得Thumb指令的指令的8位立即数(低位立即数(低8位)位) LDREQ R0, LR,#-4 ; 若是若是ARM指令,读取指令码指令,读取指令码(32位位) BICEQ R0, R0, #0 xFF000000 ; 取得取得ARM指令的指令的24位立即数(低位立即数(低23位)位) . LDMFD SP!, R0-R3, R12, PC; SWI异常中断返回异常中断返回 yyyy-M-d42/95伪指令伪指令 在ARM汇编指令中,有一类特殊的指令没有对应的指令编码

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论