《ARM9教学课件_指令系统》由会员分享,可在线阅读,更多相关《ARM9教学课件_指令系统(139页珍藏版)》请在金锄头文库上搜索。
1、ARM指令系统指令系统ARM指令系统指令系统uARM处理器的理器的寻址方式址方式uARM指令集指令集 uThumb指令集指令集 ARM处理器的寻址方式处理器的寻址方式u寻址方式址方式是是处理器根据指令中理器根据指令中给出的地址信息来出的地址信息来寻找物理地址的方式。找物理地址的方式。u目前目前ARM指令系指令系统支持支持8种种寻址方式。址方式。l寄存器寄存器寻址址l立即立即寻址址l寄存器寄存器间接接寻址址l变址址寻址址l寄存器移位寄存器移位寻址址 l多寄存器多寄存器寻址址l堆堆栈寻址址l相相对寻址址寄存器寻址寄存器寻址 寄存器寄存器寻址址就是利用寄存器中的内容作就是利用寄存器中的内容作为操作数
2、,操作数,寄存器本身就是操作数地址。寄存器本身就是操作数地址。这种种寻址方式是各址方式是各类微微处理器理器经常采用的一种方式,也是一种常采用的一种方式,也是一种执行效率行效率较高高的的寻址方式。址方式。 例如指令:例如指令: MOV R2, R3 ;R2R3 R3中的内容中的内容赋给R2ADD R2,R3,R4 ;R2R3R4 R3和和R4中的内容相加,中的内容相加,结果果赋给R20xAA0x55R3R2MOV R2,R30xAA立即寻址立即寻址u立即立即寻址址也叫立即数也叫立即数寻址,址,这是一种特殊的是一种特殊的寻址方式,址方式,操作数没有存操作数没有存储在寄存器或存在寄存器或存储器中,而
3、是包含在指器中,而是包含在指令的操作令的操作码中,只要取出指令也就取到了操作数。中,只要取出指令也就取到了操作数。这个操作数被称个操作数被称为立即数,立即数,对应的的寻址方式也就叫做立址方式也就叫做立即即寻址。址。例如指令:例如指令: MOV R0,#0xFF000 ;将立即数将立即数0xFF000装入装入R0寄存器寄存器 ADD R1,R1,0x7f ; R1R10x7f 在以上两条指令中,第二个源操作数即在以上两条指令中,第二个源操作数即为立即数,要立即数,要求以求以“”为前前缀,对于以十六于以十六进制表示的立即数,制表示的立即数,还要要求在求在“”后加上后加上“0x”。 0x55R0MO
4、V R0,#0xFF00程序存储程序存储MOV R0,#0xFF000xFF00从代码中获得数据从代码中获得数据寄存器间接寻址寄存器间接寻址u寄存器寄存器间接接寻址址就是以寄存器中的内容作就是以寄存器中的内容作为操作数的操作数的地址,而操作数本身存放在存地址,而操作数本身存放在存储器中。例如指令器中。例如指令 : LDRR1,R2;R1R2 STRR1,R2;R2R1 第一条指令将以第一条指令将以R2中的内容中的内容为地址,将地址,将该地址中地址中的数据的数据传送到送到R1中。中。 第二条指令将第二条指令将R1中的内容中的内容传送到以送到以R2中的内容中的内容为地址的存地址的存储器中。器中。0
5、x55R1R2 0x400000000xAA0x40000000LDR R1,R20xAA变址寻址变址寻址u变址址寻址址就是将寄存器(就是将寄存器(该寄存器一般称作基址寄存寄存器一般称作基址寄存器)的内容与指令中器)的内容与指令中给出的地址偏移量相加,从而得出的地址偏移量相加,从而得到一个操作数的有效地址。到一个操作数的有效地址。变址址寻址方式常用于址方式常用于访问某基地址附近的地址某基地址附近的地址单元。元。例如指令:例如指令: LDR R0,R1,8 ;R0R18LDR R0,R1,8! ;R0R18,R1R18LDR R0,R1,2 ;R0R1,R1R12LDR R0,R1,R2 ;R0
6、R1R20x55R0R1 0x600000000xAA0x60000008LDR R0,R1,#0x080xAA将将R1+0x08作作为地址装载数为地址装载数据据寄存器移位寻址寄存器移位寻址u寄存器移位寄存器移位寻址址是是ARM指令集独有的指令集独有的寻址方式,操作址方式,操作数由寄存器的数数由寄存器的数值进行相行相应移位而得到;移位的方式在移位而得到;移位的方式在指令中以助指令中以助记符的形式符的形式给出,而移位的位数可用立即数出,而移位的位数可用立即数或寄存器或寄存器寻址方式表示。址方式表示。uARM微微处理器内嵌的理器内嵌的桶型移位器桶型移位器(Barrel Shifter),),移位操
7、作在移位操作在ARM指令集中不作指令集中不作为单独的指令使用,它独的指令使用,它只能作只能作为指令格式中的一个字段,在指令格式中的一个字段,在汇编语言中表示言中表示为指令中的指令中的选项。例如,数据例如,数据处理指令的第理指令的第2个操作数个操作数为寄存器寄存器时,就可以加入移位操作就可以加入移位操作选项对它它进行各种移位操作。移位行各种移位操作。移位操作包括如下操作包括如下6种种类型型.寄存器移位寻址寄存器移位寻址uLSL(或(或ASL)操作操作 格式格式为: 通用寄存器,通用寄存器,LSL(或(或ASL) 操作数操作数 LSL(或(或ASL)可完成)可完成对通用寄存器中的内容通用寄存器中的
8、内容进行行逻辑(或算(或算术)的左移)的左移操作,按操作数所指定的数操作,按操作数所指定的数量向左移位,低位用零来填充,最后一个左移出的位量向左移位,低位用零来填充,最后一个左移出的位放在状放在状态寄存器的寄存器的C位位CPSR29中,如中,如图3-1所示。所示。其中,操作数可以是通用寄存器,也可以是立即其中,操作数可以是通用寄存器,也可以是立即数(数(031)。)。寄存器移位寻址寄存器移位寻址u操作示例:操作示例:MOV R0, R1, LSL#2;将;将R1中的内容左移中的内容左移4位后位后传送到送到R0中,中,;其中把最后移出的位;其中把最后移出的位赋给程序状程序状态寄存器的寄存器的C位
9、位CPSR29。31C30291000uLSR操作操作格式格式为: 通用寄存器,通用寄存器,LSR 操作数操作数 LSR可完成可完成对通用寄存器中的内容通用寄存器中的内容进行行右移右移的操作,的操作,按操作数所指定的数量向右移位,左端用零来填充,按操作数所指定的数量向右移位,左端用零来填充,最后一个右移出的位放在状最后一个右移出的位放在状态寄存器的寄存器的C位位CPSR29中,如中,如图3-2所示。其中,操作数可以是通用寄存器,所示。其中,操作数可以是通用寄存器,也可以是立即数(也可以是立即数(031)。)。 寄存器移位寻址寄存器移位寻址u操作示例:操作示例:MOV R0, R1, LSR#4
10、;将;将R1中的内容右移中的内容右移4位后位后传送到送到R0中。中。;其中把最后移出的位;其中把最后移出的位赋给程序状程序状态寄存器的寄存器的C位位CPSR29。 寄存器移位寻址寄存器移位寻址31C30291000寄存器移位寻址寄存器移位寻址uROR操作操作格式格式为: 通用寄存器,通用寄存器,ROR 操作数操作数 ROR可完成可完成对通用寄存器中的内容通用寄存器中的内容进行行循循环右移右移的操作,按操作数所指定的数量向右循的操作,按操作数所指定的数量向右循环移位,右端移位,右端移出的位填充在左移出的位填充在左侧的空位的空位处,最后一个右移出的位,最后一个右移出的位同同时也放在状也放在状态寄存
11、器的寄存器的C位位CPSR29中,如中,如图3-3所所示。其中,操作数可以是通用寄存器,也可以是立即示。其中,操作数可以是通用寄存器,也可以是立即数(数(031)。)。u操作示例:操作示例:MOV R0, R1, ROR#4;将;将R1中的内容循中的内容循环右移右移4位后位后传送到送到R0中,中,;其中把最后移出的位;其中把最后移出的位赋给程序状程序状态寄存器的寄存器的C位位CPSR29。3131C C303029291 10 0寄存器移位寻址寄存器移位寻址uASRASR操作操作格式格式为: 通用寄存器,通用寄存器,ASR 操作数操作数 ASR可完成可完成对通用寄存器中的内容通用寄存器中的内容
12、进行行右移右移的操作,的操作,按操作数所指定的数量向右移位,最左端的位保持不按操作数所指定的数量向右移位,最左端的位保持不变,最后一个右移出的位放在状,最后一个右移出的位放在状态寄存器的寄存器的C位位CPSR29 ,如,如图3-4所示。其中,操作数可以是通用所示。其中,操作数可以是通用寄存器,也可以是立即数(寄存器,也可以是立即数(031)。)。 这种移位种移位对有符号数据使用有符号数据使用时可以保持符号位不可以保持符号位不变。寄存器移位寻址寄存器移位寻址寄存器移位寻址寄存器移位寻址u操作示例:操作示例:MOV R0, R1, ASR#4;将;将R1中的内容右移中的内容右移4位后位后传送到送到
13、R0中,符号位保持不中,符号位保持不变。;最后移出的位同;最后移出的位同时也送入状也送入状态位位C中。中。3131C C303029291 10 0uRRX操作操作RRX操作的格式操作的格式为: 通用寄存器,通用寄存器,RRX 操作数操作数 RRX可完成可完成对通用寄存器中的内容通用寄存器中的内容进行行带扩展的展的循循环右移右移的操作,按操作数所指定的数量向右循的操作,按操作数所指定的数量向右循环移移位,左位,左侧空位由状空位由状态寄存器寄存器C位来填充,右位来填充,右侧移出的移出的位移位移进状状态位位C中,如中,如图3-5所示。其中,操作数可以所示。其中,操作数可以是通用寄存器,也可以是立即
14、数(是通用寄存器,也可以是立即数(031)。)。寄存器移位寻址寄存器移位寻址u操作示例:操作示例:MOV R0, R1, RRX#2;将;将R1中的内容中的内容进行行带扩展的循展的循环右移两位后右移两位后传送送到到R0中。中。3131C C303029291 10 0寄存器移位寻址寄存器移位寻址u采用采用多寄存器多寄存器寻址方式址方式,一条指令可以完成多个寄存,一条指令可以完成多个寄存器器值的的传送。送。这种种寻址方式可以一次址方式可以一次对多个寄存器多个寄存器寻址,多个寄存器由小到大排列,最多可址,多个寄存器由小到大排列,最多可传送送16个寄存个寄存器。器。 例如例如: LDMIA R1!,
15、R2-R4,R5 ;R2R1 ;R3R14 ;R4R18 ;R5R112 该指令的后指令的后缀IA表示在每次表示在每次执行完加行完加载/存存储操作操作后,后,R1按字按字长度增加,因此,指令可将度增加,因此,指令可将连续存存储单元元的的值传送到送到R2R5。多寄存器寻址多寄存器寻址 使用多寄存器寻址指令时,使用多寄存器寻址指令时,寄存器子集的顺序是按由小到寄存器子集的顺序是按由小到大的顺序排列,连续的寄存器大的顺序排列,连续的寄存器可用可用“”连接;否则用连接;否则用“,”分隔书写。分隔书写。0x40000000R1R20x?0x010x400000000x?R3R40x?R50x?0x020
16、x030x040x400000040x400000080x4000000C存储器存储器LDMIA R1!,R2-R4,R5 0x400000100x010x020x030x04堆栈寻址堆栈寻址u堆堆栈是一种数据是一种数据结构,按先构,按先进后出(后出(First In Last Out,FILO)的方式工作,使用一个称作堆)的方式工作,使用一个称作堆栈指指针的的专用寄存器指示当前的操作位置,堆用寄存器指示当前的操作位置,堆栈指指针总是指向是指向栈顶。u当堆当堆栈指指针指向最后指向最后压入堆入堆栈的数据的数据时,称,称为满堆堆栈(Full Stack);而当堆而当堆栈指指针指向下一个将要放入数指
17、向下一个将要放入数据的空位置据的空位置时,称,称为空堆空堆栈(Empty Stack)。)。u同同时,根据堆,根据堆栈的生成方式,又可以分的生成方式,又可以分为递增堆增堆栈(Ascending Stack)和)和递减堆减堆栈(Decending Stack),当堆),当堆栈由低地址向高地址生成由低地址向高地址生成时,称,称为递增堆增堆栈,当堆,当堆栈由高地址向低地址生成由高地址向低地址生成时,称,称为递减减堆堆栈。栈顶栈顶SP栈顶栈顶SP栈底栈底空堆栈空堆栈栈底栈底满堆栈满堆栈0x123456780x12345678栈顶栈顶SP0x12345678栈顶栈顶SP压栈压栈压栈压栈堆栈寻址堆栈寻址u
18、ARM微微处理器支持理器支持这四种四种类型的堆型的堆栈工作方式工作方式,即:,即:u满递增方式增方式FA(Full Ascending):堆):堆栈指指针指向最指向最后入后入栈的数据位置,且由低地址向高地址生成。的数据位置,且由低地址向高地址生成。u满递减方式减方式FD(Full Decending):堆):堆栈指指针指向最指向最后入后入栈的数据位置,且由高地址向低地址生成。的数据位置,且由高地址向低地址生成。u空空递增方式增方式EA(Empty Ascending):堆):堆栈指指针指向指向下一个入下一个入栈数据的空位置,且由低地址向高地址生成。数据的空位置,且由低地址向高地址生成。u空空递
19、减方式减方式ED(Empty Decending):堆):堆栈指指针指向指向下一个入下一个入栈数据的空位置,且由高地址向低地址生成。数据的空位置,且由高地址向低地址生成。相对寻址相对寻址 u与基址与基址变址址寻址方式相址方式相类似,似,相相对寻址址以程序以程序计数器数器PC的当前的当前值为基地址,指令中的地址基地址,指令中的地址标号作号作为偏移量偏移量,将两者相加之后得到操作数的有效地址。以下程序,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的段完成子程序的调用和返回,跳用和返回,跳转指令指令BL采用了相采用了相对寻址方式:址方式: BL NEXT;跳;跳转到子程序到子程序NEXT
20、处执行行 NEXT MOVPC,LR;从子程序返回;从子程序返回ARM指令集指令集uARM微微处理器的指令集是加理器的指令集是加载/存存储型的型的.u即指令集即指令集仅能能处理寄存器中的数据,理寄存器中的数据,处理理结果仍要放果仍要放回寄存器中,而回寄存器中,而对系系统存存储器的器的访问则需要通需要通过专门的加的加载/存存储指令来完成指令来完成。uARM9指令集,包括指令集,包括ARM指令集指令集Thumb指令集。指令集。u首先介首先介绍ARM指令的基本格式及灵活的操作数,然后指令的基本格式及灵活的操作数,然后介介绍条件条件码,再把,再把ARM指令集、指令集、Thumb指令集按指令集按类分分别
21、说明。明。ARM指令的基本格式如下:指令的基本格式如下: S , 其其中中号号内内的的项项是是必必须须的的,号号内内的的项项是是可可选的。各项的说明如下:选的。各项的说明如下:opcode:指令助记符;:指令助记符;cond:执行条件;:执行条件;S:是否影响:是否影响CPSR寄存器的值;寄存器的值;Rd:目标寄存器;:目标寄存器;Rn:第:第1个操作数的寄存器;个操作数的寄存器;op2:第:第2个操作数;个操作数;指令格式指令格式 ARM指令的基本格式如下:指令的基本格式如下:指令集介绍指令集介绍uARM指令集指令集第第2个操作数个操作数 灵灵活活的的使使用用第第2个个操操作作数数“op2”
22、能能够够提提高高代码效率。它有如下的形式:代码效率。它有如下的形式:#immed_8r常数表达式;常数表达式;Rm寄存器方式;寄存器方式;Rm,shift寄存器移位方式;寄存器移位方式; S , 指令集介绍指令集介绍uARM指令集指令集第第2个操作数个操作数#immed_8r#immed_8r常数表达式常数表达式 该该常常数数必必须须对对应应8 8位位位位图图,即即必必须须是是一一个个8 8位位的常数通过循环右移偶数位可以得到的数的常数通过循环右移偶数位可以得到的数。循环右移10位0x120 0 0 1 0 0 1 00x000 0 0 0 0 0 0 00x000 0 0 0 0 0 0 0
23、0x000 0 0 0 0 0 0 00x000 0 0 0 0 0 0 00x000 0 0 0 0 0 0 00x801 0 0 0 0 0 0 00x040 0 0 0 0 1 0 0移位前的8位常数0x12移位后得到的常数0x04800000指令集介绍指令集介绍uARM指令集指令集第第2个操作数个操作数#immed_8r常数表达式 该常数必须对应8位位图,即必须是一个8位的常数通过循环右移偶数位可以得到的数。例如:例如:MOV R0,#1AND R1,R2,#0x0FMOV R1,#0xC000 ;0xC000可由可由0x03循环右移循环右移16位得到位得到可以由0x4A循环右移10位
24、得到2.请列举2个8位图立即数? 思考与练习?1.以下以下8位图立即数是否合法?位图立即数是否合法?0x0103C0000x128000000x4000003B(0xED循环右移2位)0x0016C000(0x5B循环右移18位)指令集介绍指令集介绍uARM指令集指令集第第2个操作数个操作数RmRm寄存器方式寄存器方式 在寄存器方式下,操作数即为寄存器的数值。在寄存器方式下,操作数即为寄存器的数值。例如:例如:SUBR1,R1,R2MOVPC,R0条件码条件码u当当处理器工作在理器工作在ARM状状态时,几乎所有的指令均根,几乎所有的指令均根据据CPSR中条件中条件码的状的状态和指令的条件域有条
25、件的和指令的条件域有条件的执行。当指令的行。当指令的执行条件行条件满足足时,指令被,指令被执行,否行,否则指指令被忽略。令被忽略。u每一条每一条ARM指令包含指令包含4位的条件位的条件码,位于指令的最高,位于指令的最高4位位31:28。条件。条件码共有共有16种,每种条件种,每种条件码可用两个可用两个字符表示,字符表示,这两个字符可以添加在指令助两个字符可以添加在指令助记符的后面符的后面和指令同和指令同时使用。例如,跳使用。例如,跳转指令指令B可以加上后可以加上后缀EQ变为BEQ表示表示“相等相等则跳跳转”,即当,即当CPSR中的中的Z标志置位志置位时发生跳生跳转。u在在16种条件种条件标志志
26、码中,只有中,只有15种可以使用。种可以使用。条件码条件码条件码条件码助记符后缀助记符后缀标标 志志含含 义义0000EQZ置位置位相等相等0001NEZ清零清零不相等不相等0010CSC置位置位无符号数大于或等于无符号数大于或等于0011CCC清零清零无符号数小于无符号数小于0100MIN置位置位负数负数0101PLN清零清零正数或零正数或零0110VSV置位置位溢出溢出0111VCV清零清零未溢出未溢出1000HIC置位置位Z清零清零无符号数大于无符号数大于1001LSC清零清零Z置位置位无符号数小于或等于无符号数小于或等于1010GEN等于等于V带符号数大于或等于带符号数大于或等于101
27、1LTN不等于不等于V带符号数小于带符号数小于1100GTZ清零且(清零且(N等于等于V)带符号数大于带符号数大于1101LEZ置位或(置位或(N不等于不等于V)带符号数小于或等于带符号数小于或等于1110AL忽略忽略无条件执行无条件执行C代码:代码:if(a b) a+;else b+;对应的汇编代码:对应的汇编代码:CMP R0,R1;R0与与R1比较比较ADDHI R0,R0,#1;若若R0R1,则,则R0=R0+1ADDLS R1,R1,#1;若若R0R1,则,则R1=R1+1示例:示例:条件码条件码ARM 存储器访问指令存储器访问指令uARM微微处理器内部没有理器内部没有RAM,而,
28、而ARM除了寄存器除了寄存器(即(即R0R15)外没有)外没有别的存的存储单元;在以元;在以ARM为核核的嵌入式系的嵌入式系统中,所有的外中,所有的外围模模块都和存都和存储单元一元一样,是是ARM微微处理器的不同的地址理器的不同的地址单元。不管元。不管这些模些模块的功能如何(如的功能如何(如输入入/输出、定出、定时器、存器、存储器等),也器等),也不管不管这些模些模块的位置如何(如片内或片外),的位置如何(如片内或片外),ARM微微处理器都把它理器都把它们看作是外部存看作是外部存储器。其操作器。其操作过程和程和对存存储器的操作是相同的。器的操作是相同的。ARM 存储器访问指令存储器访问指令u因
29、此,在因此,在ARM微微处理器的数据理器的数据传送中,送中,数据的源和数据数据的源和数据的目的目标只有两种:一种是只有两种:一种是ARM的寄存器的寄存器R0R15;另一种;另一种就是外部存就是外部存储器器(它(它们可能是外可能是外围模模块的寄存器、外部数的寄存器、外部数据存据存储器或可器或可访问的程序存的程序存储器等)。器等)。u我我们把数据从存把数据从存储器到寄存器的器到寄存器的传送送叫加叫加载,数据从寄存数据从寄存器到存器到存储器的器的传送送叫存叫存储。存储器存储器寄存器(寄存器(R0-R0-R15R15)ARMARM微处理器微处理器外围模块或芯片外围模块或芯片存储存储加载加载加载指令:L
30、DR 目目标标寄存器寄存器, ,源地址源地址存储指令:STR 源寄存器源寄存器, ,目目标标地址地址存储器源地址源地址目标寄存器目标寄存器存储器目标地址目标地址源寄存器源寄存器ARM 存储器访问指令存储器访问指令ARM 存储器访问指令存储器访问指令u加加载/存存储指令可分指令可分为3类:u单一数据加一数据加载/存存储指令指令u批量数据加批量数据加载/存存储指令指令u数据交数据交换指令指令ARM 存储器访问指令存储器访问指令1单一数据加一数据加载/存存储指令指令(1)LDR指令指令格式格式为:LDR条件条件 目的寄存器,目的寄存器, LDR指令是指令是字加字加载指令指令,用于从存,用于从存储器中
31、将器中将一个一个32位的字数据位的字数据传送到目的寄存器中。送到目的寄存器中。ARM 存储器访问指令存储器访问指令u指令示例:指令示例:LDR R3,R4 ;将存;将存储器地址器地址为R4的字数据的字数据读入寄存器入寄存器R3。LDR R3,R1,R2 ;将存;将存储器地址器地址为R1+R2的字数据的字数据读入寄存器入寄存器R3。LDR R3,R1,8 ;将存;将存储器地址器地址为R1+8的字数据的字数据读入寄存器入寄存器R3。LDR R3,R1,R2!;将存;将存储器地址器地址为R1+R2的字数据的字数据读入寄存器入寄存器R3,并将新地址,并将新地址R1R2写入写入R1。LDR R3,R1,
32、8 !;将存;将存储器地址器地址为R1+8的字数据的字数据读入寄存器入寄存器R3,并将新地址,并将新地址R18写入写入R1。零偏移:零偏移:如:如:LDR Rd,Rn前索引偏移前索引偏移:如:如:LDR Rd,Rn,#0x04!程序相程序相对偏移偏移:如:如:LDR Rd,labe1 后索引偏移后索引偏移:如:如:LDR Rd,Rn,#0x040x55R3R4 0x400000000x123456780x40000000存储器存储器地址地址应用示例:应用示例:LDR R3,R4;将将R4指向地址的字数据存入指向地址的字数据存入R30x12345678ARM 存储器访问指令存储器访问指令ARM
33、存储器访问指令存储器访问指令LDR R3,R1,R2;将存;将存储器地址器地址为R1的字数据的字数据读入寄存器入寄存器R3,并将新,并将新地址地址R1R2写入写入R1。LDR R3,R1,R2,LSL3!;将存;将存储器地址器地址为R1R28的字数据的字数据读入寄存器入寄存器R3,并将新地址并将新地址R1R28写入写入R1。LDR R3,R1,R2,LSL3;将存;将存储器地址器地址为R1的字数据的字数据读入寄存器入寄存器R3,并将新,并将新地址地址R1R28写入写入R1。注:注:R15不可以作不可以作为偏移寄存器使用。偏移寄存器使用。ARM 存储器访问指令存储器访问指令(2)LDRB指令指令
34、 格式格式为: LDR条件条件B 目的寄存器,目的寄存器, LDRB指令是指令是字字节加加载指令指令,用于从存,用于从存储器中将器中将一个一个8位的字位的字节数据数据传送到目的寄存器中,同送到目的寄存器中,同时将寄将寄存器的高存器的高24位清零。位清零。该指令通常用于从存指令通常用于从存储器中器中读取取8位的字位的字节数据到数据到通用寄存器,然后通用寄存器,然后对数据数据进行行处理。理。ARM 存储器访问指令存储器访问指令指令示例:指令示例:LDRB R3,R1 ;将存;将存储器地址器地址为R1的字的字节数据数据读入寄存器入寄存器R0,并,并将将R3的高的高24位清零。位清零。LDRB R3,
35、R1,8 ;将存;将存储器地址器地址为R18的字的字节数据数据读入寄存器入寄存器R3,并将并将R3的高的高24位清零。位清零。ARM 存储器访问指令存储器访问指令(3)LDRH指令指令格式格式为:LDR条件条件H 目的寄存器,目的寄存器,LDRH指令是指令是无符号半字加无符号半字加载指令指令,用于从存,用于从存储器中将一个器中将一个16位的半字数据位的半字数据传送到目的寄存器中,同送到目的寄存器中,同时将寄存器的高将寄存器的高16位清零。位清零。该指令通常用于从存指令通常用于从存储器器中中读取取16位的半字数据到通用寄存器,然后位的半字数据到通用寄存器,然后对数据数据进行行处理。理。ARM 存
36、储器访问指令存储器访问指令指令示例:指令示例:LDRH R3,R1;将存;将存储器地址器地址为R1的半字数据的半字数据读入寄存器入寄存器R3,并将,并将R3的高的高16位清零。位清零。LDRH R3,R1,8 ;将存;将存储器地址器地址为R18的半字数据的半字数据读入寄存器入寄存器R3,并,并将将R3的高的高16位清零。位清零。LDRH R3,R1,R2 ;将存;将存储器地址器地址为R1R2的半字数据的半字数据读入寄存器入寄存器R3,并将并将R3的高的高16位清零。位清零。ARM 存储器访问指令存储器访问指令(4)STR指令指令格式格式为:STR条件条件 源寄存器,源寄存器, STR指令是指令
37、是字存字存储指令指令,用于从源寄存器中将,用于从源寄存器中将一个一个32位的字数据位的字数据传送到存送到存储器中。器中。该指令在程指令在程序序设计中比中比较常用,且常用,且寻址方式灵活多址方式灵活多样,使用,使用方式可参考指令方式可参考指令LDR。ARM 存储器访问指令存储器访问指令指令示例:指令示例:STRR3,R1,8;将;将R3中的字数据写入以中的字数据写入以R1为地址的存地址的存储器中,器中,并将新地址并将新地址R18写入写入R1。STRR3,R1,8;将;将R3中的字数据写入以中的字数据写入以R18为地址的存地址的存储器器中。中。ARM 存储器访问指令存储器访问指令(5)STRB指令
38、指令格式格式为: STR条件条件B 源寄存器,源寄存器, STRB指令是指令是无符号字无符号字节存存储指令指令,用于从源,用于从源寄存器中将一个寄存器中将一个8位的字位的字节数据数据传送到存送到存储器中。器中。该字字节数据数据为源寄存器中的低源寄存器中的低8位。位。ARM 存储器访问指令存储器访问指令指令示例:指令示例:STRB R3,R1 ;将寄存器;将寄存器R3中的字中的字节数据写入以数据写入以R1为地址的存地址的存储器中。器中。STRB R3,R1,8;将寄存器;将寄存器R3中的字中的字节数据写入以数据写入以R18为地址的地址的存存储器中。器中。ARM 存储器访问指令存储器访问指令(6)
39、STRH指令指令格式格式为: STR条件条件H 源寄存器,源寄存器, STRH指令是指令是无符号半字存无符号半字存储指令指令,用于从源,用于从源寄存器中将一个寄存器中将一个16位的半字数据位的半字数据传送到存送到存储器中。器中。该半字数据半字数据为源寄存器中的低源寄存器中的低16位。位。ARM 存储器访问指令存储器访问指令指令示例:指令示例:STRH R3,R1 ;将寄存器;将寄存器R3中的半字数据写入以中的半字数据写入以R1为地址的存地址的存储器中。器中。STRH R3,R1,8 ;将寄存器;将寄存器R3中的半字数据写中的半字数据写入以入以R18为地址的存地址的存储器中。器中。ARM 存储器
40、访问指令存储器访问指令2批量数据加批量数据加载/存存储指令指令 ARM微微处理器所支持批量数据加理器所支持批量数据加载/存存储指令指令可以一次在一片可以一次在一片连续的存的存储器器单元和多个寄存器元和多个寄存器之之间传送数据,批量加送数据,批量加载指令用于将一片指令用于将一片连续的的存存储器中的数据器中的数据传送到多个寄存器,批量数据存送到多个寄存器,批量数据存储指令指令则完成相反的操作。完成相反的操作。ARM 存储器访问指令存储器访问指令常用的加常用的加载存存储指令如下:指令如下:LDM(或(或STM)指令)指令格式格式为:LDM(或(或STM)条件条件类型型 基址寄存器基址寄存器!,寄存器
41、列表,寄存器列表 LDM(或(或STM)指令用于从由基址寄存器所指示的一)指令用于从由基址寄存器所指示的一片片连续存存储器到寄存器列表所指示的多个寄存器之器到寄存器列表所指示的多个寄存器之间传送送数据,数据,该指令的常指令的常见用途是将多个寄存器的内容入用途是将多个寄存器的内容入栈或出或出栈。其中,。其中,类型型为以下几种情况:以下几种情况:ARM 存储器访问指令存储器访问指令uIA 每次每次传送后地址加送后地址加1,递增方式;增方式;uIB 每次每次传送前地址加送前地址加1,递增方式;增方式;uDA 每次每次传送后地址减送后地址减1,递减方式;减方式;uDB 每次每次传送前地址减送前地址减1
42、,递减方式;减方式;uFD 满递减堆减堆栈;uED 空空递减堆减堆栈;uFA 满递增堆增堆栈;uEA 空空递增堆增堆栈;ARM 存储器访问指令存储器访问指令u!为可可选后后缀,若,若选用用该后后缀,则当数据当数据传送完送完毕之后,将最后的地址写入基址寄存器,否之后,将最后的地址写入基址寄存器,否则基址寄存基址寄存器的内容不改器的内容不改变。u基址寄存器不允基址寄存器不允许为R15。u寄存器列表可以寄存器列表可以为R0R15的任意的任意组合,若使用合,若使用连续的寄存器的寄存器时,可以使用,可以使用“-”表示省略。表示省略。u为可可选后后缀,这是一个只是在数据是一个只是在数据块传送中使用送中使用
43、的后的后缀,当指令,当指令为LDM且寄存器列表中包含且寄存器列表中包含R15,选用用该后后缀时表示:除了正常的数据表示:除了正常的数据传送之外,送之外,还将将SPSR复制到复制到CPSR。同。同时,该后后缀还表示表示传入或入或传出出的是用的是用户模式下的寄存器,而不是当前模式下的寄存模式下的寄存器,而不是当前模式下的寄存器。器。ARM 存储器访问指令存储器访问指令指令示例:指令示例:STMFD R13!,R0,R4-R12,LR;将寄存器列表中的寄存器(;将寄存器列表中的寄存器(R0,R4到到R12,LR)存入堆)存入堆栈。LDMFD R13!,R0,R4-R12,PC;将堆;将堆栈内容恢复到
44、寄存器(内容恢复到寄存器(R0,R4到到R12,LR)。)。在通用存在通用存储区,数据存区,数据存储的方式和堆的方式和堆栈区相近。下面通区相近。下面通过存存储R1、R2和和R3 3个寄存器的个寄存器的4种后种后缀指令指令执行前后的存行前后的存储情况如情况如图3-7所示。所示。ARM 存储器访问指令存储器访问指令3交交换指令指令(1)SWP指令指令格式格式为: SWP条件条件 目的寄存器,源寄存器目的寄存器,源寄存器1,源寄存器源寄存器2 SWP指令是数据指令是数据字交字交换指令,用于将源寄存器指令,用于将源寄存器2所所指向的存指向的存储器中的字数据器中的字数据传送到目的寄存器中,同送到目的寄存
45、器中,同时将将源寄存器源寄存器1中的字数据中的字数据传送到源寄存器送到源寄存器2所指向的存所指向的存储器器中。中。显然,当源寄存器然,当源寄存器1和目的寄存器和目的寄存器为同一个寄存器同一个寄存器时,指令交,指令交换该寄存器和存寄存器和存储器的内容。器的内容。ARM 存储器访问指令存储器访问指令指令示例:指令示例:SWP R1,R2,R3 ;将;将R3所指向的存所指向的存储器中的字数据器中的字数据传送到送到R1,同,同时;将;将R2中的字数据中的字数据传送到送到R3所指向的存所指向的存储单元。元。SWPEQ R1,R1,R2 ;Z=1时,完成将,完成将R2所指向的存所指向的存储器中的字数据与器
46、中的字数据与;R1中的字数据交中的字数据交换。ARM 存储器访问指令存储器访问指令STMIBSTMIB R0R0!,R1,R2,R3R1,R2,R3指令执行前指令执行前指令执行后指令执行后R0R0R3R3R2R2R1R1R0R0STMIA R0!,R1,R2,R3STMIA R0!,R1,R2,R3指令执行前指令执行前指令执行后指令执行后R0R0R3R3R2R2R1R1R0R0地址增地址增STMDA R0!,R1,R2,R3STMDA R0!,R1,R2,R3指令执行前指令执行前指令执行后指令执行后R0R0R3R3R2R2R1R1R0R0STMDB R0!,R1,R2,R3STMDB R0!,
47、R1,R2,R3指令执行前指令执行前指令执行后指令执行后R0R0R3R3R2R2R1R1R0R0地址减地址减ARM 存储器访问指令存储器访问指令(2)SWPB指令指令格式格式为:SWP条件条件B 目的寄存器,源寄存器目的寄存器,源寄存器1,源寄存器源寄存器2 SWPB指令是指令是字字节交交换指令指令,用于将源寄存,用于将源寄存器器2所指向的存所指向的存储器中的字器中的字节数据数据传送到目的寄存送到目的寄存器中,目的寄存器的高器中,目的寄存器的高24清零,同清零,同时将源寄存器将源寄存器1中的字中的字节数据数据传送到源寄存器送到源寄存器2所指向的存所指向的存储器中。器中。显然,当源寄存器然,当源
48、寄存器1和目的寄存器和目的寄存器为同一个寄存器同一个寄存器时,指令交,指令交换该寄存器和存寄存器和存储器的内容。器的内容。ARM 存储器访问指令存储器访问指令指令示例:指令示例:SWPB R1,R2,R3;将;将R3所指向的存所指向的存储器中的字器中的字节数据数据传送到送到R1,R1的的高高24位清零,同位清零,同时将将R2中的低中的低8位数据位数据传送到送到R3所指所指向的存向的存储单元。元。SWPB R1,R1,R2;该指令完成将指令完成将R2所指向的存所指向的存储器中的字器中的字节数据与数据与R1中的低中的低8位数据交位数据交换。ARM 数据处理类指令数据处理类指令u数据数据处理指令只能
49、理指令只能对寄存器的内容寄存器的内容进行操作,不允行操作,不允许对存存储器中的数据器中的数据进行操作,也不允行操作,也不允许指令直接使用指令直接使用存存储器的数据或在寄存器与存器的数据或在寄存器与存储器之器之间传送数据。送数据。u数据数据处理指令可分理指令可分为3大大类:u数据数据传送指令送指令u算算术逻辑运算指令运算指令u比比较指令指令ARM 数据处理类指令数据处理类指令u数据数据传送指令送指令用于在寄存器和存用于在寄存器和存储器之器之间进行数行数据的双向据的双向传输。u算算术逻辑运算指令运算指令完成常用的算完成常用的算术与与逻辑的运算,的运算,该类指令不但将运算指令不但将运算结果保存在目的
50、寄存器中,果保存在目的寄存器中,同同时更新更新CPSR中的相中的相应条件条件标志位。志位。u比比较指令指令是完成是完成对指定的两个寄存器(或指定的两个寄存器(或1个寄存个寄存器,器,1个立即数)个立即数)进行比行比较,不保存运算,不保存运算结果,只果,只影响影响CPSR中相中相应的条件的条件标志位。志位。数据传送指令数据传送指令1.数据数据传送指令送指令MOV和和MVN(1)MOV指令指令 格式格式为: MOV条件条件S 目的寄存器,源操作数目的寄存器,源操作数 MOV指令可完成在寄存器之指令可完成在寄存器之间或寄存器与第或寄存器与第2操作数之操作数之间进行数据行数据传送。送。 其中其中S选项
51、决定指令的操作是否影响决定指令的操作是否影响CPSR中中条件条件标志位的志位的值,当没有,当没有S时指令不更新指令不更新CPSR中中条件条件标志位的志位的值。数据传送指令数据传送指令指令示例:指令示例:MOVR4,R5;将寄存器;将寄存器R5的内容的内容传送到寄存器送到寄存器R4MOVPC,R14;将寄存器;将寄存器R14的内容的内容传送到送到PC,常用于子程序返,常用于子程序返回回MOVNE R4,R5,LSL2;当;当Z=0时,将寄存器,将寄存器R5的内容的内容逻辑左移左移2位后位后传送送到到R4数据传送指令数据传送指令(2)MVN指令指令格式格式为:MVN条件条件S 目的寄存器,源操作数
52、目的寄存器,源操作数 MVN指令可完成在寄存器之指令可完成在寄存器之间或寄存器与第或寄存器与第2操作数之操作数之间进行数据非行数据非传送。与送。与MOV指令不同指令不同之之处是在是在传送之前按位被取反了,即把一个被取送之前按位被取反了,即把一个被取反的反的值传送到目的寄存器中。送到目的寄存器中。 其中其中S决定指令的操作是否影响决定指令的操作是否影响CPSR中条件中条件标志位的志位的值,当没有,当没有S时指令不更新指令不更新CPSR中条件中条件标志位的志位的值。数据传送指令数据传送指令(2)MVN指令指令格式格式为:MVN条件条件S 目的寄存器,源操作数目的寄存器,源操作数 MVN指令可完成在
53、寄存器之指令可完成在寄存器之间或寄存器与第或寄存器与第2操作数之操作数之间进行数据非行数据非传送。与送。与MOV指令不同之指令不同之处是在是在传送之前按位被取反了,即把一个被取反送之前按位被取反了,即把一个被取反的的值传送到目的寄存器中。送到目的寄存器中。 其中其中S决定指令的操作是否影响决定指令的操作是否影响CPSR中条件中条件标志位的志位的值,当没有,当没有S时指令不更新指令不更新CPSR中条件中条件标志位的志位的值。数据传送指令数据传送指令指令示例:指令示例:MVN R0,0;将立即数;将立即数0取反取反传送到寄存器送到寄存器R0中,完成后中,完成后R0=-1 MVN R1,R2;将将R
54、2取反,取反,结果存到果存到R1算术逻辑运算指令算术逻辑运算指令2.算算术逻辑运算指令运算指令(1)ADD指令指令格式格式为: ADD条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 ADD指令是指令是加法指令加法指令,用于把两个操作数相加,用于把两个操作数相加,并将并将结果存放到目的寄存器中。果存放到目的寄存器中。u 操作数操作数1应是一个寄存器。是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或可以是一个寄存器,被移位的寄存器,或一个立即数一个立即数 .算术逻辑运算指令算术逻辑运算指令指令示例:指令示例:ADDS R0,R3,R4 ; R0 = R3 +
55、 R4,设置置标志位志位ADDC R0,R3,#10 ; R0 = R3 + 10ADD R0,R2,R3,LSL#2 ; R0 = R2 + R34算术逻辑运算指令算术逻辑运算指令(2)ADC指令指令格式格式为: ADC条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2ADC指令是指令是带进位加法指令位加法指令,用于把两个操作数相加,用于把两个操作数相加,再加上再加上CPSR中的中的C条件条件标志位的志位的值,并将,并将结果存放到果存放到目的寄存器中。它使用一个目的寄存器中。它使用一个进位位标志位,志位,这样就可以就可以做比做比32位大的数的加法,注意不要忘位大的数的加法,
56、注意不要忘记设置置S后后缀来来更改更改进位位标志。志。u操作数操作数1应是一个寄存器。是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或一可以是一个寄存器,被移位的寄存器,或一个立即数。个立即数。算术逻辑运算指令算术逻辑运算指令以下指令序列以下指令序列实现64位二位二进制数的加法:制数的加法:R2、R1= R2、R1+ R4、R3ADDS R1,R1,R3 ;R1= R1+ R3ADC R2,R2,R4 ;R2= R2+ R4+C算术逻辑运算指令算术逻辑运算指令(3)SUB指令指令格式格式为: SUB条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 SUB指
57、令是指令是减法指令减法指令,用于把操作数,用于把操作数1减去操作减去操作数数2,并将,并将结果存放到目的寄存器中。果存放到目的寄存器中。该指令可用指令可用于有符号数或无符号数的减法运算。于有符号数或无符号数的减法运算。u操作数操作数1应是一个寄存器。是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或可以是一个寄存器,被移位的寄存器,或一个立即数。一个立即数。算术逻辑运算指令算术逻辑运算指令指令示例:指令示例:SUBS R0,R3,R4 ; R0 = R3 R4,设置置标志位志位SUB R0,R1,#0x10 ; R0 = R1 - 0x 10SUB R0,R2,R3,LSL#1
58、 ; R0 = R2 - (R3 1)算术逻辑运算指令算术逻辑运算指令(4) SBC指令指令格式格式为: SBC条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 SBC指令是指令是带借位减法指令借位减法指令,用于把操作数,用于把操作数1减去操减去操作数作数2,再减去,再减去CPSR中的中的C条件条件标志位的反志位的反码,并将,并将结果果存放到目的寄存器中。存放到目的寄存器中。该指令可用于有符号数或无符号数指令可用于有符号数或无符号数的减法运算。的减法运算。u操作数操作数1应是一个寄存器。是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或一个立可以是一个寄存器
59、,被移位的寄存器,或一个立即数。即数。该指令使用指令使用进位位标志来表示借位,志来表示借位,这样就可以做大就可以做大于于32位的减法,注意不要忘位的减法,注意不要忘记设置置S后后缀来更改来更改进位位标志。志。指令示例指令示例:SBCR2,R2,R4 ; R2 = R2 R4-C算术逻辑运算指令算术逻辑运算指令(5)RSB指令指令格式格式为: RSB条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 RSB指令是指令是反减法指令反减法指令,用于把操作数,用于把操作数2减去操减去操作数作数1,并将,并将结果存放到目的寄存器中。果存放到目的寄存器中。该指令可指令可用于有符号数或无符
60、号数的减法运算。用于有符号数或无符号数的减法运算。u操作数操作数1应是一个寄存器。是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或可以是一个寄存器,被移位的寄存器,或一个立即数。一个立即数。算术逻辑运算指令算术逻辑运算指令指令示例指令示例:RSB R0,R1,R2 ; R0 = R2 R1RSB R0,R1,#0x10 ; R0 = 0x10 R1RSB R0,R2,R3,LSL#1 ; R0 =R32 - R2算术逻辑运算指令算术逻辑运算指令(6)RSC指令指令格式格式为:RSC条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2RSC指令是指令是带借位反减
61、法指令借位反减法指令,用于把操作数,用于把操作数2减去操作减去操作数数1,再减去,再减去CPSR中的中的C条件条件标志位的反志位的反码,并将,并将结果存果存放到目的寄存器中。放到目的寄存器中。该指令可用于有符号数或无符号数的指令可用于有符号数或无符号数的减法运算。减法运算。u操作数操作数1应是一个寄存器。是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或一个立可以是一个寄存器,被移位的寄存器,或一个立即数。即数。算术逻辑运算指令算术逻辑运算指令指令示例:指令示例:RSCS R6,R4,R3,LSL #1 ; R6 = R32 R4+C -1同同时刷新刷新标志位志位算术逻辑运算指
62、令算术逻辑运算指令(7)AND指令指令格式格式为:AND条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2AND指令是指令是逻辑与指令与指令,用于在两个操作数上,用于在两个操作数上进行行逻辑与与运算,并把运算,并把结果放置到目的寄存器中。果放置到目的寄存器中。该指令常用于屏蔽指令常用于屏蔽操作数操作数1的某些位。的某些位。u操作数操作数1应是一个寄存器。是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或一个立可以是一个寄存器,被移位的寄存器,或一个立即数。即数。算术逻辑运算指令算术逻辑运算指令指令示例指令示例:AND R5,R6,R8 ; R5=R6R8AND
63、 R2,R2,3 ; 该指令保持指令保持R2的的0、1位,其余位清零。位,其余位清零。算术逻辑运算指令算术逻辑运算指令(8)ORR指令指令 格式格式为: ORR条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 ORR指令是指令是逻辑或指令或指令,用于在两个操作数上,用于在两个操作数上进行行逻辑或运算,并把或运算,并把结果放置到目的寄存器中。果放置到目的寄存器中。该指令常用于指令常用于设置操作数置操作数1的某些位。的某些位。u操作数操作数1应是一个寄存器。是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或一个立可以是一个寄存器,被移位的寄存器,或一个立即数。即
64、数。算术逻辑运算指令算术逻辑运算指令指令示例指令示例:ORR R5,R6,R8 ; R5=R6R8ORR R2,R2,3 ; 该指令指令设置置R2的的0、1位,其余位保持不位,其余位保持不变。算术逻辑运算指令算术逻辑运算指令(9)EOR指令指令格式格式为: EOR条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 EOR指令是指令是逻辑异或指令异或指令,用于在两个操作数上,用于在两个操作数上进行行逻辑异或运算,并把异或运算,并把结果放置到目的寄存器中。果放置到目的寄存器中。该指令常用于反指令常用于反转操作数操作数1的某些位。的某些位。u操作数操作数1应是一个寄存器。是一个寄存
65、器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或一可以是一个寄存器,被移位的寄存器,或一个立即数。个立即数。 算术逻辑运算指令算术逻辑运算指令指令示例指令示例:EOR R5,R6,R8 ; R5=R6+R8EOR R2,R2,3 ; 该指令反指令反转R2的的0、1位,其余位保持不位,其余位保持不变。算术逻辑运算指令算术逻辑运算指令(10)BIC指令指令格式格式为: BIC条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2 BIC指令是指令是位清除指令位清除指令,用于清除操作数,用于清除操作数1的某的某些位,并把些位,并把结果放置到目的寄存器中。果放置到目的寄存器中。u
66、操作数操作数1应是一个寄存器。是一个寄存器。u操作数操作数2可以是一个寄存器,被移位的寄存器,或可以是一个寄存器,被移位的寄存器,或一个立即数。一个立即数。算术逻辑运算指令算术逻辑运算指令指令示例:指令示例:BIC R0,R2,2_0011 ;清除;清除 R2 中的位中的位 0、1,其余的位保持不,其余的位保持不变。BICS R0,R2,0x80000000 ;清除;清除 R2 中的位中的位 31,其余的位保持不,其余的位保持不变,刷新,刷新标志位。志位。算术逻辑运算指令算术逻辑运算指令(11)MUL指令指令格式格式为: MUL条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数
67、2 MUL指令是指令是乘法指令乘法指令,完成将操作数,完成将操作数1与操作数与操作数2的的乘法运算,并把乘法运算,并把结果放置到目的寄存器中,同果放置到目的寄存器中,同时可以可以根据运算根据运算结果果设置置CPSR中相中相应的条件的条件标志位(不会志位(不会影响影响V)。其中,操作数)。其中,操作数1和操作数和操作数2均均为32位的有符位的有符号数或无符号数。号数或无符号数。算术逻辑运算指令算术逻辑运算指令指令示例指令示例:MUL R0,R4,R5;R0 = R4 R5MULS R0,R4,R5;R0 = R4 R5,同,同时设置条件置条件标志位志位算术逻辑运算指令算术逻辑运算指令(12)ML
68、A指令指令格式格式为: MLA条件条件S 目的寄存器,操作数目的寄存器,操作数1,操作数,操作数2,操作数操作数3 MLA指令是指令是乘加指令乘加指令,完成将操作数,完成将操作数1与操作数与操作数2的的乘法运算,再将乘乘法运算,再将乘积加上操作数加上操作数3,并把,并把结果放置到果放置到目的寄存器中,同目的寄存器中,同时可以根据运算可以根据运算结果果设置置CPSR中中相相应的条件的条件标志位(不会影响志位(不会影响V)。)。 其中,操作数其中,操作数1和操作数和操作数2均均为32位的有符号数或无位的有符号数或无符号数。符号数。算术逻辑运算指令算术逻辑运算指令指令示例指令示例:MLA R0,R1
69、,R2,R3;R0 = R1 R2 + R3MLASR0,R1,R2,R3;R0 = R1 R2 + R3,同,同时设置置CPSR中的相关条中的相关条件件标志位志位算术逻辑运算指令算术逻辑运算指令(13)SMULL指令指令格式格式为: SMULL条件条件S 目的寄存器目的寄存器Low,目的寄存器低,目的寄存器低High,操作数操作数1,操作数,操作数2 SMULL指令是指令是带符号符号长乘法指令乘法指令,完成将操作数,完成将操作数1与操作与操作数数2的乘法运算,并把的乘法运算,并把结果的低果的低32位放置到目的寄存器位放置到目的寄存器Low中,中,结果的高果的高32位放置到目的寄存器位放置到目
70、的寄存器High中,同中,同时可可以根据运算以根据运算结果果设置置CPSR中相中相应的条件的条件标志位。志位。 其中,操作数其中,操作数1和操作数和操作数2均均为32位的有符号数。位的有符号数。算术逻辑运算指令算术逻辑运算指令指令示例:指令示例:SMULL R1,R2,R3,R4 ;R1 = (R3 R4)的低)的低32位位 ;R2 = (R3 R4)的高)的高32位位 算术逻辑运算指令算术逻辑运算指令(14)SMLAL指令指令 格式格式为: SMLAL条件条件S 目的寄存器目的寄存器Low,目的寄存器低,目的寄存器低High,操作数操作数1,操作数,操作数2 SMLAL指令是指令是长乘加指令
71、乘加指令,完成将操作数,完成将操作数1与操作数与操作数2的的乘法运算,并把乘法运算,并把结果的低果的低32位同目的寄存器位同目的寄存器Low中的中的值相相加后又放置到目的寄存器加后又放置到目的寄存器Low中,中,结果的高果的高32位同目的寄位同目的寄存器存器High中的中的值相加后又放置到目的寄存器相加后又放置到目的寄存器High中,同中,同时可以根据运算可以根据运算结果果设置置CPSR中相中相应的条件的条件标志位。其中,志位。其中,操作数操作数1和操作数和操作数2均均为32位的有符号数。位的有符号数。算术逻辑运算指令算术逻辑运算指令u对于目的寄存器于目的寄存器Low,在指令,在指令执行前存放
72、行前存放64位加数的位加数的低低32位,指令位,指令执行后存放行后存放结果的低果的低32位。位。u对于目的寄存器于目的寄存器High,在指令,在指令执行前存放行前存放64位加数的位加数的高高32位,指令位,指令执行后存放行后存放结果的高果的高32位。位。指令示例:指令示例: SMLAL R1,R2,R3,R4 ;R1 = (R3 R4)的低)的低32位位 R1 ;R2 = (R3 R4)的高)的高32位位 R2算术逻辑运算指令算术逻辑运算指令(15)UMULL指令指令 格式格式为:UMULL条件条件S 目的寄存器目的寄存器Low,目的寄存器低,目的寄存器低High,操,操作数作数1,操作数,操
73、作数2 UMULL指令是指令是无符号乘法指令无符号乘法指令,完成将操作数,完成将操作数1与操作数与操作数2的乘法运算,并把的乘法运算,并把结果的低果的低32位放置到目的寄存器位放置到目的寄存器Low中,中,结果的高果的高32位放置到目的寄存器位放置到目的寄存器High中,同中,同时可以根可以根据运算据运算结果果设置置CPSR中相中相应的条件的条件标志位。志位。 其中,操作数其中,操作数1和操作数和操作数2均均为32位的无符号数。位的无符号数。算术逻辑运算指令算术逻辑运算指令指令示例:指令示例:UMULL R1,R2,R3,R4;R1 = (R3 R4)的低)的低32位位;R2 = (R3 R4
74、)的高)的高32位位算术逻辑运算指令算术逻辑运算指令(16)UMLAL指令指令格式格式为:UMLAL条件条件S目的寄存器目的寄存器Low,目的寄存器低,目的寄存器低High,操作数操作数1,操作数,操作数2 UMLAL指令是指令是无符号无符号长乘法指令乘法指令,完成将操作数,完成将操作数1与操与操作数作数2的乘法运算,并把的乘法运算,并把结果的低果的低32位同目的寄存器位同目的寄存器Low中的中的值相加后又放置到目的寄存器相加后又放置到目的寄存器Low中,中,结果的高果的高32位位同目的寄存器同目的寄存器High中的中的值相加后又放置到目的寄存器相加后又放置到目的寄存器High中,同中,同时可
75、以根据运算可以根据运算结果果设置置CPSR中相中相应的条件的条件标志志位。其中,操作数位。其中,操作数1和操作数和操作数2均均为32位的无符号数。位的无符号数。算术逻辑运算指令算术逻辑运算指令u对于目的寄存器于目的寄存器Low,在指令,在指令执行前存放行前存放64位加数的位加数的低低32位,指令位,指令执行后存放行后存放结果的低果的低32位。位。u对于目的寄存器于目的寄存器High,在指令,在指令执行前存放行前存放64位加数的位加数的高高32位,指令位,指令执行后存放行后存放结果的高果的高32位。位。指令示例:指令示例:UMLAL R1,R2,R3,R4 ;R1 = (R3 R4)的低)的低3
76、2位位 R1 ;R2= (R3 R4)的高)的高32位位 R2比较和测试指令比较和测试指令(1)CMP指令指令格式格式为:CMP条件条件 操作数操作数1,操作数,操作数2 CMP指令是指令是比比较指令指令,该指令是做一次减法运算,但指令是做一次减法运算,但不存不存储结果,只是刷新条件果,只是刷新条件标志位,根据条件志位,根据条件标志位判断志位判断操作数的大小。操作数的大小。对条件位的影响是:条件位的影响是:结果果为正数正数则N=0,结果果为负数数则N=1;结果果为0则Z=1,结果不果不为0则Z=0;如果;如果产生借位生借位则C=0,没有借位,没有借位则C=1;结果是符号溢出果是符号溢出则V=1
77、,否,否则V=0。比较和测试指令比较和测试指令指令示例:指令示例:CMP R1,#0x30;比;比较R1和和0x30ADDCS R5,R5,#0x20;如果;如果C=1,则R5=R5+0x20ADDCC R5,R5,#0x10;如果;如果C=0,则R5=R5+0x10比较和测试指令比较和测试指令(2)CMN指令指令格式格式为: CMN条件条件 操作数操作数1,操作数,操作数2 CMN指令是指令是比比较非指令非指令,也是做一次减法运算,也是做一次减法运算,用第,用第1操作数减去第操作数减去第2操作数的非操作数的非值,结果不保果不保存,只是刷新条件存,只是刷新条件标志位,志位,对条件条件标志位的影
78、响志位的影响和比和比较指令指令CMP相同。相同。比较和测试指令比较和测试指令指令示例:指令示例:CMN R1,#0x00;比;比较R1和和0xFFFFFFFFADDCS R5,R5,#0x20;如果;如果C=1,则R5=R5+0x20ADDCC R5,R5,#0x10;如果;如果C=0,则R5=R5+0x10比较和测试指令比较和测试指令(3)TST指令指令格式格式为: TST条件条件 操作数操作数1,操作数,操作数2 TST指令是指令是位位测试指令指令,用于把一个寄存器的内容和另一,用于把一个寄存器的内容和另一个寄存器的内容或立即数个寄存器的内容或立即数进行按位的与运算,并根据运算行按位的与运
79、算,并根据运算结果更新果更新CPSR中条件中条件标志位的志位的值。指令示例:指令示例:TSTR2,0x01;将寄存器;将寄存器R1的的值与立即数与立即数 0x01按位与,并根据按位与,并根据结果果设置置CPSR的的标志位,用来判断志位,用来判断R2中最低位是否中最低位是否为0。比较和测试指令比较和测试指令(4)TEQ指令指令格式格式为: TEQ条件条件 操作数操作数1,操作数,操作数2 TEQ指令是指令是测试指令指令,用于把一个寄存器的内容和另一,用于把一个寄存器的内容和另一个寄存器的内容或立即数个寄存器的内容或立即数进行按位的异或运算,并根据运行按位的异或运算,并根据运算算结果更新果更新CP
80、SR中条件中条件标志位的志位的值。该指令通常用于比指令通常用于比较操作数操作数1和操作数和操作数2是否相等。是否相等。指令示例:指令示例:TEQR1,#0x10;将寄存器;将寄存器R1的的值与与0x10按位异或,并根据按位异或,并根据结果果设置置;CPSR的的标志位,若志位,若Z=1则表示表示R1的内容是的内容是0x10ARM 分支指令分支指令u在在ARM指令集中,没有指令集中,没有专门的子程序的子程序调用指令,把用指令,把分支和子程序分支和子程序调用看成是同一种操作,分支指令用于用看成是同一种操作,分支指令用于实现程序流程的跳程序流程的跳转,在,在ARM程序中可以通程序中可以通过使用使用专门
81、的跳的跳转指令或是直接向程序指令或是直接向程序计数器数器PC写入跳写入跳转地地址址值的方法来的方法来实现。u通通过向程序向程序计数器数器PC写入跳写入跳转地址地址值,可以,可以实现在在4GB的地址空的地址空间中的任意跳中的任意跳转,在跳,在跳转之前之前结合使用合使用MOVLR,PC等等类似指令,可以保存将来的返回似指令,可以保存将来的返回地址地址值,从而,从而实现在在4GB连续的的线性地址空性地址空间的子程的子程序序调用。用。ARM 分支指令分支指令 ARM指令集中的跳指令集中的跳转指令可以完成从当前指令向指令可以完成从当前指令向前或向后的前或向后的32MB的地址空的地址空间的跳的跳转,包括以
82、下,包括以下3条指条指令:令:1. B指令指令2. BL指令指令3. BX指令指令ARM 分支指令分支指令1. B指令指令 格式格式为: B条件条件 目目标地址地址 B指令是指令是分支指令分支指令,是最,是最简单的跳的跳转指令。一旦遇到一指令。一旦遇到一个个 B 指令,指令,ARM 处理器将立即跳理器将立即跳转到到给定的目定的目标地址,地址,从那里从那里继续执行。行。 注意注意存存储在跳在跳转指令中的指令中的实际值是相是相对当前当前PC值的一的一个偏移量,而不是一个个偏移量,而不是一个绝对地址,它的地址,它的值由由汇编器来器来计算算(参考(参考寻址方式中的相址方式中的相对寻址)。址)。ARM
83、分支指令分支指令指令指令实例:例:BLabel ;程序无条件跳;程序无条件跳转到到标号号Label处执行行CMP R1,0 ;当;当CPSR寄存器中的寄存器中的Z条件条件码置位置位 ;时, 程序跳程序跳转到到标号号Label处执行行BEQ Label ARM 分支指令分支指令2. BL指令指令格式格式为: BL条件条件 目目标地址地址 BL指令是指令是分支和分支和链接指令接指令,一种可以存,一种可以存储分支分支处地址的分支指令,可用于子程序地址的分支指令,可用于子程序调用。具体用。具体实现过程程是跳是跳转之前,会在寄存器之前,会在寄存器R14中保存中保存PC的当前内容,的当前内容,因此,可以通
84、因此,可以通过将将R14 的内容重新加的内容重新加载到到PC中,来返中,来返回到跳回到跳转指令之后的那个指令指令之后的那个指令处执行。行。ARM 分支指令分支指令指令指令实例:例:BL Label ;当程序无条件跳;当程序无条件跳转到到标号号Label处执行行时, ;同;同时将当前的将当前的PC值保存到保存到R14中中ARM 分支指令分支指令3. BX指令指令格式格式为:BX条件条件 目目标地址地址BX指令是指令是分支和交分支和交换指令指令,可以在,可以在ARM指令集和指令集和Thumb指令集之指令集之间跳跳转的分支指令。的分支指令。ARM 分支指令分支指令指令指令实例:例:CODE32;AR
85、M程序段,程序段,32位位编码ARM1;语句句标号号 ADR R0,THUMB1+1;把;把THUMB1所在的地址所在的地址赋给R0 BX R0;跳;跳转到到THUMB1指令集指令集 CODE16THUMB1: ADR R0,ARM1;把;把语句句标号号ARM1所在的地址所在的地址赋给R0BIC R0,R0,#01;末位;末位R00清清0BX R0;跳;跳转到到ARM指令集指令集ARM 协处理器指令协处理器指令uARM作作为32位位处理器,理器,虽然能然能进行行长乘法和乘加等乘法和乘加等运算,但没有除法指令和更复运算,但没有除法指令和更复杂的运算指令。的运算指令。u因此,因此, ARM可以通可
86、以通过外接外接协处理器来解决此理器来解决此问题,协处理器是一种理器是一种专门用于用于进行行辅助运算的芯片,其本助运算的芯片,其本身除了运算功能以外没有其他功能,因此,不能独立身除了运算功能以外没有其他功能,因此,不能独立工作,必工作,必须和和CPU一起工作,一起工作,ARM处理器可支持多理器可支持多达达16个个协处理器,每个理器,每个协处理器都有自己的理器都有自己的编号,命号,命名名为Pn,每个,每个协处理器都有自己的寄存器,命名理器都有自己的寄存器,命名为Cn。 ARM 协处理器指令协处理器指令 ARM的的协处理器指令主要用于理器指令主要用于ARM处理器初始理器初始化化ARM协处理器的数据理
87、器的数据处理操作,以及在理操作,以及在ARM处理理器的寄存器和器的寄存器和协处理器的寄存器之理器的寄存器之间传送数据,和在送数据,和在ARM协处理器的寄存器和存理器的寄存器和存储器之器之间传送数据。送数据。 ARM协处理器指令包括以下理器指令包括以下5条:条: uCDP指令指令uLDC指令指令uSTC指令指令uMCR和和MRC指令指令ARM 协处理器指令协处理器指令1. CDP指令指令 格式格式为: CDP条件条件 协处理器理器编码,协处理器操作理器操作码1,目的寄存器,目的寄存器,源寄存器源寄存器1,源寄存器,源寄存器2,协处理器操作理器操作码2。 CDP指令是指令是协处理器数据操作指令理器
88、数据操作指令,用于,用于ARM处理理器通知器通知ARM协处理器理器执行特定的操作,若行特定的操作,若协处理器不能理器不能成功完成特定的操作,成功完成特定的操作,则产生未定生未定义指令异常。其中指令异常。其中协处理器操作理器操作码1和和协处理器操作理器操作码2为协处理器将要理器将要执行的操行的操作,目的寄存器和源寄存器均作,目的寄存器和源寄存器均为协处理器的寄存器,指令理器的寄存器,指令不涉及不涉及ARM处理器的寄存器和存理器的寄存器和存储器。器。ARM 协处理器指令协处理器指令指令示例:指令示例:CDP P1,2,C1,C2,C3 ;命令命令1号(号(P1)协处理器把自己的寄存器(理器把自己的
89、寄存器(协处理器理器; 寄存器)寄存器)C2和和C3作作为操作数,操作数,进行第行第2方式的操作,方式的操作, ;结果放在果放在C1(协处理器寄存器)中。理器寄存器)中。 ARM 协处理器指令协处理器指令2. LDC指令指令格式格式为:LDC条件条件L 协处理器理器编码,目的寄存器,目的寄存器,源寄存器源寄存器 LDC指令是指令是协处理器加理器加载指令指令,用于将源寄存器所指向的,用于将源寄存器所指向的存存储器中的字数据器中的字数据传送到目的寄存器中,若送到目的寄存器中,若协处理器不能理器不能成功完成成功完成传送操作,送操作,则产生未定生未定义指令异常。其中,指令异常。其中,L选项表示指令表示
90、指令为长读取操作,如用于双精度数据的取操作,如用于双精度数据的传输。ARM 协处理器指令协处理器指令指令示例:指令示例:LDC P3,C4,R5;将;将ARM处理器的寄存器理器的寄存器R5所指向的存所指向的存储器中的字器中的字;数据;数据传送到送到协处理器理器P3的寄存器的寄存器C4中。中。 ARM 协处理器指令协处理器指令3. STC指令指令格式格式为:STC条件条件L 协处理器理器编码,源寄存器,源寄存器,目的寄存器目的寄存器 STC指令是指令是协处理器存理器存储指令指令,用于将源寄存器中的,用于将源寄存器中的字数据字数据传送到目的寄存器所指向的存送到目的寄存器所指向的存储器中,若器中,若
91、协处理器不能成功完成理器不能成功完成传送操作,送操作,则产生未定生未定义指令异常。指令异常。其中,其中,L选项表示指令表示指令为长读取操作,如用于双精取操作,如用于双精度数据的度数据的传输。ARM 协处理器指令协处理器指令指令示例:指令示例:STCEQ P2,C4,R5 ;当;当Z=1时,执行将行将协处理器理器P2的寄存器的寄存器C4中的字数中的字数;据;据传送到送到ARM处理器的寄存器理器的寄存器R5所指向的存所指向的存储器中。器中。 ARM 协处理器指令协处理器指令4. MCR和和MRC指令指令格式格式为:MCR/MRC 条件条件 协处理器理器编码,协处理器操作理器操作码1,源寄存器,目的
92、寄存器源寄存器,目的寄存器1,目的寄存器,目的寄存器2,协处理器操理器操作作码2。这两条指令是用来两条指令是用来在两个寄存器之在两个寄存器之间进行数据行数据传送送。u从从ARM处理器寄存器中的数据理器寄存器中的数据传送到送到协处理器寄存理器寄存器使用器使用MCR指令;指令;u从从协处理器寄存器中的数据理器寄存器中的数据传送到送到ARM处理器寄存理器寄存器使用器使用MRC指令。指令。ARM 协处理器指令协处理器指令uARM处理器指定一个寄存器作理器指定一个寄存器作为传送数据的源或接送数据的源或接收数据的目收数据的目标。u协处理器指定两个寄存器,同理器指定两个寄存器,同时可以像可以像CDP指令一指
93、令一样指定操作要求。指定操作要求。u这类指令可以用在浮点数运算和指令可以用在浮点数运算和传送中,送中,ARM处理理器把数据器把数据传送送给协处理器,然后可以从理器,然后可以从协处理器理器读出出浮点数的浮点数的计算算结果。果。ARM 协处理器指令协处理器指令指令示例:指令示例:MCR P2,3,R2,C4,C5,6 ;该指令将指令将ARM处理器寄存器理器寄存器R0中的数据中的数据传送到送到协处理器理器P2的寄存器的寄存器C4和和C5中。具体中。具体实现是:指定是:指定协处理器理器P2执行第行第6种操作,操作数是种操作,操作数是C4和和C5,把操作,把操作结果果传送送给R2 。MRC P0,3,R
94、2,C4,C5,6 ;该指令将指令将协处理器理器P0的寄存器中的数据的寄存器中的数据传送到送到ARM处理器寄存器中。具体理器寄存器中。具体实现是:指定是:指定协处理器理器P0执行行第第3种操作,操作种操作,操作类型是型是6,操作数之一是,操作数之一是 R2,结果果放在放在C4中。中。ARM 软件中断指令软件中断指令uARM指令集中的指令集中的软件中断指令是唯一一条不使用寄件中断指令是唯一一条不使用寄存器的存器的ARM指令,也是一条可以条件指令,也是一条可以条件执行的指令。行的指令。因因为ARM指令在用指令在用户模式中受到很大的局限,有一模式中受到很大的局限,有一些些资源不能源不能够访问。u所以
95、,在需要所以,在需要访问这些些资源源时,使用使用软件控制的唯一件控制的唯一方法就是使用方法就是使用软件中断指令件中断指令SWI。ARM 软件中断指令软件中断指令SWI指令的格式指令的格式为: SWI条件条件 24位的立即数位的立即数 SWI指令指令用于用于产生生软件中断件中断,以便用,以便用户程序能程序能调用操作系用操作系统的系的系统例程。例程。 操作系操作系统在在SWI的异常的异常处理程序中提供相理程序中提供相应的系的系统服服务,指令中,指令中24位的立即数指定用位的立即数指定用户程序程序调用系用系统例程的例程的类型,相关参数通型,相关参数通过通用寄存器通用寄存器传递,当指令,当指令中中24
96、位的立即数被忽略位的立即数被忽略时,用,用户程序程序调用系用系统例程的例程的类型由通用寄存器型由通用寄存器R0的内容决定,同的内容决定,同时,参数通,参数通过其其他通用寄存器他通用寄存器传递。 ARM 软件中断指令软件中断指令指令示例:指令示例:SWI 0x02 ;实现中断,指明中断,指明调用用2号功能段。号功能段。 执行行SWI指令,指令,软件中断件中断进入的是管理模式,中断入的是管理模式,中断后会改后会改变程序状程序状态寄存器中的相关位。中断后寄存器中的相关位。中断后ARM处理器把理器把0x00000008赋给PC,并把中断,并把中断处地址保存在地址保存在LR中,同中,同时把把CPSR保存
97、在保存在SPSR中。中。Thumb指令集指令集u为兼容数据兼容数据总线宽度度为16位的位的应用系用系统,ARM体系体系结构除了支持构除了支持执行效率很高的行效率很高的32位位ARM指令集以外,指令集以外,同同时支持支持16位的位的Thumb指令集。指令集。uThumb指令集是指令集是ARM指令集的一个子集,允指令集的一个子集,允许指令指令编码为16位的位的长度。度。u与等价的与等价的32位代位代码相比相比较,Thumb指令集在保留指令集在保留32代代码优势的同的同时,大大的,大大的节省了系省了系统的存的存储空空间。Thumb指令集指令集Thumb指令集与指令集与ARM指令集在以下几个方面有指令
98、集在以下几个方面有区区别:u跳跳转指令。指令。条件跳条件跳转在范在范围上有更多的限制,上有更多的限制,转向子程序向子程序只具有无条件只具有无条件转移。移。u数据数据处理指令。理指令。对通用寄存器通用寄存器进行操作,操作行操作,操作结果需放入果需放入其中一个操作数寄存器,而不是第三个寄存器。其中一个操作数寄存器,而不是第三个寄存器。u单寄存器加寄存器加载和存和存储指令。指令。Thumb状状态下,下,单寄存器加寄存器加载和存和存储指令只能指令只能访问寄存器寄存器R0R7。u批量寄存器加批量寄存器加载和存和存储指令。指令。LDM和和STM指令可以将任何指令可以将任何范范围为R0R7的寄存器子集加的寄
99、存器子集加载或存或存储,PUSH和和POP指指令使用堆令使用堆栈指指针R13作作为基址基址实现满递减堆减堆栈,除,除R0R7外,外,PUSH指令指令还可以存可以存储链接寄存器接寄存器R14,并且,并且POP指令指令可以加可以加载程序指令程序指令PC。Thumb指令集指令集uThumb指令集没有包含指令集没有包含进行异常行异常处理理时需要的一需要的一些指令,因此,在异常中断些指令,因此,在异常中断时还是需要使用是需要使用ARM指令。指令。这种限制决定了种限制决定了Thumb指令不能指令不能单独使用独使用而需要与而需要与ARM指令配合使用。指令配合使用。uThumb数据数据处理指令、存理指令、存储
100、器器访问指令中的加指令中的加载/存存储指令使用方法和指令使用方法和ARM指令集中相指令集中相对应的指令的指令类似,本似,本节不做不做详细介介绍,仅对有区有区别的指令介的指令介绍。Thumb指令集指令集1. PUSH和和POP指令格式:指令格式:PUSH 低寄存器的全部或其子集低寄存器的全部或其子集POP 低寄存器的全部或其子集低寄存器的全部或其子集PUSH低寄存器的全部或其子集,低寄存器的全部或其子集,LRPOP 低寄存器的全部或其子集,低寄存器的全部或其子集,PC 这两条指令是两条指令是栈操作指令操作指令,用于在寄存器和堆,用于在寄存器和堆栈之之间进行成行成组的数据的数据传送,送,PUSH指
101、令用于把寄存器列表中的指令用于把寄存器列表中的寄存器数据推寄存器数据推进堆堆栈;POP指令用于把指令用于把栈区的数据区的数据弹出列出列表的寄存器中。表的寄存器中。Thumb指令集指令集u堆堆栈指指针是是隐含的地址基址,含的地址基址,Thumb指令中的堆指令中的堆栈是是满递减堆减堆栈,堆,堆栈向下增向下增长,堆,堆栈指指针总是指向最后是指向最后入入栈的数据。使用入的数据。使用入栈指令指令PUSH时,每,每传送一个数送一个数据,堆据,堆栈指指针就自就自动减减4;使用出;使用出栈指令指令POP时,每,每传送一个数据,堆送一个数据,堆栈指指针就自就自动加加4。uPOP 低寄存器的全部或其子集,低寄存器
102、的全部或其子集,PC这条指令引起条指令引起处理器理器转移到从堆移到从堆栈弹出出给PC的地址,的地址,这通常是从子通常是从子程序返回,其中程序返回,其中LR在子程序开在子程序开头压进堆堆栈。这些指些指令不影响条件令不影响条件码标志。志。Thumb指令集指令集指令示例:指令示例:PUSH R0,R4,R6;把;把R0、R4、R6的数据的数据顺序推序推进栈区区PUSH R4-R7,LR;把;把R4、R5、R6、R7、LR顺序入序入栈POP R0,R4,R6;把;把R0、R4、R6的数据的数据弹出出栈区区POP R0-R7,PC;恢复;恢复现场Thumb指令集指令集2. 分支指令分支指令(1)B指令指
103、令这是是Thumb指令集中唯一的有条件指令。指令集中唯一的有条件指令。指令格式指令格式为: B条件条件 目目标地址地址 若使用条件,若使用条件,则目目标地址必地址必须在当前指令的在当前指令的256+256字字节范范围内。若指令是无条件的,内。若指令是无条件的,则目目标地址必地址必须在在2KB范范围内。若条件内。若条件满足或不使用条件,足或不使用条件,则B指令引起指令引起处理器理器转移移到目到目标地址。目地址。目标地址必地址必须在指定限制内。在指定限制内。ARM链接器不接器不能增加代能增加代码来来产生更生更长的的转移。移。Thumb指令集指令集指令示例:指令示例:CMP R2,#0x20;比;比
104、较R2和和0x20BNE START;不相等;不相等时,即当,即当Z=0时,则跳跳转START ADD R3,R4;跳;跳转处Thumb指令集指令集(2)BL指令指令格式格式为: BL 目目标地址地址 BL指令是分支和指令是分支和链接指令,将下一条指令的接指令,将下一条指令的地址复制到地址复制到R14(链接寄存器),并引起接寄存器),并引起处理器理器转移到目移到目标地址,但目地址,但目标地址不可以是地址不可以是ARM指令。指令。BL指令不能指令不能转移到当前指令移到当前指令4MB以外的地址。以外的地址。Thumb指令集指令集指令示例:指令示例:BL START;分支跳;分支跳转ADD R3,R
105、4;分支的下一条指令;分支的下一条指令START ADD R0,R1;指令指令Thumb指令集指令集(3) BX格式格式为: BX 寄存器寄存器 BX指令是指令是分支和交分支和交换指令指令,寄存器的地址是目,寄存器的地址是目标地址,其中的位地址,其中的位0不是地址信息。不是地址信息。u当寄存器的位当寄存器的位0为1时,表明目,表明目标地址地址处是是Thumb指指令;令;u当寄存器的位当寄存器的位0为0时,表明目,表明目标地址地址处是是ARM指令,指令,此此时,要求字,要求字对准。准。Thumb指令集指令集指令示例:指令示例:CODE16;Thumb程序段程序段 ADRR0,ARM1 ;把;把标
106、号号ARM1处地址地址赋给R0 BICR0,#01;清;清R0的位的位0BX R0;跳;跳转到到ARM1指令集指令集LET1: CODE32ARM1: ADDR3,R4 ;ARM语句句ADR R0,LET+1;把;把LET1所在的地址所在的地址赋给R0,置,置R0的位的位0BX R0;跳;跳转到到ARM指令集指令集Thumb指令集指令集3. SWI指令指令指令格式:指令格式: SWI 立即数立即数 SWI指令指令为软件中断指令件中断指令,用于,用于产生生软件中断,即能件中断,即能够引起引起SWI异常。异常。这意味着意味着处理器状理器状态切切换到到ARM态;处理器模式切理器模式切换到管理模式,到管理模式,CPSR保存到管理模式的保存到管理模式的SPSR中,中,执行行转移到移到SWI向量地址。立即数要求是一个向量地址。立即数要求是一个8位的无符号数,范位的无符号数,范围是是0255之之间的整数。的整数。指令示例:指令示例:SWI 12;产生生软件中断,件中断,进入管理方式入管理方式时带入入;参数;参数12,作,作为SWI中断中断请求号求号