04 armthumbthumb2指令系统4学时3指令集分类详解_第1页
04 armthumbthumb2指令系统4学时3指令集分类详解_第2页
04 armthumbthumb2指令系统4学时3指令集分类详解_第3页
04 armthumbthumb2指令系统4学时3指令集分类详解_第4页
04 armthumbthumb2指令系统4学时3指令集分类详解_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

1、4.3 ARM指令集指令集 简单的简单的ARM程序程序 ;文件名:文件名:TEST1.S ;功能:实现两个寄存器相加功能:实现两个寄存器相加 ;说明:使用说明:使用ARMulate软件仿真调试软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段声明代码段Example1 ENTRY ;标识程序入口标识程序入口 CODE32 ;声明声明32位位ARM指令指令 START MOVR0,#0 ;设置参数设置参数 MOVR1,#10 LOOPBLADD_SUB ;调用子程序调用子程序ADD_SUB BLOOP ;跳转到跳转到LOOP ADD_SUB ADDSR0,R0,R1

2、 ;R0 = R0 + R1 MOVPC,LR ;子程序返回子程序返回 END ;文件结束文件结束 使用使用“;”进行注释进行注释 标号顶格写标号顶格写 实际代码段实际代码段 声明文件结束声明文件结束 简单的简单的ARM程序程序 ;文件名:文件名:TEST1.S ;功能:实现两个寄存器相加功能:实现两个寄存器相加 ;说明:使用说明:使用ARMulate软件仿真调试软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段声明代码段Example1 ENTRY ;标识程序入口标识程序入口 CODE32 ;声明声明32位位ARM指令指令 START MOVR0,#0 ;设置参

3、数设置参数 MOVR1,#10 LOOPBLADD_SUB ;调用子程序调用子程序ADD_SUB BLOOP ;跳转到跳转到LOOP ADD_SUB ADDSR0,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回子程序返回 END ;文件结束文件结束 ARMARM指令格式:指令格式: 4.3.1 指令格式指令格式 S , 其中其中号内的项是必须的,号内的项是必须的, 号内的项是可选的。号内的项是可选的。 各项的说明如下:各项的说明如下: opcode: 指令助记符;指令助记符; cond: 执行条件;执行条件; S: 是否影响是否影响CPSRCPSR寄存器的值;寄存器的值

4、; Rd: 目标寄存器;目标寄存器; Rn: 第第1 1个操作数的寄存器;个操作数的寄存器; operand2: 第第2 2个操作数;个操作数; ARMARM指令格式之指令格式之第第2个操作数个操作数: S , 第第2 2个源操作数格式个源操作数格式: : #immed_8r 常数表达式;常数表达式; Rm 寄存器方式;寄存器方式; Rm,shift 寄存器移位方式;寄存器移位方式; 第第2个操作数个操作数 #immed_8r 常数表达式常数表达式 例如:例如: MOVR0,#1 ANDR1,R2,#0 x0F 第第2个操作数个操作数 Rm Rm 寄存器方式寄存器方式 在寄存器方式下,操作数即

5、为寄存器的数值。在寄存器方式下,操作数即为寄存器的数值。 例如:例如: SUBR1,R1,R2 MOVPC,R0 第第2个操作数个操作数 Rm,shift Rm,shift 寄存器移位方式寄存器移位方式 将寄存器的移位结果作为操作数,但将寄存器的移位结果作为操作数,但RmRm值保持不变,值保持不变, 移位方法如下:移位方法如下: 操作码操作码说明说明操作码操作码说明说明 ASR #n算术右移算术右移n位位ROR #n循环右移循环右移n位位 LSL #n逻辑左移逻辑左移n位位RRX带扩展的循环右移带扩展的循环右移1位位 LSR #n逻辑右移逻辑右移n位位Type Rs Type为移位的一种类型,

6、为移位的一种类型,Rs 为偏移量寄存器,低为偏移量寄存器,低8位有效。位有效。 第第2个操作数个操作数 LSL移位操作:0 LSR移位操作: 0 ASR移位操作: ROR移位操作: RRX移位操作:C 第第2个操作数个操作数 Rm,shiftRm,shift寄存器移位方式寄存器移位方式 例如:例如: A D DR 1 , R 1 , R 1 , L S L # 3 ;R1=R1+R1*8=9R1 SUBR1,R1,R2,LSR R3;R1=R1- (R2/2R3) ARMARM指令格式之指令格式之条件码条件码 4.3.2 条件码条件码 S , 条件码条件码“cond” : : 实现高效的逻辑操

7、作。实现高效的逻辑操作。 所有的所有的ARMARM指令都可以条件执行,而指令都可以条件执行,而ThumbThumb指令只有指令只有B B(跳(跳 转)转)指令具有条件执行指令具有条件执行 功能。如果指令不标明条件代码,将功能。如果指令不标明条件代码,将 默认为默认为无条件(无条件(ALAL)执行。执行。 操作码操作码条件助记符条件助记符标志标志含义含义 0000EQZ=1相等相等 0001NEZ=0不相等不相等 0010CS/HSC=1无符号数大于或等于无符号数大于或等于 0011CC/LOC=0无符号数小于无符号数小于 0100MIN=1负数负数 0101PLN=0正数或零正数或零 0110

8、VSV=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任何任何从不执行从不执行(不要使用不要使用) 指令条件码表指令条件码表 条件码条件码 c c代码:代码: if(a b) a

9、+; else b+; 对应的汇编代码:对应的汇编代码: CMPR0,R1 ;R0与与R1比较比较 ADDHI R0,R0,#1 ;若若R0R1,则,则R0=R0+1 ADDLS R1,R1,#1 ;若若R0R1R1,则,则R1=R1+1R1=R1+1 示例:示例: 无条无条码码的汇编代码:的汇编代码: CMPR0,R1 B LSL1 ADDR0,R0,#1 B L2 L1 ADDR1,R1,#1 L2L2 4.3.3 存储器访问指令存储器访问指令 ARM ARM处理器是典型的处理器是典型的RISCRISC处理器,对存储器的访问只处理器,对存储器的访问只 能使用能使用加载和存储加载和存储指令实

10、现指令实现; ; ARM ARM处理器是冯处理器是冯诺依曼存储结构,程序空间、诺依曼存储结构,程序空间、RAMRAM空空 间及间及I/OI/O映射空间统一编址映射空间统一编址; ; 除对除对RAMRAM操作以外,对外围操作以外,对外围IOIO、程序数据的访问均要、程序数据的访问均要 通过加载通过加载/ /存储指令进行。存储指令进行。 存储器访问指令分为存储器访问指令分为单寄存器操作指令单寄存器操作指令和和多寄存器操作多寄存器操作 指令指令。 LDR/STR LDR/STR : : 字字(/ (/半字半字/ /字节字节) )加载加载/ /存储指令存储指令 LDRLDR指令用于从内存中读一字或字节

11、数据存入寄存器中指令用于从内存中读一字或字节数据存入寄存器中; ; STR STR指令用于将寄存器中的一字或字节数据保存到内存。指令用于将寄存器中的一字或字节数据保存到内存。 单寄存器存储操作单寄存器存储操作 LDRcondTLDRcondTRd,Rd, ; ;将指定地址上的字数据读入将指定地址上的字数据读入RdRd STRcondTSTRcondTRd,Rd, ; ;将将RdRd中的字数据存入指定地址中的字数据存入指定地址 LDRcondHTLDRcondHTRd,Rd, ; ;将指定地址上的将指定地址上的半半字数据读入字数据读入RdRd LDRcondSHTLDRcondSHTRd,Rd,

12、 ; ;将指定地址上的将指定地址上的半半字数据读入字数据读入RdRd STRcondHTSTRcondHTRd,Rd, ; ;将将RdRd中的中的半半字数据存入指定地址字数据存入指定地址 LDRcondBTLDRcondBTRd,Rd, ; ;将指定地址上的字节数据读入将指定地址上的字节数据读入RdRd LDRcondSBT LDRcondSBT Rd,Rd, ; ;将指定地址上的字节数据读入将指定地址上的字节数据读入RdRd STRcondBTSTRcondBTRd,Rd, ; ;将将RdRd中的字节数据存入指定地址中的字节数据存入指定地址 LDR/STR指令格式:指令格式: T T为可选后

13、缀为可选后缀; ; 带带T T指令,处理器只能在特权模式下执行指令,处理器只能在特权模式下执行; ; 带带T T指令在用户模式下无效指令在用户模式下无效, ,被忽略不执行。被忽略不执行。 助记符助记符说明说明操作操作条件码位置条件码位置 LDR Rd,addressing 加载字数加载字数 据据 RdRdaddressinaddressin gg,addressingaddressing 索引索引 LDRcondLDRcond LDRB Rd,addressing 加载无符加载无符 号字节数号字节数 据据 RdRdaddressinaddressin gg,addressingaddressi

14、ng 索引索引 LDRcondBLDRcondB LDRT Rd,addressing 以用户模以用户模 式加载字式加载字 数据数据 RdRdaddressinaddressin gg,addressingaddressing 索引索引 LDRcondTLDRcondT LDRBT Rd, addressing 以用户模以用户模 式加载无式加载无 符号字节符号字节 数据数据 RdRdaddressinaddressin gg,addressingaddressing 索引索引 LDRcondBLDRcondB T T LDRH Rd, addressing 加载无符加载无符 号半字数号半字数

15、据据 RdRdaddressinaddressin gg,addressingaddressing 索引索引 LDRcondHLDRcondH 单寄存器加载单寄存器加载 助记符助记符说明说明操作操作条件码位条件码位 置置 STR Rd, addressing 存储字数据存储字数据addressingaddressingR R d d, addressingaddressing索引索引 STRcondSTRcond STRB Rd,addressing 存储字节数存储字节数 据据 addressingaddressingR R d d, addressingaddressing索引索引 STRc

16、ondSTRcond B B STRT Rd,addressing 以用户模式以用户模式 存储字数据存储字数据 addressingaddressingR R d d, addressingaddressing索引索引 STRcondSTRcond T T STRBT Rd,addressing 以用户模式以用户模式 存储字节数存储字节数 据据 addressingaddressingR R d d, addressingaddressing索引索引 STRcondSTRcond BTBT STRH Rd,addressing 存储半字数存储半字数 据据 addressing addressi

17、ng RdRd, addressingaddressing索引索引 STRcondSTRcond H H 单寄存器存储单寄存器存储 LDR/STR LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、指令用于对内存变量的访问、内存缓冲区数据的访问、查表、 外围部件的控制操作等。若使用外围部件的控制操作等。若使用LDRLDR指令加载数据到指令加载数据到PCPC寄存器,则实现程寄存器,则实现程 序跳转功能,这样也就实现了程序散转。序跳转功能,这样也就实现了程序散转。 所有单寄存器加载所有单寄存器加载/ /存储指令可分为存储指令可分为“字和无符号字节加载存储指令字和无符号字节加载存储

18、指令”和和 “半字和有符号字节加载存储指令。半字和有符号字节加载存储指令。 LDR/STR指令指令 的的地址表达式地址表达式 地址表达式组成地址表达式组成: :有效地址有效地址 = 基地址基地址, (+/-) 偏移量偏移量 基址寄存器:基址寄存器: 可以是任一个通用寄存器可以是任一个通用寄存器 地址偏移量:地址偏移量: 可以是立即数、可以是立即数、regreg、reg shift #counterreg shift #counter 偏移量偏移量3 3种格式种格式: 立即数立即数: :立即数是一个无符号的数值。立即数是一个无符号的数值。 LDR R1,R0,LDR R1,R0,#0 x12#0

19、 x12 LDR R1 , R0,# - 0 x12 寄存器寄存器: : 寄存器中的数值寄存器中的数值 加加/ /减减 到基址寄存器,到基址寄存器,R2R2是是32b32b补码形式补码形式 LDR R1,R0,LDR R1,R0,R2R2 寄存器及移位常数寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,。寄存器移位后的值可以加到基址寄存器, 也可以从基址寄存器中减去这个数值。也可以从基址寄存器中减去这个数值。 LDR R1,R0,R2,LSL #2 STR/LDRSTR/LDR指令之指令之寻址方式寻址方式: 零偏移零偏移 :LDR Rd,Rn 前索引偏移:前索引偏移:LDR Rd,Rn,

20、#0 x04! ;Rn+0 x4-Rn,Rn-Rd LDR Rd,Rn,#0 x04 ; Rn+0 x4-Rd,基址不变,基址不变 程序相对偏移:程序相对偏移: LDR Rd,labe1 LDR Rd,PC,#labe1 后索引偏移:后索引偏移: LDR Rd,Rn,#0 x04 ;Rn-Rd,Rn+0 x4-Rn, ;操作后基地址发自动增加;操作后基地址发自动增加 注意注意:大多数情况下,必须保证字数据操作的地址是:大多数情况下,必须保证字数据操作的地址是3232位对齐的。位对齐的。 LDR/STRLDR/STR指令之指令之半字半字/ /字节操作字节操作 这类这类LDR/STRLDR/STR

21、指令可加载有符号半字或字节,可加载指令可加载有符号半字或字节,可加载/ /存储无符存储无符 号半字。偏移量格式、寻址方式与加载号半字。偏移量格式、寻址方式与加载/ /存储字和无符号字节指令存储字和无符号字节指令 相同。相同。 LDRcondSB Rd, ;将指定地址上的有符号字节读入将指定地址上的有符号字节读入Rd LDRcondSH Rd, ;将指定地址上的有符号半字读入将指定地址上的有符号半字读入Rd LDRcondH Rd, ;将指定地址上的半字数据读入将指定地址上的半字数据读入Rd STRcondH Rd, ;将将Rd中的半字数据存入指定地址中的半字数据存入指定地址 LDRLDR和和S

22、TRSTR指令应用示例:指令应用示例: 1. 1.加载加载/ /存储字和无符号字节指令存储字和无符号字节指令 LDRR2,R5;将将R5指向地址的字数据存入指向地址的字数据存入R2 STRR1,R0,#0 x04;将将R1的数据存储到的数据存储到R0+0 x04地址地址 LDRBR3,R2,#1 ;将将R2指向地址的字节数据存入指向地址的字节数据存入R3,R2R2+1 STRBR6,R7 ;将将R7指向地址的字节数据存入指向地址的字节数据存入R6 2.2.加载加载/ /存储半字和有符号字节指令存储半字和有符号字节指令 LDRSB R1,R0,R3;将将R0+R3地址上的字节数据存入地址上的字节

23、数据存入R1, ;高高24位用符号扩展位用符号扩展 LDRH R6,R2,#2;将将R2指向地址的半字数据存入指向地址的半字数据存入R6,高,高16位用位用0扩展扩展 ;读出后,读出后,R2=R2+2 STRH R1,R0,#2!;将将R1的半字数据保存到的半字数据保存到R0+2地址,地址, ;只修改低只修改低2字节数据,字节数据,R0=R0+2 注意注意: LDRSB Rd, ; LDRSH Rd, ; LDRH Rd, ; STRH Rd, ; 1. 1.有符号半字有符号半字/ /字节加载指令自动将字节加载指令自动将符号位加载扩展到符号位加载扩展到3232位位, 无符号半字无符号半字/ /

24、字节字节 加载指令加载指令用零扩展到用零扩展到3232位位; 2.2.半字读写的指定地址必须为半字读写的指定地址必须为偶数偶数,否则将产生不可靠的结果;,否则将产生不可靠的结果; 问:为什么问:为什么3232位指令无带符号加载指令?位指令无带符号加载指令? 为什么存储指令无带符号修饰?为什么存储指令无带符号修饰? 助记符助记符说明说明操作操作条件码位置条件码位置 LDMmode Rn!,reglist 多寄存器加多寄存器加 载载 reglistreglistRn.Rn., RnRn回写等回写等 LDMcondLDMcond modemode STMmode Rn!,reglist 多寄存器存多

25、寄存器存 储储 Rn.reglist,Rn.reglist, RnRn回写等回写等 STMcondSTMcond modemode 多寄存器存取多寄存器存取 多寄存器加载多寄存器加载/ /存储指令可以实现在一组寄存器和一块连续的内存单元之存储指令可以实现在一组寄存器和一块连续的内存单元之 间传输数据。间传输数据。LDMLDM为加载多个寄存器;为加载多个寄存器;STMSTM为存储多个寄存器。允许一条为存储多个寄存器。允许一条 指令传送指令传送1616个寄存器的任何子集或所有寄存器。它们主要用于现场保护、个寄存器的任何子集或所有寄存器。它们主要用于现场保护、 数据复制、常数传递等。数据复制、常数传

26、递等。 多寄存器存取多寄存器存取 多寄存器加载多寄存器加载/ /存储指令格式:存储指令格式: LDMcond Rn! , reglist STMcond Rn! , reglist cond :指令执行的条件;:指令执行的条件; 模式模式 :控制地址的增长方式,一共有:控制地址的增长方式,一共有8种模式;种模式; ! :表示在操作结束后,将最后的地址写回:表示在操作结束后,将最后的地址写回Rn中;中; reglist :表示寄存器列表,可以包含多个寄存器,:表示寄存器列表,可以包含多个寄存器, 它们使用它们使用 “ , ” 隔开,如隔开,如R1,R2,R6-R9, 寄存器寄存器由小到大排列由小

27、到大排列; : 含该后缀指令按下列含该后缀指令按下列 3 3种种 方式操作:方式操作: (1 1) 若寄存器列表不包含若寄存器列表不包含PCPC,加载加载/ /存储存储的是的是 用户模式用户模式下的寄存器内容,而不是当前模式的寄存器下的寄存器内容,而不是当前模式的寄存器; (2) 若寄存器列表包含若寄存器列表包含PC,加载加载/存储存储的是的是 当前模式当前模式下的寄存器内容;下的寄存器内容; (3 3) 加入加入 后缀的后缀的LDMLDM指令,且寄存器列表中包含有指令,且寄存器列表中包含有PCPC时使用,时使用, 除了正常的多寄存器传送外,还将除了正常的多寄存器传送外,还将SPSRSPSR也

28、拷贝到也拷贝到CPSRCPSR中,中, 这可用于这可用于异常处理返回异常处理返回。 注意注意: 后缀不允许在用户模式或系统模式下使用。后缀不允许在用户模式或系统模式下使用。 多寄存器存取多寄存器存取 多寄存器加载多寄存器加载/ /存储指令的存储指令的8 8种模式如下表所示,右边四种为堆栈种模式如下表所示,右边四种为堆栈 操作、左边四种为数据传送操作。操作、左边四种为数据传送操作。 模式模式说明说明 IAIA每次传送每次传送后后地址地址加加4 4 IBIB每次传送每次传送前前地址地址加加4 4 DADA每次传送每次传送后后地址地址减减4 4 DBDB每次传送每次传送前前地址地址减减4 4 模式模

29、式说明说明 FDFD满递减满递减堆栈堆栈 EDED空递减空递减堆栈堆栈 FAFA满递增满递增堆栈堆栈 EAEA空递增空递增堆栈堆栈 数据块传送操作数据块传送操作 STM/LDM方向完全相同方向完全相同 堆栈操作堆栈操作 (后缀描述的是后缀描述的是STM进栈进栈方向,与之匹方向,与之匹 配的配的LDM出栈正好相反出栈正好相反) I: increase D:decrease A: after B:before F:full E:empty D:decrease A:advance 进行数据复制时,进行数据复制时, 先设置好源数据指针和目标指针,先设置好源数据指针和目标指针, 然后使用块拷贝寻址指令

30、然后使用块拷贝寻址指令 LDMIA/STMIALDMIA/STMIA、LDMIB/STMIBLDMIB/STMIB、LDMDA/STMDALDMDA/STMDA、LDMDB/STMDBLDMDB/STMDB 进行读取和存储进行读取和存储 。 进行堆栈操作操作时,进行堆栈操作操作时, 要先设置堆栈指针(要先设置堆栈指针(SPSP),), 然后使用堆栈寻址指令然后使用堆栈寻址指令 STMFD/LDMFD STMFD/LDMFD 、STMED/LDMEDSTMED/LDMED、STMFA/LDMFASTMFA/LDMFA和和STMEA/LDMEASTMEA/LDMEA 实现堆栈操作。实现堆栈操作。

31、多寄存器存储多寄存器存储 数据块传送指令操作过程:数据块传送指令操作过程: 其中其中R1R1为指令执行前的基址寄为指令执行前的基址寄 存器,存器,R1R1则为指令执行后的基则为指令执行后的基 址寄存器。址寄存器。 R5R5 R6R6 R7R7 R1 R1 R1R1 STMIA R1!,R5-R7 STMEA R1!,R5-R7 4008H4008H 4004H4004H 4000H4000H 4014H4014H 4010H4010H 400CH400CH R5R5 R6R6 R7R7R1 R1 R1R1 STMDA R1!,R5-R7 STMED R1!,R5-R7 4008H4008H 4

32、004H4004H 4000H4000H 4014H4014H 4010H4010H 400CH400CH R5R5 R6R6 R7R7 R1 R1 R1R1 STMIB R1!,R5-R7 STMFA R1!,R5-R7 4008H4008H 4004H4004H 4000H4000H 4014H4014H 4010H4010H 400CH400CH R5R5 R6R6 R7R7 R1R1 R1 R1 STMDB R1!,R5-R7 STMFD R1!,R5-R7 4008H4008H 4004H4004H 4000H4000H 4014H4014H 4010H4010H 400CH400C

33、H 数据块传数据块传 送送 存储存储 堆栈操作堆栈操作 压栈压栈 说明说明 STMDASTMED空递减空递减 STMIASTMEA空递增空递增 STMDBSTMFD满递减满递减 STMIBSTMFA满递增满递增 R5R5 R6R6 R7R7 R1 R1 R1R1 LDMLDMIAIA R1!,R5-R7 R1!,R5-R7 LDMFD R1!,R5-R7 4008H4008H 4004H4004H 4000H4000H 4014H4014H 4010H4010H 400CH400CH R5R5 R6R6 R7R7R1 R1 - R1R1 LDMLDMDADA R1!,R5-R7 R1!,R5-

34、R7 LDMFA R1!,R5-R7 4008H4008H 4004H4004H 4000H4000H 4014H4014H 4010H4010H 400CH400CH R5R5 R6R6 R7R7 R1 R1 R1R1 LDMIB R1!,R5-R7 LDMED R1!,R5-R7 4008H4008H 4004H4004H 4000H4000H 4014H4014H 4010H4010H 400CH400CH R5R5 R6R6 R7R7 R1R1 R1 R1 LDMDB R1!,R5-R7 LDMEA R1!,R5-R7 4008H4008H 4004H4004H 4000H4000H

35、4014H4014H 4010H4010H 400CH400CH 数据块传送数据块传送 加载加载 堆栈操作堆栈操作 出栈出栈 说明说明 LDMDALDMFA满递减满递减 LDMIALDMFD满递增满递增 LDMDBLDMEA空递减空递减 LDMIBLDMED空递增空递增 堆栈操作和数据块传送指令堆栈操作和数据块传送指令 类似,也有类似,也有4 4种模式,它们之种模式,它们之 间的关系如下表所示:间的关系如下表所示: 多寄存器读取多寄存器读取 ;使用数据块传送指令进行使用数据块传送指令进行 堆栈操作堆栈操作 STMDAR0!,R5-R6 . . . LDMIBR0!,R5-R6 ; ;使用堆栈指

36、令进行堆栈使用堆栈指令进行堆栈 操作操作 STMSTMEDED R0!,R5-R6R0!,R5-R6 . . . . . LDMLDMEDED R0!,R5-R6R0!,R5-R6 两段代码的执行结果是一样的,但是使用堆栈指令的两段代码的执行结果是一样的,但是使用堆栈指令的 压栈和出栈操作编程很简单(只要前后一致即可),而使压栈和出栈操作编程很简单(只要前后一致即可),而使 用数据块指令进行压栈和出栈操作则需要考虑空与满、加用数据块指令进行压栈和出栈操作则需要考虑空与满、加 与减对应的问题。与减对应的问题。 助记符助记符说明说明操作操作条件码位置条件码位置 SWP Rd,Rm,Rn SWP R

37、d,Rm,Rn 寄存器和存储器字寄存器和存储器字 数据交换数据交换 RdRnRdRn,RnRm RnRm (RnRd(RnRd或或Rm)Rm) SWPcondSWPcond SWPB Rd,Rm,Rn SWPB Rd,Rm,Rn 寄存器和存储器字寄存器和存储器字 节数据交换节数据交换 RdRnRdRn,RnRm RnRm (RnRd(RnRd或或Rm)Rm) SWPcondBSWPcondB 寄存器和存储器交换指令寄存器和存储器交换指令 SWP SWP 指令指令格式:指令指令格式: SWPcondB Rd,Rm,Rn;SWPcondB Rd,Rm,Rn; ; 用于将一个内存单元(该单元地址放在

38、寄存器Rn中)的内容读取到一个寄 存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。使用 SWP可实现信号量操作。 B B 为可选后缀,若有为可选后缀,若有B B,则交换字节,否则交换,则交换字节,否则交换3232位字;位字; Rd Rd 用于保存从存储器中读入的数据;用于保存从存储器中读入的数据; Rm Rm 的数据用于存储到存储器中,若的数据用于存储到存储器中,若RmRm与与RnRn相同,相同, 则为寄存器与存储器内容进行交换;则为寄存器与存储器内容进行交换; Rn Rn 为要进行数据交换的存储器地址,为要进行数据交换的存储器地址,RnRn不能与不能与RdRd和和RmRm相同。相

39、同。 寄存器和存储器交换指令寄存器和存储器交换指令 SWP SWP指令应用示例:指令应用示例: SWP R1,R1,R0 ; ;将将R1R1的内容与的内容与R0R0指向的存储单元的内容进指向的存储单元的内容进 行交换行交换 SWPB R1,R2,R0; ;将将R0R0指向的存储单元内的容读取一字节数据到指向的存储单元内的容读取一字节数据到R1R1中中 ; ;( (高高2424位清零位清零) ),并将,并将R2R2的内容写入到该内存单元中的内容写入到该内存单元中 ; ;( (最低字节有效最低字节有效) ) 4.3.4 ARM4.3.4 ARM数据处理指令数据处理指令 数据处理指令大致可分为数据处

40、理指令大致可分为4 4类:类: 数据传送指令;数据传送指令; 算术算术运算指令运算指令 逻辑运算指令;逻辑运算指令; 比较指令。比较指令。 数据处理指令只能对寄存器的内容进行操作,数据处理指令只能对寄存器的内容进行操作, 而不能对内存中的数据进行操作。所有而不能对内存中的数据进行操作。所有ARMARM数据处数据处 理指令均可选择使用理指令均可选择使用S S后缀,并影响状态标志。后缀,并影响状态标志。 数据处理指令编码数据处理指令编码 带进位加法带进位加法ADCADC01010101 带进位减法指令带进位减法指令SBCSBC01100110 带进位逆向减法指令带进位逆向减法指令RSCRSC011

41、10111 位测试指令位测试指令TSTTST10001000 相等测试指令相等测试指令TEQTEQ10011001 比较指令比较指令CMPCMP10101010 负数比较指令负数比较指令CMNCMN10111011 逻辑或操作指令逻辑或操作指令ORRORR11001100 数据传送数据传送MOVMOV11011101 位清除指令位清除指令BICBIC11101110 数据非传送数据非传送MVNMVN11111111 加法运算指令加法运算指令ADDADD01000100 逆向减法指令逆向减法指令RSBRSB00110011 减法运算指令减法运算指令SUBSUB00100010 逻辑异或操作指令逻

42、辑异或操作指令EOREOR00010001 逻辑与操作指令逻辑与操作指令ANDAND00000000 说明说明指令助记符指令助记符操作码操作码 opcode操作码功能表操作码功能表 数据传送指令数据传送指令 算术运算指令算术运算指令 逻辑运算指令逻辑运算指令 比较指令与测试指令比较指令与测试指令 助记符助记符说明说明操作操作条件码位置条件码位置 MOV Rd,operand2MOV Rd,operand2 数据传送数据传送RdRdoperand2 operand2 MOVcondSMOVcondS MVN Rd,operand2MVN Rd,operand2 数据非传数据非传 送送 RdRd(

43、operand2)(operand2)MVNcondSMVNcondS 数据传送指令格式数据传送指令格式 MOV指令格式:指令格式: MOVcondS Rd,operand2 ;将将 8位立即数位立即数/寄存器寄存器 传送到传送到 目标寄存器(目标寄存器(Rd),), ;可用于移位运算等操作,可用于移位运算等操作, MOV指令示例:指令示例: MOVR1,#0 x10;R1=0 x10 MOVR0,R1;R0=R1 MOVSR3,R1,LSL #2;R3=R12,并影响标志位,并影响标志位 MOVPC,LR;PC=LR,子程序返回,子程序返回 MVN指令格式:指令格式: MVNcondS Rd

44、,operand2 ; 将将 8立即数立即数 ; 或或 寄存器(寄存器(operand2)按位取反)按位取反 , 送送Rd中中, ; 可以装载范围更广的立即数可以装载范围更广的立即数 MVN指令示例:指令示例: MVNR1,#0 xFF;R1=0 xFFFFFF00 MVNR1,R2;将将R2取反,结果存到取反,结果存到R1 助记符助记符说明说明操作操作条件码位置条件码位置 ADD Rd, Rn, operand2ADD Rd, Rn, operand2加法运算指令加法运算指令RdRdRn+operand2Rn+operand2ADDcondSADDcondS SUB Rd, Rn, oper

45、and2SUB Rd, Rn, operand2减法运算指令减法运算指令RdRdRn-operand2Rn-operand2SUBcondSSUBcondS RSB Rd, Rn, operand2RSB Rd, Rn, operand2逆向减法指令逆向减法指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondS ADC Rd, Rn, operand2ADC Rd, Rn, operand2带进位加法带进位加法RdRdRn+operand2+CarryRn+operand2+CarryADCcondSADCcondS SBC Rd, Rn, operand2S

46、BC Rd, Rn, operand2带进位减法指令带进位减法指令 RdRdRn-operand2-Rn-operand2- (NOT)Carry(NOT)Carry SBCcondSSBCcondS RSC Rd, Rn, operand2RSC Rd, Rn, operand2 带进位逆向减法带进位逆向减法 指令指令 RdRdoperand2-Rn-operand2-Rn- (NOT)Carry(NOT)Carry RSCcondSRSCcondS 算术运算指令格式算术运算指令格式 SUB SUB 指令格式:指令格式: SUBcondS Rd,Rn,operand2 ;用寄存器用寄存器Rn

47、减去减去operand2,结果保存到,结果保存到Rd中。中。 应用示例:应用示例: SUBSR0,R0,#1;R0=R0-1 ;R0=R0-1 ,并影响标志位,并影响标志位 SUBSR2,R1,R2;R2=R1-R2;R2=R1-R2 ,并影响标志位,并影响标志位 ADD ADD 指令格式:指令格式: ADDcondS Rd,Rn,operand2 ; ;将将 operand2的值与的值与Rn的值相加,结果保存到的值相加,结果保存到Rd寄存器。寄存器。 应用示例:应用示例: ADDS R1,R1,#1;R1=R1+1;R1=R1+1,并影响标志位,并影响标志位 ADD R1,R1,R2;R1=

48、R1+R2;R1=R1+R2 RSBRSB逆向减法指令格式:逆向减法指令格式: RSBcondS Rd,Rn,operand2; ;将将operand2operand2的值减去的值减去RnRn,结果保存到,结果保存到RdRd中中 应用示例:应用示例: RSB R3,R1,#0 xFF00;R3=0 xFF00-R1;R3=0 xFF00-R1 RSBS R1,R2,R2,LSL #2;R1=(R22)-R2=R2;R1=(R22)-R2=R23 3 ADCADC带进位加法指令格式:带进位加法指令格式: ADCcondS Rd,Rn,operand2 ;将将operand2operand2的值与

49、的值与RnRn的值相加,再加上的值相加,再加上CPSRCPSR中的中的C C条件标志位,条件标志位, ; ;结果保存到结果保存到RdRd寄存器。寄存器。 应用示例:应用示例: ADDS R0,R0,R2 ;R0;R0等于低等于低3232位相加,并影响标志位位相加,并影响标志位 ADC R1,R1,R3;R1;R1等于高等于高3232位相加,并加上低位进位位相加,并加上低位进位 SBC SBC 带进位减法指令格式:带进位减法指令格式: SBCcondS Rd,Rn,operand2 ;用寄存器用寄存器Rn减去减去operand2,再减去,再减去CPSR中的中的 ;C条件标志位的非条件标志位的非(

50、即若即若C标志清零,则结果减去标志清零,则结果减去1), ;结果保存到结果保存到Rd中。中。 应用示例:应用示例: SUBS R0,R0,R2 ; 低低3232位相减,并影响标志位位相减,并影响标志位 SBC R1,R1,R3 ; ;高高3232位相减,并减去低位位相减,并减去低位 借位借位 RSC RSC 带进位逆向减法指令格式:带进位逆向减法指令格式: RSCcondS Rd,Rn,operand2; ;指令用寄存器指令用寄存器operand2operand2减去减去RnRn,再减去,再减去CPSRCPSR中的中的 ;C;C条件标志位,结果保存到条件标志位,结果保存到RdRd中。中。 应用

51、示例(使用应用示例(使用RSCRSC指令实现求指令实现求6464位数值的负数位数值的负数 ):): RSBS R2,R0,#0 RSC R3,R1,#0 助记符助记符说明说明操作操作条件码位置条件码位置 AND Rd, Rn, operand2AND Rd, Rn, operand2逻辑与操作指令逻辑与操作指令RdRdRn ;指令将指令将operand2operand2的值与寄存器的值与寄存器RnRn的值按位作逻辑的值按位作逻辑“或或”操作,操作, ; ;结果保存到结果保存到RdRd中。中。 应用示例:应用示例: ORR R0,R0,#0 x0F; ;将将R0R0的低的低4 4位置位置1 1

52、MOVR1,R2,LSR #24 ; ;使用使用ORRORR指令将指令将R2R2的高的高8 8位位 ORRR3,R1,R3,LSL #8; ;数据移入到数据移入到R3R3低低8 8位中位中 AND AND 逻辑与操作指令格式:逻辑与操作指令格式: ANDcondS Rd,Rn,operand2; ; ;将将operand2operand2的值与寄存器的值与寄存器RnRn的值按位作逻辑的值按位作逻辑“与与”操作,操作, ; ;结果保存到结果保存到RdRd中。中。 应用示例:应用示例: ANDS R0,R0,#0 x01 ;R0=R0R0=R0R2=R1R2=R1将将operand2的值与寄存器的

53、值与寄存器Rn的值按位作的值按位作 ;逻辑逻辑“异或异或”操作操作,结果保存到结果保存到Rd中。中。 应用示例:应用示例: EORR1,R1,#0 x0F; ;将将R1R1的低的低4 4位取反位取反 EOR R2,R1,R0;R2=R1R0;R2=R1R0 EORSR0,R5,#0 x01 将将R5R5和和0 x010 x01进行逻辑异或,进行逻辑异或, ; ;结果保存到结果保存到R0R0,并影响标志位,并影响标志位 BIC BIC 位清除指令格式:位清除指令格式: BICcondS Rd,Rn, operand2 将寄存器将寄存器RnRn的值与的值与operand2operand2的值的反码

54、的值的反码 按位作逻辑按位作逻辑“与与”操作,结果保存到操作,结果保存到RdRd中中. . 应用示例:应用示例: BIC R1,R1,#0 x0F ; ;将将R1R1的低的低4 4位清零,其它位不变位清零,其它位不变 BICR1,R2,R3 ; ;将将R3R3的反码和的反码和R2R2相逻辑相逻辑“与与”, ; ;结果保存到结果保存到R1R1中中 助记符助记符说明说明操作操作条件码位置条件码位置 CMP Rn, operand2CMP Rn, operand2比较指令比较指令 标志标志N N、Z Z、C C、V VRn-Rn- operand2operand2 CMPcondCMPcond CM

55、N Rn, operand2CMN Rn, operand2负数比较指令负数比较指令 标 志标 志 N N 、 Z Z 、 C C 、 V VRn+operand2Rn+operand2 CMNcondCMNcond TST Rn, operand2TST Rn, operand2位测试指令位测试指令 标志标志N N、Z Z、C C、V VRn R1; R1与与1010比较,设置相关标志位比较,设置相关标志位 CMPR1,R2; ; R1R1与与R2R2比较,设置相关标志位比较,设置相关标志位 注意注意:CMPCMP指令与指令与SUBSSUBS指令的区别在于指令的区别在于CMPCMP指令不保存

56、运算结果。在指令不保存运算结果。在 进行两个数据的大小判断时,常用进行两个数据的大小判断时,常用CMPCMP指令及相应的条件码来操作。指令及相应的条件码来操作。 CMN CMN 负数比较指令格式:负数比较指令格式: CMNcondRn, operand2 使用寄存器使用寄存器RnRn的值加上的值加上operand2operand2的值,根据操作的结果更新的值,根据操作的结果更新CPSRCPSR中中 的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。 应用示例:应用示例: CMNR0,#1 ; R0+1; R0+1

57、,判断,判断R0R0是否为是否为1 1的补码的补码 ; ;如果是,则设置如果是,则设置Z Z标志位标志位 注意注意:CMNCMN指令与指令与ADDSADDS指令的区别在于指令的区别在于CMNCMN指令不保存运算结果指令不保存运算结果. . TST TST 位测试指令格式:位测试指令格式: TSTcond Rn, operand2 将寄存器将寄存器RnRn的值与的值与operand2operand2的值按位作逻辑的值按位作逻辑“与与”操作,根据操作操作,根据操作 的结果更新的结果更新CPSRCPSR中的相应条件标志位,以便后面的指令根据相应的条件标中的相应条件标志位,以便后面的指令根据相应的条件

58、标 志来判断是否执行。志来判断是否执行。 应用示例应用示例: TSTR0,#0 x01; ; 判断判断R0R0的最低位是否为的最低位是否为0 0 TSTR1,#0 x0F; ; 判断判断R1R1的低的低4 4位是否为位是否为0 0 注意注意:TSTTST指令与指令与ANDSANDS指令的区别在于指令的区别在于TSTTST指令不保存运算结果。指令不保存运算结果。TSTTST 指令通常与指令通常与EQEQ、NENE条件码配合使用,当所有测试位均为条件码配合使用,当所有测试位均为0 0时,时,EQEQ有效,有效, 而只要有一个测试位不为而只要有一个测试位不为0 0,则,则NENE有效。有效。 TEQ

59、 TEQ 相等测试指令格式:相等测试指令格式: TEQcond Rn, operand2TEQcond Rn, operand2 指令将寄存器指令将寄存器RnRn的值与的值与operand2operand2的值按位作逻辑的值按位作逻辑“异或异或”操作,根据操操作,根据操 作的结果更新作的结果更新CPSRCPSR中的相应条件标志位,以便后面的指令根据相应的条件标中的相应条件标志位,以便后面的指令根据相应的条件标 志来判断是否执行。志来判断是否执行。 应用示例:应用示例: TEQR0,R1; ; 比较比较R0R0与与R1R1是否相等是否相等 ( (不影响不影响V V位和位和C C位位) ) 注意注

60、意:TEQTEQ指令与指令与EORSEORS指令的区别在于指令的区别在于TEQTEQ指令不保存运算结果。使用指令不保存运算结果。使用 TEQTEQ进行相等测试时,常与进行相等测试时,常与EQEQ、NENE条件码配合使用。当两个数据相等时,条件码配合使用。当两个数据相等时, EQEQ有效;否则有效;否则NENE有效。有效。 4.3.5 乘法指令乘法指令 ARM7TDMIARM7TDMI具有三种乘法指令,分别为:具有三种乘法指令,分别为: 32323232位乘法指令;位乘法指令; 3232 32 32位乘加指令;位乘加指令; 3232 32 32位结果为位结果为6464位的乘位的乘/ /乘加指令。

温馨提示

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

评论

0/150

提交评论