《ARM指系统课件》由会员分享,可在线阅读,更多相关《ARM指系统课件(200页珍藏版)》请在金锄头文库上搜索。
1、第第3章章 ARM指令系统指令系统第第3章章 ARM指令系统指令系统主要内容主要内容3.1 ARM3.1 ARM指令结构指令结构指令结构指令结构3.2 ARM3.2 ARM寻址方式寻址方式寻址方式寻址方式3.3 ARM3.3 ARM指令集指令集指令集指令集3.4 Thumb3.4 Thumb指令集指令集指令集指令集3.5 ARM3.5 ARM伪指令伪指令伪指令伪指令3.6 ARM3.6 ARM汇编语言程序设汇编语言程序设汇编语言程序设汇编语言程序设计计计计3.1 ARM指令系统概述指令系统概述主要内容主要内容一、指令系统概念一、指令系统概念一、指令系统概念一、指令系统概念 二、二、二、二、AR
2、MARMARMARM指令的特点指令的特点指令的特点指令的特点三、三、三、三、ARMARMARMARM指令的格式指令的格式指令的格式指令的格式四、指令的条件码四、指令的条件码四、指令的条件码四、指令的条件码3.1 ARM指令系统概述指令系统概述一、指令系统概念一、指令系统概念一、指令系统概念一、指令系统概念 指令:指令:指令:指令:是规定计算机进行某种操作的命令。是规定计算机进行某种操作的命令。是规定计算机进行某种操作的命令。是规定计算机进行某种操作的命令。 指令系统:指令系统:指令系统:指令系统:计算机能够执行的各种指令的集合。计算机能够执行的各种指令的集合。计算机能够执行的各种指令的集合。计
3、算机能够执行的各种指令的集合。二、二、二、二、ARMARMARMARM指令的特点指令的特点指令的特点指令的特点 所有指令都是所有指令都是所有指令都是所有指令都是32323232位的。位的。位的。位的。 大多数指令都在单周期内完成。大多数指令都在单周期内完成。大多数指令都在单周期内完成。大多数指令都在单周期内完成。 所有指令都可以条件执行。所有指令都可以条件执行。所有指令都可以条件执行。所有指令都可以条件执行。 ARMARMARMARM指令为指令为指令为指令为load/storeload/storeload/storeload/store类型。类型。类型。类型。 基本指令仅基本指令仅基本指令仅基
4、本指令仅36363636条,分成五类。条,分成五类。条,分成五类。条,分成五类。 有有有有7 7 7 7种寻址方式。种寻址方式。种寻址方式。种寻址方式。 指令集可以通过协处理器扩展。指令集可以通过协处理器扩展。指令集可以通过协处理器扩展。指令集可以通过协处理器扩展。 ARMARMARMARM指令是加载指令是加载指令是加载指令是加载/ / / /存储存储存储存储(Load/Store)(Load/Store)(Load/Store)(Load/Store)型:型:型:型:也即指令集仅能处理寄存器中的数据,而且处也即指令集仅能处理寄存器中的数据,而且处也即指令集仅能处理寄存器中的数据,而且处也即指
5、令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问理结果都要放回寄存器中,而对系统存储器的访问理结果都要放回寄存器中,而对系统存储器的访问理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载则需要通过专门的加载则需要通过专门的加载则需要通过专门的加载/ / / /存储指令来完成。存储指令来完成。存储指令来完成。存储指令来完成。 ARMARMARMARM指令可以分为五大类:指令可以分为五大类:指令可以分为五大类:指令可以分为五大类:数据处理指令、存储器访问指令、分支指令、数据处理指令、存储器访问指令、分支指令、数据处理指令、存储器访问指令、分支指令、数据处
6、理指令、存储器访问指令、分支指令、协处理器指令、杂项指令。协处理器指令、杂项指令。协处理器指令、杂项指令。协处理器指令、杂项指令。 ARMARMARMARM指令有指令有指令有指令有7 7 7 7种寻址方式:种寻址方式:种寻址方式:种寻址方式:立即寻址、寄存器寻址、寄存器间接寻址、基立即寻址、寄存器寻址、寄存器间接寻址、基立即寻址、寄存器寻址、寄存器间接寻址、基立即寻址、寄存器寻址、寄存器间接寻址、基址寻址、堆栈寻址址寻址、堆栈寻址址寻址、堆栈寻址址寻址、堆栈寻址 、块拷贝寻址、相对寻址。、块拷贝寻址、相对寻址。、块拷贝寻址、相对寻址。、块拷贝寻址、相对寻址。三、三、ARMARM指令的格式指令的
7、格式ARMARMARMARM指令基本的语法格式为:指令基本的语法格式为:指令基本的语法格式为:指令基本的语法格式为: ssss , , , , , , , , OpcodeOpcodeOpcodeOpcode:指令操作码。指令操作码。指令操作码。指令操作码。 condcondcondcond:指令的条件码。:指令的条件码。:指令的条件码。:指令的条件码。 S S S S:决定指令的操作是否影响:决定指令的操作是否影响:决定指令的操作是否影响:决定指令的操作是否影响cpsrcpsrcpsrcpsr的值。的值。的值。的值。 RnRnRnRn:目标寄存器编码。目标寄存器编码。目标寄存器编码。目标寄存
8、器编码。 RdRdRdRd:包含第一个操作数的寄存器编码。包含第一个操作数的寄存器编码。包含第一个操作数的寄存器编码。包含第一个操作数的寄存器编码。 Operand2Operand2Operand2Operand2:第:第:第:第2 2 2 2操作数。操作数。操作数。操作数。ARMARMARMARM指令典型的编码格式为:指令典型的编码格式为:指令典型的编码格式为:指令典型的编码格式为:(数据处理指令类)(数据处理指令类)(数据处理指令类)(数据处理指令类)CondOpcodeSRnRdOperand2011121516192021242527283178 例:例:ADDS R2,R1,#1SU
9、BNES R2,R1,#0x20LDR R0,R1四、指令的条件码四、指令的条件码 条条条条件件件件码码码码的的的的位位位位数数数数和和和和位位位位置置置置:每每每每条条条条ARMARMARMARM指指指指令令令令包包包包含含含含4 4 4 4位位位位条条条条件件件件码码码码域域域域,它它它它占占占占用用用用指指指指令令令令编编编编码码码码的的的的最最最最高高高高四四四四位位位位31313131:28282828。 条条条条件件件件码码码码的的的的表表表表示示示示:条条条条件件件件编编编编码码码码共共共共 2 2 2 24 4 4 4 16 16 16 16 种种种种,其其其其中中中中,151
10、51515种种种种用用用用于于于于指指指指令令令令的的的的条条条条件件件件码码码码。每每每每种种种种条条条条件件件件码码码码用用用用2 2 2 2个个个个英英英英文文文文缩缩缩缩写字符表示。(见写字符表示。(见写字符表示。(见写字符表示。(见P47 P47 P47 P47 表表表表2-62-62-62-6) 带带带带条条条条件件件件指指指指令令令令的的的的执执执执行行行行:ARMARMARMARM处处处处理理理理器器器器根根根根据据据据指指指指令令令令的的的的执执执执行条件是否满足,决定当前指令是否执行。行条件是否满足,决定当前指令是否执行。行条件是否满足,决定当前指令是否执行。行条件是否满足
11、,决定当前指令是否执行。只只只只有有有有在在在在cpsrcpsrcpsrcpsr中中中中的的的的条条条条件件件件标标标标志志志志位位位位满满满满足足足足指指指指定定定定的的的的条条条条件件件件时时时时,指指指指令令令令才才才才会会会会被被被被执执执执行行行行。不不不不符符符符合合合合条条条条件件件件的的的的代代代代码码码码依依依依然然然然占占占占用用用用一一一一个个个个时钟周期(相当于一个时钟周期(相当于一个时钟周期(相当于一个时钟周期(相当于一个NOPNOPNOPNOP指令)。指令)。指令)。指令)。 条条条条件件件件码码码码的的的的书书书书写写写写方方方方法法法法:条条条条件件件件码码码码
12、的的的的位位位位置置置置在在在在指指指指令令令令助助助助记记记记符的后面(因此也称为条件后缀)。符的后面(因此也称为条件后缀)。符的后面(因此也称为条件后缀)。符的后面(因此也称为条件后缀)。例如:例如:例如:例如: MOVMOVMOVMOVEQEQEQEQ R0, R1 R0, R1 R0, R1 R0, R1指令条件码表指令条件码表指令条件码表指令条件码表条件码条件码条件码条件码助记符助记符助记符助记符含含含含 义义义义标标标标 志志志志00000000EQEQ相等相等相等相等Z=1Z=100010001NENE不相等不相等不相等不相等Z=0Z=000100010CS/HSCS/HS无符号
13、数大于或等于无符号数大于或等于无符号数大于或等于无符号数大于或等于C=1C=100110011CC/LOCC/LO无符号数小于无符号数小于无符号数小于无符号数小于C=0C=001000100MIMI负数负数负数负数N=1N=101010101PIPI非负数非负数非负数非负数N=0N=001100110VSVS溢出溢出溢出溢出V=1V=101110111VCVC没有溢出没有溢出没有溢出没有溢出V=0V=010001000HIHI无符号数大于无符号数大于无符号数大于无符号数大于C=1C=1且且且且Z=0Z=010011001LSLS无符号数小于或等于无符号数小于或等于无符号数小于或等于无符号数小于
14、或等于C=0C=0或或或或Z=1Z=110101010GEGE有符号数大于或等于有符号数大于或等于有符号数大于或等于有符号数大于或等于N=VN=V10111011LTLT有符号数小于有符号数小于有符号数小于有符号数小于N!=VN!=V11001100GTGT有符号数大于有符号数大于有符号数大于有符号数大于Z=0Z=0且且且且N=VN=V11011101LELE有符号数小于或等于有符号数小于或等于有符号数小于或等于有符号数小于或等于Z=1Z=1或或或或N!=VN!=V11101110ALAL无条件执行无条件执行无条件执行无条件执行任意任意任意任意11111111保留保留保留保留v5v5以下版本总
15、执行以下版本总执行以下版本总执行以下版本总执行,v5,v5及以上版本有用及以上版本有用及以上版本有用及以上版本有用3.2 ARM寻址方式寻址方式主要内容主要内容一、一、立即寻址立即寻址二、寄存器寻址二、寄存器寻址三、寄存器间接寻址三、寄存器间接寻址四、基址寻址四、基址寻址五、堆栈寻址五、堆栈寻址 六、块拷贝寻址六、块拷贝寻址七、相对寻址七、相对寻址3.2 ARM寻址方式寻址方式寻址方式:处理器根据指令中给出的(地址)寻址方式:处理器根据指令中给出的(地址)寻址方式:处理器根据指令中给出的(地址)寻址方式:处理器根据指令中给出的(地址)信息,寻找操作数(物理地址)的方式。信息,寻找操作数(物理地
16、址)的方式。信息,寻找操作数(物理地址)的方式。信息,寻找操作数(物理地址)的方式。我们将我们将我们将我们将ARMARMARMARM指令系统的寻址方式分为指令系统的寻址方式分为指令系统的寻址方式分为指令系统的寻址方式分为7 7 7 7种(有种(有种(有种(有分为分为分为分为9 9 9 9种的等)。种的等)。种的等)。种的等)。3.2.1 立即寻址立即寻址立即寻址也叫立即数寻址。立即寻址也叫立即数寻址。立即寻址也叫立即数寻址。立即寻址也叫立即数寻址。立即寻址概念:立即寻址概念:立即寻址概念:立即寻址概念:操作数本身就在指令中给出,只操作数本身就在指令中给出,只操作数本身就在指令中给出,只操作数本
17、身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立要取出指令也就取到了操作数。这个操作数被称为立要取出指令也就取到了操作数。这个操作数被称为立要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。即数,对应的寻址方式也就叫做立即寻址。即数,对应的寻址方式也就叫做立即寻址。即数,对应的寻址方式也就叫做立即寻址。ADD R0ADD R0,R0R0,1 1 ;R0R0R0R01 1 MOVMOVMOVMOV R0 R0 R0 R0,0x3f0x3f0x3f0x3f; ; ; ; R0R0R0R00x3f0x3f0x3f0x3f书写立即数时,要求以书写立即
18、数时,要求以书写立即数时,要求以书写立即数时,要求以“”为前缀。为前缀。为前缀。为前缀。十六进制数,后加十六进制数,后加十六进制数,后加十六进制数,后加 0x0x0x0x或或或或&,&,&,&,如如如如 #0x3f,#&3f.#0x3f,#&3f.#0x3f,#&3f.#0x3f,#&3f.二进制数,二进制数,二进制数,二进制数,后加后加后加后加 0b, 0b, 0b, 0b, 如如如如 #0b1011#0b1011#0b1011#0b1011十进制数,十进制数,十进制数,十进制数, # # # #后加后加后加后加 0d0d0d0d或缺省或缺省或缺省或缺省, , , ,如如如如#0d678,#
19、789#0d678,#789#0d678,#789#0d678,#789 如何构造如何构造如何构造如何构造32323232位立即数?位立即数?位立即数?位立即数?在指令格式中,第二个操作数有在指令格式中,第二个操作数有在指令格式中,第二个操作数有在指令格式中,第二个操作数有1212位位位位:因此有效立即数因此有效立即数因此有效立即数因此有效立即数immediateimmediateimmediateimmediate可以表示成:可以表示成:可以表示成:可以表示成: =immed_8 =immed_8 =immed_8 =immed_8 循环右移(循环右移(循环右移(循环右移(2 2 2 2ro
20、trotrotrot)4 bit 4 bit 移位值移位值移位值移位值 (0-15)(0-15)乘于乘于乘于乘于2 2,得到一个范围在,得到一个范围在,得到一个范围在,得到一个范围在0-0-3030,步长为,步长为,步长为,步长为 2 2的移位值。的移位值。的移位值。的移位值。因此,将因此,将因此,将因此,将ARMARM中的立即数中的立即数中的立即数中的立即数称为称为称为称为8 8位位图位位图位位图位位图。记住一条准则:记住一条准则:记住一条准则:记住一条准则: “ “最后最后最后最后8 8位移动偶数位位移动偶数位位移动偶数位位移动偶数位” ”得到立即得到立即得到立即得到立即数。数。数。数。I
21、mmed_8rot12 11 8 7 0Shifter RORimmediate031ror #0 ror #8 ror #30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 07例:例:下列命令中,汇编器把立即数转换为移位操作:下列命令中,汇编器把立即数转换为移位操作: MOV R0,#4096; uses 0x40 ror 26 ADD R1,R2,#0xFF0
22、000 ; uses 0xFF ror 16带有立即数的带有立即数的MOV 指令的二进制编码为:指令的二进制编码为:MOV R0,#0xF200 ;E3A00CF2.MOV R1,#0x110000 ;E3A01811.MOV R4,#0x12800 ;E3A04B4A.0xF200 =0xF2循环右移循环右移(2*C)0x110000 =0x11循环右移循环右移(2*8)0x12800 =0x4A循环右移循环右移(2*B)只有能够通过此构造方法得到的才是合法的立即数只有能够通过此构造方法得到的才是合法的立即数只有能够通过此构造方法得到的才是合法的立即数只有能够通过此构造方法得到的才是合法的立
23、即数。 合法立即数合法立即数合法立即数合法立即数: 0xFF0xFF;0x1040x104(其(其(其(其8 8位图为位图为位图为位图为0x410x41););););0xFF00xFF0;0xFF000xFF00 非法立即数:非法立即数:非法立即数:非法立即数: 0x1010x101;0x1020x102;0xFF10xFF1深入理解:深入理解:深入理解:深入理解:一个合法的立即数可能有多种编码方法,将一个合法的立即数可能有多种编码方法,将一个合法的立即数可能有多种编码方法,将一个合法的立即数可能有多种编码方法,将使某些指令的执行产生不同的结果。使某些指令的执行产生不同的结果。使某些指令的执
24、行产生不同的结果。使某些指令的执行产生不同的结果。 如如如如 0x3F00x3F0ARMARM汇编编译器生成立即数的规则为:汇编编译器生成立即数的规则为:汇编编译器生成立即数的规则为:汇编编译器生成立即数的规则为: 当立即数数值在当立即数数值在当立即数数值在当立即数数值在0 0到到到到0xFF0xFF范围时,令范围时,令范围时,令范围时,令immed_8=immed_8=,rot=0rot=0。 其它情况下,汇编编译器选择使其它情况下,汇编编译器选择使其它情况下,汇编编译器选择使其它情况下,汇编编译器选择使rotrot数值最小的编码方式。数值最小的编码方式。数值最小的编码方式。数值最小的编码方
25、式。immed_8=0x3F,rot=0xE,对,对3F左移左移4位位immed_8=0xFC,rot=0xF,对,对FC左移左移2位位3.2.2 寄存器寻址寄存器寻址寄存器寻址:寄存器寻址: 利用寄存器中的数值作为操作数利用寄存器中的数值作为操作数。这种寻址方式是各类微处理器经常采用的一种方式,也这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。是一种执行效率较高的寻址方式。两种具体形式:两种具体形式:寄存器寻址、寄存器移位寻址。寄存器寻址、寄存器移位寻址。一、一、寄存器寻址寄存器寻址如指令:如指令: ADDR0,R1,R2;R0R1R2 二、寄存器移位寻址二、寄
26、存器移位寻址二、寄存器移位寻址二、寄存器移位寻址 1 1、寄存器移位寻址、寄存器移位寻址、寄存器移位寻址、寄存器移位寻址当第二操作数为寄存器型时,在执行寄存器寻址操作时,也可以对当第二操作数为寄存器型时,在执行寄存器寻址操作时,也可以对当第二操作数为寄存器型时,在执行寄存器寻址操作时,也可以对当第二操作数为寄存器型时,在执行寄存器寻址操作时,也可以对第二操作数寄存器进行移位,此时第二操作数寄存器进行移位,此时第二操作数寄存器进行移位,此时第二操作数寄存器进行移位,此时第二操作数第二操作数第二操作数第二操作数形式为:形式为:形式为:形式为: MOV Rd, Rn, MOV Rd, Rn, RmR
27、m,其中:其中:其中:其中: Rm Rm 称为第二操作数寄存器称为第二操作数寄存器称为第二操作数寄存器称为第二操作数寄存器 用来指定移位类型和移位位数,有两种形式:用来指定移位类型和移位位数,有两种形式:用来指定移位类型和移位位数,有两种形式:用来指定移位类型和移位位数,有两种形式: 5 5位立即数位立即数位立即数位立即数(其值小于(其值小于(其值小于(其值小于3232) 寄存器寄存器寄存器寄存器( (用用用用RsRs表示表示表示表示) )(其值小于(其值小于(其值小于(其值小于3232) 在在在在指指指指令令令令执执执执行行行行时时时时将将将将寄寄寄寄存存存存器器器器移移移移位位位位后后后后
28、的的的的内内内内容容容容作作作作为为为为第第第第二二二二操操操操作作作作数数数数参参参参与与与与运运运运算算算算。例例例例如指令:如指令:如指令:如指令: ADD R3ADD R3,R2R2,R1R1,LSR #2LSR #2 ;R3R2+(R1R3R2+(R1右移右移右移右移2 2位位位位) )ADD R3ADD R3,R2R2,R1R1,LSR R0LSR R0 ;R3R2+(R1R3R2+(R1右移右移右移右移R0R0位位位位) )2、第二操作数移位方式、第二操作数移位方式共有共有共有共有6 6种移位方式:种移位方式:种移位方式:种移位方式: LSL LSL 逻辑左移逻辑左移逻辑左移逻辑
29、左移 LSR LSR 逻辑右移逻辑右移逻辑右移逻辑右移 ASL ASL 算术左移算术左移算术左移算术左移 ASR ASR 算术右移算术右移算术右移算术右移 ROR ROR 循环右移循环右移循环右移循环右移 RRX RRX 带扩展的循环右移带扩展的循环右移带扩展的循环右移带扩展的循环右移(1 1)LSLLSL:逻辑左移:逻辑左移:逻辑左移:逻辑左移,空出的最低有效位用,空出的最低有效位用,空出的最低有效位用,空出的最低有效位用0 0填充。填充。填充。填充。031 00 (2) LSR:逻辑右移:逻辑右移,空出的最高有效位用,空出的最高有效位用0填充。填充。 31 0SUB R3,R2,R1,LS
30、L #2 ;R3R2-(R1左移左移2位位)SUB R3,R2,R1,LSR R0 ;R3R2-(R1右移右移R0位位)(3 3)ASLASL:算术左移:算术左移:算术左移:算术左移,由于左移空出的有效,由于左移空出的有效,由于左移空出的有效,由于左移空出的有效位用位用位用位用0 0填充,因此它与填充,因此它与填充,因此它与填充,因此它与LSLLSL同义。同义。同义。同义。(4 4)ASRASR:算术右移:算术右移:算术右移:算术右移 (Arithmetic Shift (Arithmetic Shift Right) Right) 。算术移位的对象是带符号数,移位过程。算术移位的对象是带符号
31、数,移位过程。算术移位的对象是带符号数,移位过程。算术移位的对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是中必须保持操作数的符号不变。如果源操作数是中必须保持操作数的符号不变。如果源操作数是中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用正数,空出的最高有效位用正数,空出的最高有效位用正数,空出的最高有效位用0 0填充,如果是负填充,如果是负填充,如果是负填充,如果是负数用数用数用数用1 1填充。填充。填充。填充。 30 0 30 0 ADD R3,R2,R1,ASL #2 ;R3R2+(R1左移左移2位位)SUB R3,R2,R1,ASR R3 ;R3R
32、2-(R1算术右移算术右移R3位位)(5 5)RORROR:循环右移:循环右移:循环右移:循环右移(Rotate Right)(Rotate Right),移出的字的最,移出的字的最,移出的字的最,移出的字的最低有效位依次填入空出的最高有效位。低有效位依次填入空出的最高有效位。低有效位依次填入空出的最高有效位。低有效位依次填入空出的最高有效位。 3131 0 0 (6 6)RRXRRX:带进位的循环右移:带进位的循环右移:带进位的循环右移:带进位的循环右移(Rotate Right (Rotate Right Extended) Extended) 。将寄存器的内容。将寄存器的内容。将寄存器的
33、内容。将寄存器的内容循环右移循环右移循环右移循环右移1 1位位位位,空位用原来,空位用原来,空位用原来,空位用原来C C标志位填充。标志位填充。标志位填充。标志位填充。 31 031 0 C CSUB R3,R2,R1,ROR #2 ;R3R2+(R1循环右移循环右移2位位)SUB R3,R2,R1,RRX R0;R3R2-(R1带进位位循环右移带进位位循环右移R0位位)3、第二操作数的移位位数、第二操作数的移位位数 移位位数可以用立即数方式或者寄存器方式给出移位位数可以用立即数方式或者寄存器方式给出移位位数可以用立即数方式或者寄存器方式给出移位位数可以用立即数方式或者寄存器方式给出,其,其,
34、其,其值均小于值均小于值均小于值均小于3232,应为,应为,应为,应为0-310-31。如下所示:如下所示:如下所示:如下所示: ADD R3 ADD R3,R2R2,R1R1,LSR #2LSR #2 ;R3R3R2+(R1R2+(R1右移右移右移右移2 2位位位位) ) ADD R3 ADD R3,R2R2,R1R1,LSR R4LSR R4 ;R3R3R2+(R1R2+(R1右移右移右移右移R4R4位位位位) )寄存器寄存器寄存器寄存器R1R1的内容分别逻辑右移的内容分别逻辑右移的内容分别逻辑右移的内容分别逻辑右移2 2位、位、位、位、R4R4位位位位, ,再与寄存再与寄存再与寄存再与寄
35、存器器器器R2R2的内容相加,结果放入的内容相加,结果放入的内容相加,结果放入的内容相加,结果放入R3R3中。中。中。中。3.2.3 寄存器间接寻址寄存器间接寻址寄存器间接寻址寄存器间接寻址就是以就是以寄存器中的值作为操作数的地址寄存器中的值作为操作数的地址,而操作数本,而操作数本身存放在存储单元中。例如以下指令:身存放在存储单元中。例如以下指令: LDRR0,R1;R0R1 STRR0,R1;R1R0第一条指令将以第一条指令将以R1的值为地址的存储单元中的内容加载到的值为地址的存储单元中的内容加载到寄存器寄存器R0中。中。第二条指令将第二条指令将R0的内容存储到以的内容存储到以R1的值为地址
36、的存储单元的值为地址的存储单元中。中。 R1基址寄存器基址寄存器 R1的内容的内容基地址基地址3.2.4 变址寻址变址寻址一、变址寻址一、变址寻址也叫基址加偏(变)址寻址也叫基址加偏(变)址寻址也叫基址加偏(变)址寻址也叫基址加偏(变)址寻址 将将将将基址寄存器基址寄存器基址寄存器基址寄存器的内容与指令中给出的的内容与指令中给出的的内容与指令中给出的的内容与指令中给出的地址偏移量地址偏移量地址偏移量地址偏移量相加相加相加相加,得到操作数所在的存储器的有效地址。,得到操作数所在的存储器的有效地址。,得到操作数所在的存储器的有效地址。,得到操作数所在的存储器的有效地址。变址寻址方式常用于访问某基地
37、址附近的地址单元。变址寻址方式常用于访问某基地址附近的地址单元。变址寻址方式常用于访问某基地址附近的地址单元。变址寻址方式常用于访问某基地址附近的地址单元。(4K4K)例如:例如:LDR R0,R1,4 ;R0mem32R14CondOpcodeRnRdOffset0111215161920272831二、偏移地址方式二、偏移地址方式有三种加偏址的方式有三种加偏址的方式有三种加偏址的方式有三种加偏址的方式1 1、前变址模式、前变址模式、前变址模式、前变址模式(不修改基址寄存器):(不修改基址寄存器):(不修改基址寄存器):(不修改基址寄存器): 先基址先基址先基址先基址+偏址,生成操作数地址,
38、做偏址,生成操作数地址,做偏址,生成操作数地址,做偏址,生成操作数地址,做指令指定的操作指令指定的操作指令指定的操作指令指定的操作。也叫也叫也叫也叫前索引偏移前索引偏移前索引偏移前索引偏移。0x05R10x200基址基址寄存器寄存器0x200R00x05源源 寄存器寄存器偏移量偏移量120x20C Pre-indexed: STR r0,Pre-indexed: STR r0, r1,#12r1,#12 2、自动变址模式、自动变址模式( (修改基址寄存器修改基址寄存器修改基址寄存器修改基址寄存器) ): 先基址先基址先基址先基址+偏移,生成操作数地址,偏移,生成操作数地址,偏移,生成操作数地址
39、,偏移,生成操作数地址,做指令指定的操作。做指令指定的操作。做指令指定的操作。做指令指定的操作。然后自动修改基址寄存器。然后自动修改基址寄存器。然后自动修改基址寄存器。然后自动修改基址寄存器。例如:例如:例如:例如:LDR R0LDR R0,R1R1,44! ;R0memR0mem3232 R1R144;R1R1R1R14 4 ! 表示更新基址寄存器表示更新基址寄存器表示更新基址寄存器表示更新基址寄存器。3、后变址模式、后变址模式(修改基址寄存器修改基址寄存器): 基址寄存器不加偏移作为操作数地址。基址寄存器不加偏移作为操作数地址。 完成指令操作后,用完成指令操作后,用(基址基址+偏移偏移)的
40、值修改基址的值修改基址寄存器寄存器。即先用基地址传数,然后修改基地址(基址即先用基地址传数,然后修改基地址(基址+偏移)偏移),也叫,也叫后索引偏移后索引偏移。0x5r10x200原基址原基址寄存器寄存器0x200r00x5源源 寄存器寄存器偏移量偏移量120x20cr10x20c更新基更新基址寄存器址寄存器例例 Post-indexed: STR Post-indexed: STR r0,r0, r1r1 ,#12,#12三、偏移地址形式三、偏移地址形式 可可以以是是一一个个立立即即数数,也也可可以以是是另另一一个个寄寄存存器器,并并且且还还可可以以是是寄寄存存器器移移位位操操作作。如如下下
41、所所示:示:LDR r0LDR r0,r1r1,r2r2 ;r0r0memmem3232r1+r2r1+r2LDR r0LDR r0,r1r1,r2r2,LSL #2LSL #2;r0r0memmem3232r1+r2*4r1+r2*4常用的是立即数偏移的形式。常用的是立即数偏移的形式。3.2.5 堆栈寻址堆栈寻址堆栈寻址堆栈寻址 堆栈寻址是隐含的,它使用一个专门的堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针寄存器(堆栈指针SP)指向一块存储区域)指向一块存储区域(堆栈堆栈)。堆栈可分为两种增长方式:堆栈可分为两种增长方式:向上生长:向上生长:向高地址方向生长,称为向高地址方向生长,称为
42、递增递增堆栈堆栈。向下生长:向下生长:向低地址方向生长,称为向低地址方向生长,称为递减递减堆栈堆栈。根据堆栈指针指向的数据位置的不同,可分为:根据堆栈指针指向的数据位置的不同,可分为:根据堆栈指针指向的数据位置的不同,可分为:根据堆栈指针指向的数据位置的不同,可分为:满堆栈满堆栈满堆栈满堆栈 堆栈指针指向最后压入堆栈的有效数据项,堆栈指针指向最后压入堆栈的有效数据项,堆栈指针指向最后压入堆栈的有效数据项,堆栈指针指向最后压入堆栈的有效数据项,称为满堆栈;称为满堆栈;称为满堆栈;称为满堆栈;空堆栈空堆栈空堆栈空堆栈 堆栈指针指向下一个待压入数据的空位置,称为堆栈指针指向下一个待压入数据的空位置,
43、称为堆栈指针指向下一个待压入数据的空位置,称为堆栈指针指向下一个待压入数据的空位置,称为空堆栈。空堆栈。空堆栈。空堆栈。 这样就有这样就有这样就有这样就有4 4种类型的堆栈表示递增和递减的满和空种类型的堆栈表示递增和递减的满和空种类型的堆栈表示递增和递减的满和空种类型的堆栈表示递增和递减的满和空堆栈的各种组合。堆栈的各种组合。堆栈的各种组合。堆栈的各种组合。四种类型的堆栈工作方式四种类型的堆栈工作方式 满递增堆栈满递增堆栈满递增堆栈满递增堆栈FAFA( Full AscendingFull Ascending ):):):):堆堆堆堆栈栈栈栈指指指指针针针针指指指指向向向向最最最最后后后后压压
44、压压入入入入的的的的数数数数据据据据,且且且且由由由由低低低低地地地地址址址址向向向向高地址生长。高地址生长。高地址生长。高地址生长。满递减堆栈满递减堆栈满递减堆栈满递减堆栈FDFD: 堆堆堆堆栈栈栈栈指指指指针针针针指指指指向向向向最最最最后后后后压压压压入入入入的的的的数数数数据据据据,且且且且由由由由高高高高地地地地址址址址向向向向低地址生长。低地址生长。低地址生长。低地址生长。空递增堆栈空递增堆栈空递增堆栈空递增堆栈EAEA: 堆堆堆堆栈栈栈栈指指指指针针针针指指指指向向向向下下下下一一一一个个个个将将将将要要要要放放放放入入入入数数数数据据据据的的的的空空空空位位位位置置置置,且由低
45、地址向高地址生长。且由低地址向高地址生长。且由低地址向高地址生长。且由低地址向高地址生长。空递减堆栈空递减堆栈空递减堆栈空递减堆栈EDED( Empty DescendingEmpty Descending ):):):): 堆堆堆堆栈栈栈栈指指指指针针针针指指指指向向向向下下下下一一一一个个个个将将将将要要要要放放放放入入入入数数数数据据据据的的的的空空空空位位位位置置置置,且由高地址向低地址生长。且由高地址向低地址生长。且由高地址向低地址生长。且由高地址向低地址生长。r4100r5FFr6 1234r7 A0BElr8034ABCD8765102E16FFFF101012348420975
46、3高地址高地址LDMFA sp!,r4-r7,pc满递增满递增SP100FF1234AOBE80341010123484209753r41r5 14544r60r712pc9020r4100100FFr5FF1234r61234A0BEr7 A0BE8034pc8034Old SP100FF1234A0BE8034SPOld SP100FF1234A0BE8034STMFD sp!,r4-r7,lr满递减满递减80343.2.6 块拷贝寻址块拷贝寻址一、块拷贝寻址一、块拷贝寻址把把存存储储器器中中的的一一个个数数据据块块加加载载到到多多个个寄寄存存器器中中,或或者者是是把把多多个个寄寄存存器器
47、中中的的内内容容保保存到存储器中存到存储器中。应应用用指指令令:块块拷拷贝贝寻寻址址是是多多寄寄存存器器传传送送指指令令LDM/STM的的寻寻址址方方式式,因因此此也也叫叫多多寄寄存存器寻址器寻址。块块拷拷贝贝寻寻址址操操作作中中的的寄寄存存器器,可可以以是是R0-R15这这16个个寄寄存存器器的的子子集集(一一部部分分),或或是是所有寄存器。所有寄存器。二、二、4种寻址操作种寻址操作LDMIA / STMIALDMIA / STMIAIncrement After(Increment After(先传送,后地址加先传送,后地址加先传送,后地址加先传送,后地址加4)4)LDMIB / STMI
48、BLDMIB / STMIBIncrement Before(Increment Before(先地址加先地址加先地址加先地址加4 ,4 ,后传后传后传后传送送送送) )LDMDA / STMDALDMDA / STMDADecrement After(Decrement After(先传送,后地址减先传送,后地址减先传送,后地址减先传送,后地址减4)4)LDMDB / STMDBLDMDB / STMDBDecrement Before (Decrement Before (先地址减先地址减先地址减先地址减4,4,后传后传后传后传送送送送) )IAr1地址地址增加增加r4r0r1r4r0r1
49、r4r0r1r4r0r10IBDADBSTMxx r10, r0,r1,r4基址寄存器基址寄存器 (Rn)地址递减,指针地址递减,指针最后位置最后位置地址递增,指针地址递增,指针最后位置最后位置 栈生长栈生长栈生长栈生长 地址地址地址地址 顶空顶空顶空顶空满满满满 增减次序增减次序增减次序增减次序栈栈栈栈、块递增块递增块递增块递增栈栈栈栈、块递减块递减块递减块递减顶满顶满顶满顶满顶空顶空顶空顶空顶满顶满顶满顶满顶空顶空顶空顶空地址地址地址地址增加增加增加增加先增先增先增先增STMIBSTMIBSTMFASTMFALDMIBLDMIBLDMEDLDMED后增后增后增后增STMIASTMIASTM
50、EASTMEALDMIALDMIALDMFDLDMFD地址地址地址地址减少减少减少减少先减先减先减先减LDMDBLDMDBLDMEALDMEASTMDBSTMDBSTMFDSTMFD后减后减后减后减LDMDALDMDALDMFALDMFASTMDASTMDASTMEDSTMED多寄存器多寄存器load和和stroe指令的堆栈和块拷贝对指令的堆栈和块拷贝对照照STMFASTMFA(FullFull、AddAdd):栈满递增。):栈满递增。):栈满递增。):栈满递增。F-F-栈顶满空;栈顶满空;栈顶满空;栈顶满空;A-A-栈增减栈增减栈增减栈增减LDMIB*LDMIB*(IncInc、BefoBe
51、fo):块先增地址、再传数。):块先增地址、再传数。):块先增地址、再传数。):块先增地址、再传数。3.2.7 相对寻址相对寻址相对寻址相对寻址 与与与与基基基基址址址址变变变变址址址址寻寻寻寻址址址址方方方方式式式式相相相相类类类类似似似似,相相相相对对对对寻寻寻寻址址址址以以以以程程程程序序序序计计计计数数数数器器器器PCPC的的的的当当当当前前前前值值值值为为为为基基基基地地地地址址址址,指指指指令令令令中中中中的的的的地地地地址址址址标标标标号号号号作作作作为为为为偏偏偏偏移移移移量量量量,将将将将两两两两者者者者相相相相加加加加之之之之后后后后得得得得到到到到操操操操作作作作数数数数
52、的的的的有有有有效效效效地址地址地址地址。相对寻址指令举例如下:相对寻址指令举例如下:相对寻址指令举例如下:相对寻址指令举例如下: BL SUBRl BL SUBRl ;调用到;调用到;调用到;调用到SUBRlSUBRl子程序子程序子程序子程序 . . . . .; ; SUBRlSUBRl应为应为应为应为2424位有符号数位有符号数位有符号数位有符号数SUBR1SUBR1MOV PC, LR MOV PC, LR ;返回;返回;返回;返回3.3 ARM指令集指令集主要内容主要内容1 1、存储器访问指令、存储器访问指令、存储器访问指令、存储器访问指令2 2、数据处理指令、数据处理指令、数据处理
53、指令、数据处理指令3 3、分支指令、分支指令、分支指令、分支指令4 4、协处理器指令、协处理器指令、协处理器指令、协处理器指令5 5、杂项指令、杂项指令、杂项指令、杂项指令6 6、ARMARM伪指令伪指令伪指令伪指令3.3.1 存储器访问指令存储器访问指令ARMARM微处理器用加载微处理器用加载微处理器用加载微处理器用加载/ /存储指令访问存储器,实存储指令访问存储器,实存储指令访问存储器,实存储指令访问存储器,实现在寄存器和存储器之间传送数据。现在寄存器和存储器之间传送数据。现在寄存器和存储器之间传送数据。现在寄存器和存储器之间传送数据。加载指令加载指令加载指令加载指令用于用于用于用于将存储
54、器中的数据传送到寄存器,将存储器中的数据传送到寄存器,将存储器中的数据传送到寄存器,将存储器中的数据传送到寄存器,存储指令存储指令存储指令存储指令则完成则完成则完成则完成相反的操作。相反的操作。相反的操作。相反的操作。由于由于由于由于ARMARM处理器对外设寄存器、处理器对外设寄存器、处理器对外设寄存器、处理器对外设寄存器、I/OI/O映射空间映射空间映射空间映射空间与存储器统一编址,因此,对外围设备的与存储器统一编址,因此,对外围设备的与存储器统一编址,因此,对外围设备的与存储器统一编址,因此,对外围设备的I/OI/O操作操作操作操作也用此类指令。也用此类指令。也用此类指令。也用此类指令。基
55、本的加载基本的加载基本的加载基本的加载/ /存储指令仅有存储指令仅有存储指令仅有存储指令仅有5 5条,分为条,分为条,分为条,分为3 3种:种:种:种: LDR LDR和和和和STRSTR,单寄存器加载,单寄存器加载,单寄存器加载,单寄存器加载/ /存储指令存储指令存储指令存储指令 LDM LDM和和和和STMSTM,多寄存器加载,多寄存器加载,多寄存器加载,多寄存器加载/ /存储指令存储指令存储指令存储指令 SWP SWP,寄存器和存储器数据交换指令,寄存器和存储器数据交换指令,寄存器和存储器数据交换指令,寄存器和存储器数据交换指令一、单寄存器的存取指令一、单寄存器的存取指令 单单单单寄寄寄
56、寄存存存存器器器器加加加加载载载载/ /存存存存储储储储指指指指令令令令是是是是ARMARM在在在在寄寄寄寄存存存存器器器器和和和和存存存存储器间传送单个字节和字的最灵活方式。储器间传送单个字节和字的最灵活方式。储器间传送单个字节和字的最灵活方式。储器间传送单个字节和字的最灵活方式。根根根根据据据据传传传传送送送送数数数数据据据据的的的的类类类类型型型型不不不不同同同同,单单单单个个个个寄寄寄寄存存存存器器器器存存存存取取取取指指指指令又可以分为以下两类:令又可以分为以下两类:令又可以分为以下两类:令又可以分为以下两类:单字和无符号字节的加载单字和无符号字节的加载单字和无符号字节的加载单字和无
57、符号字节的加载/ /存储指令存储指令存储指令存储指令半字和有符号字节的加载半字和有符号字节的加载半字和有符号字节的加载半字和有符号字节的加载/ /存储指令存储指令存储指令存储指令1、单字和无符号字节的加载存储指令、单字和无符号字节的加载存储指令LDRLDR:指令从内存中取指令从内存中取指令从内存中取指令从内存中取3232位字或位字或位字或位字或8 8位无符号字节数据位无符号字节数据位无符号字节数据位无符号字节数据放入寄存器;放入寄存器;放入寄存器;放入寄存器;STRSTR:指令将寄存器中的指令将寄存器中的指令将寄存器中的指令将寄存器中的3232位字或位字或位字或位字或8 8位无符号字节数位无符
58、号字节数位无符号字节数位无符号字节数据保存到存储器中。据保存到存储器中。据保存到存储器中。据保存到存储器中。注意:注意:注意:注意: 无符号字节加载时,用无符号字节加载时,用无符号字节加载时,用无符号字节加载时,用0 0将将将将8 8位的操作数扩展到位的操作数扩展到位的操作数扩展到位的操作数扩展到3232位。位。位。位。(1)指令格式)指令格式 LDRcondT RdLDRcondT Rd, ;加载指定地址上的字数据,放入;加载指定地址上的字数据,放入;加载指定地址上的字数据,放入;加载指定地址上的字数据,放入RdRd中。中。中。中。 STRcondT RdSTRcondT Rd, ;存储;存
59、储;存储;存储RdRd中字数据,到指定地址的存储单元。中字数据,到指定地址的存储单元。中字数据,到指定地址的存储单元。中字数据,到指定地址的存储单元。 LDRcondBT RdLDRcondBT Rd, ;加载字节数据到;加载字节数据到;加载字节数据到;加载字节数据到RdRd中中中中, Rd, Rd最低字节有效,最低字节有效,最低字节有效,最低字节有效,高高高高2424位为位为位为位为0 0。 STRcondBT RdSTRcondBT Rd, ;存储;存储;存储;存储RdRd中字节数据,中字节数据,中字节数据,中字节数据, RdRd中最低字节为传送数中最低字节为传送数中最低字节为传送数中最低
60、字节为传送数据。据。据。据。T后缀后缀T T为可选后缀,若指令有为可选后缀,若指令有为可选后缀,若指令有为可选后缀,若指令有T T,那么即使处理器是在,那么即使处理器是在,那么即使处理器是在,那么即使处理器是在特权模式下,存储系统也将访问看成是处理器是特权模式下,存储系统也将访问看成是处理器是特权模式下,存储系统也将访问看成是处理器是特权模式下,存储系统也将访问看成是处理器是在用户模式下。在用户模式下。在用户模式下。在用户模式下。用于存储器保护。用于存储器保护。用于存储器保护。用于存储器保护。不能与前变址模式、自动变址模式一起使用(即不能与前变址模式、自动变址模式一起使用(即不能与前变址模式、
61、自动变址模式一起使用(即不能与前变址模式、自动变址模式一起使用(即不能改变基址寄存器值)。不能改变基址寄存器值)。不能改变基址寄存器值)。不能改变基址寄存器值)。T T在用户模式下无效。在用户模式下无效。在用户模式下无效。在用户模式下无效。(2)操作数寻址方式)操作数寻址方式 LDR/STRLDR/STR指令为变址寻址指令为变址寻址指令为变址寻址指令为变址寻址,由两部分组成:,由两部分组成:,由两部分组成:,由两部分组成:基地址部分:基地址部分:基地址部分:基地址部分:为一个基址寄存器,可以为任一个通用为一个基址寄存器,可以为任一个通用为一个基址寄存器,可以为任一个通用为一个基址寄存器,可以为
62、任一个通用寄存器;寄存器;寄存器;寄存器;偏移地址部分:偏移地址部分:偏移地址部分:偏移地址部分:这一部分非常灵活,实际就是第二个这一部分非常灵活,实际就是第二个这一部分非常灵活,实际就是第二个这一部分非常灵活,实际就是第二个操作数,可以有以下操作数,可以有以下操作数,可以有以下操作数,可以有以下3 3种格式:种格式:种格式:种格式:立即数立即数立即数立即数寄存器寄存器寄存器寄存器寄存器及移位常数。寄存器及移位常数。寄存器及移位常数。寄存器及移位常数。 立即数立即数1212位立即数可以是一个无符号的数值。这位立即数可以是一个无符号的数值。这位立即数可以是一个无符号的数值。这位立即数可以是一个无
63、符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存个数据可以加到基址寄存器,也可以从基址寄存个数据可以加到基址寄存器,也可以从基址寄存个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。器中减去这个数值。器中减去这个数值。器中减去这个数值。指令举例如下:指令举例如下:指令举例如下:指令举例如下:LDR R1LDR R1,R0R0,#0x12#0x12 ;将;将;将;将R0+0x12R0+0x12地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到R1R1中中中中(R0(R0的值不的值不的值不的值不变变变变) )LDR R1LDR R1,
64、R0R0,# -0x12 # -0x12 ;将;将;将;将R0-0x12R0-0x12地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到R1R1中中中中(R0(R0的值不的值不的值不的值不变变变变) ) 寄存器寄存器寄存器中的数值可以加到基址寄存器,寄存器中的数值可以加到基址寄存器,寄存器中的数值可以加到基址寄存器,寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。也可以从基址寄存器中减去这个数值。也可以从基址寄存器中减去这个数值。也可以从基址寄存器中减去这个数值。指令举例如下:指令举例如下:LDR R1LDR R1,R0R0,R
65、2 R2 ;将;将;将;将R0+R2R0+R2地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到R1R1中中中中LDR R1LDR R1,R0R0,-R2 -R2 ;将;将;将;将R0-R2R0-R2地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到R1R1中中中中 寄存器及移位常数寄存器及移位常数寄存器移位后的值可以加到基址寄存器,寄存器移位后的值可以加到基址寄存器,寄存器移位后的值可以加到基址寄存器,寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。也可以从基址寄存器中减去这个数
66、值。也可以从基址寄存器中减去这个数值。也可以从基址寄存器中减去这个数值。指令举例如下:指令举例如下:指令举例如下:指令举例如下:LDR R1LDR R1,R0R0,R2R2,LSL #2LSL #2 ;将;将;将;将R0+R24R0+R24地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到R1R1中中中中(R0(R0、R2R2的值不变的值不变的值不变的值不变) )LDR R1LDR R1,R0R0,-R2-R2,LSL #2LSL #2 ;将;将;将;将R0-R24R0-R24地址处的数据读出,保存到地址处的数据读出,保存到地址处的数据读出,保存到
67、地址处的数据读出,保存到R1R1中中中中(R0(R0、R2R2的值不变的值不变的值不变的值不变) ) 注意:注意:注意:注意:移位位数只能是移位位数只能是移位位数只能是移位位数只能是5 5位的立即数,不位的立即数,不位的立即数,不位的立即数,不能使用寄存器指定移位位数。能使用寄存器指定移位位数。能使用寄存器指定移位位数。能使用寄存器指定移位位数。 PC(即(即R15)使用的几个问题)使用的几个问题使用使用使用使用PCPC作为基址时,使用的数值是指令的地址作为基址时,使用的数值是指令的地址作为基址时,使用的数值是指令的地址作为基址时,使用的数值是指令的地址加加加加8 8个字节(取指与执行相差个字
68、节(取指与执行相差个字节(取指与执行相差个字节(取指与执行相差8 8个字节)。个字节)。个字节)。个字节)。PCPC不能用做偏移寄存器,也不能用于任何变址不能用做偏移寄存器,也不能用于任何变址不能用做偏移寄存器,也不能用于任何变址不能用做偏移寄存器,也不能用于任何变址寻址模式。寻址模式。寻址模式。寻址模式。把一个字加载到把一个字加载到把一个字加载到把一个字加载到PCPC,将使程序转移到所加载的,将使程序转移到所加载的,将使程序转移到所加载的,将使程序转移到所加载的地址,这是一个公认的实现跳转的方法。但是应当地址,这是一个公认的实现跳转的方法。但是应当地址,这是一个公认的实现跳转的方法。但是应当
69、地址,这是一个公认的实现跳转的方法。但是应当避免将一个字节加载到避免将一个字节加载到避免将一个字节加载到避免将一个字节加载到PCPC。把把把把PCPC存到存储器的操作在不同体系结构的处理存到存储器的操作在不同体系结构的处理存到存储器的操作在不同体系结构的处理存到存储器的操作在不同体系结构的处理器中产生不同的结果,应尽可能避免。器中产生不同的结果,应尽可能避免。器中产生不同的结果,应尽可能避免。器中产生不同的结果,应尽可能避免。2、半字和有符号字节的加载存储指令、半字和有符号字节的加载存储指令这类这类这类这类LDR/STRLDR/STR指令可实现半字(有符号和无符指令可实现半字(有符号和无符指令
70、可实现半字(有符号和无符指令可实现半字(有符号和无符号)、有符号字节数据的传送。号)、有符号字节数据的传送。号)、有符号字节数据的传送。号)、有符号字节数据的传送。特点:特点:特点:特点: 偏移量格式、寻址方式与加载存储字和无符号字节指令偏移量格式、寻址方式与加载存储字和无符号字节指令偏移量格式、寻址方式与加载存储字和无符号字节指令偏移量格式、寻址方式与加载存储字和无符号字节指令基本相同。基本相同。基本相同。基本相同。 立即数偏移量限定在立即数偏移量限定在立即数偏移量限定在立即数偏移量限定在8 8位,寄存器偏移量不可经过移位得位,寄存器偏移量不可经过移位得位,寄存器偏移量不可经过移位得位,寄存
71、器偏移量不可经过移位得到。到。到。到。(1)指令格式如下)指令格式如下 LDR condH LDR condH RdRd, ;加载无符号半字数据到;加载无符号半字数据到;加载无符号半字数据到;加载无符号半字数据到RdRd的低的低的低的低1616位位位位, ,高高高高1616位清零。位清零。位清零。位清零。 LDR condSB LDR condSB RdRd, ;加载指定地址上有符号字节到;加载指定地址上有符号字节到;加载指定地址上有符号字节到;加载指定地址上有符号字节到RdRd中,高中,高中,高中,高2424位用符号位扩展位用符号位扩展位用符号位扩展位用符号位扩展LDR condSH RdL
72、DR condSH Rd, ;加载指定地址上的有符号半字到;加载指定地址上的有符号半字到;加载指定地址上的有符号半字到;加载指定地址上的有符号半字到RdRd中,高中,高中,高中,高1616位用符号位扩展。位用符号位扩展。位用符号位扩展。位用符号位扩展。 STRcondH STRcondH RdRd, ;存储;存储;存储;存储RdRd中的低中的低中的低中的低1616位半字数据。位半字数据。位半字数据。位半字数据。 存储有符号数据和无符号数据之间没有差别。存储有符号数据和无符号数据之间没有差别。存储有符号数据和无符号数据之间没有差别。存储有符号数据和无符号数据之间没有差别。(2)两点说明:)两点说
73、明:符符符符 号号号号 位位位位有符号字节或有符号半字的加载,有符号字节或有符号半字的加载,有符号字节或有符号半字的加载,有符号字节或有符号半字的加载,用用用用“ “符号位符号位符号位符号位” ”扩展到扩展到扩展到扩展到3232位;无符号半字传送是用位;无符号半字传送是用位;无符号半字传送是用位;无符号半字传送是用0 0扩展到扩展到扩展到扩展到3232位。位。位。位。地址对齐地址对齐地址对齐地址对齐对半字传送的地址必须为偶数。非对半字传送的地址必须为偶数。非对半字传送的地址必须为偶数。非对半字传送的地址必须为偶数。非半字对齐的半字加载将使半字对齐的半字加载将使半字对齐的半字加载将使半字对齐的半
74、字加载将使RdRd内容不可靠;非半字内容不可靠;非半字内容不可靠;非半字内容不可靠;非半字对齐的半字存储将使指定地址的对齐的半字存储将使指定地址的对齐的半字存储将使指定地址的对齐的半字存储将使指定地址的2 2字节存储内容字节存储内容字节存储内容字节存储内容不可靠。不可靠。不可靠。不可靠。(3)指令举例)指令举例LDRSB R1LDRSB R1,R0R0,R3R3 ;将;将;将;将R0+R3R0+R3地址上的字节数据读到地址上的字节数据读到地址上的字节数据读到地址上的字节数据读到R1,R1,高高高高2424位用符号位扩展。位用符号位扩展。位用符号位扩展。位用符号位扩展。LDRSH R1LDRSH
75、 R1,R9R9 ;将;将;将;将R9R9地址上的半字数据读出到地址上的半字数据读出到地址上的半字数据读出到地址上的半字数据读出到R1R1,高,高,高,高1616位用符号位扩展。位用符号位扩展。位用符号位扩展。位用符号位扩展。LDRH R6LDRH R6,R2R2,#2#2 ;将;将;将;将R2R2地址上的半字数据读出到地址上的半字数据读出到地址上的半字数据读出到地址上的半字数据读出到R6R6,高,高,高,高1616位用零扩展,然后修改位用零扩展,然后修改位用零扩展,然后修改位用零扩展,然后修改R2=R2+2R2=R2+2。STRH R1STRH R1,R0R0,#2!#2! ;将;将;将;将
76、R1R1的数据保存到的数据保存到的数据保存到的数据保存到R0+2R0+2地址中,地址中,地址中,地址中,只存储低只存储低只存储低只存储低2 2字节数据,并且修改字节数据,并且修改字节数据,并且修改字节数据,并且修改R0=R0+2R0=R0+2。二、二、多寄存器的存取指令多寄存器的存取指令 LDMLDM和和和和STMSTM指指指指令令令令可可可可以以以以实实实实现现现现在在在在一一一一组组组组寄寄寄寄存存存存器器器器和和和和一一一一块块块块连连连连续续续续的的的的内内内内存单元之间存存单元之间存存单元之间存存单元之间存/ /取数据。取数据。取数据。取数据。LDMLDM为加载多个寄存器;为加载多个
77、寄存器;为加载多个寄存器;为加载多个寄存器;STMSTM为存储多个寄存器。为存储多个寄存器。为存储多个寄存器。为存储多个寄存器。这这这这两两两两条条条条指指指指令令令令,允允允允许许许许传传传传送送送送1616个个个个寄寄寄寄存存存存器器器器R0-R15R0-R15的的的的任任任任何何何何子子子子集或所有寄存器。集或所有寄存器。集或所有寄存器。集或所有寄存器。1 1、指令格式、指令格式、指令格式、指令格式LDMcondLDMcond Rn! Rn!, STMcond STMcond Rn! Rn!,2、指令格式说明、指令格式说明(1 1)RnRn:表表表表示示示示基基基基址址址址寄寄寄寄存存存
78、存器器器器,装装装装有有有有传传传传送送送送数数数数据据据据的的的的初初初初始地址,始地址,始地址,始地址,RnRn不允许为不允许为不允许为不允许为R15R15(即(即(即(即PCPC)。(2 2)RnRn后缀后缀后缀后缀“ “!” ”:表示最后的地址写回到:表示最后的地址写回到:表示最后的地址写回到:表示最后的地址写回到RnRn中。中。中。中。(3 3)ReglistReglist:表表表表示示示示寄寄寄寄存存存存器器器器列列列列表表表表,可可可可包包包包含含含含多多多多个个个个序序序序号连续的或者分离的寄存器,用号连续的或者分离的寄存器,用号连续的或者分离的寄存器,用号连续的或者分离的寄存
79、器,用“ “,” ”分开。分开。分开。分开。 格式例子:格式例子:格式例子:格式例子:R1R1,R2R2,R6R9R6R9 列表寄存器和存储器地址的关系规则:列表寄存器和存储器地址的关系规则:列表寄存器和存储器地址的关系规则:列表寄存器和存储器地址的关系规则:编编编编号号号号低低低低的的的的寄寄寄寄存存存存器器器器对对对对应应应应于于于于存存存存储储储储器器器器中中中中低低低低地地地地址址址址单单单单元元元元,编编编编号号号号高高高高的的的的寄存器对应于存储器中高地址单元。寄存器对应于存储器中高地址单元。寄存器对应于存储器中高地址单元。寄存器对应于存储器中高地址单元。(4)后缀)后缀“”说明说
80、明寄寄寄寄存存存存器器器器列列列列表表表表不不不不包包包包含含含含PCPC:使使使使用用用用后后后后缀缀缀缀“ “” ”进进进进行行行行数数数数据据据据传传传传送送送送且且且且时时时时,加加加加载载载载存存存存储储储储的的的的是是是是用用用用户户户户模模模模式式式式的的的的寄寄寄寄存器,而不是当前模式的寄存器。存器,而不是当前模式的寄存器。存器,而不是当前模式的寄存器。存器,而不是当前模式的寄存器。寄寄寄寄存存存存器器器器列列列列表表表表包包包包含含含含有有有有PCPC:除除除除了了了了正正正正常常常常的的的的多多多多寄寄寄寄存存存存器传送外,还要将器传送外,还要将器传送外,还要将器传送外,还
81、要将SPSRSPSR拷贝到拷贝到拷贝到拷贝到CPSRCPSR中。中。中。中。该用法可用于异常处理返回。该用法可用于异常处理返回。该用法可用于异常处理返回。该用法可用于异常处理返回。禁禁禁禁用用用用情情情情况况况况:后后后后缀缀缀缀“ “” ”不不不不允允允允许许许许在在在在用用用用户户户户模模模模式式式式或或或或系统模式下使用系统模式下使用系统模式下使用系统模式下使用 ,因为它们没有因为它们没有因为它们没有因为它们没有SPSR SPSR 。(5)当)当Rn在寄存器列表中且使用后缀在寄存器列表中且使用后缀“!”对于对于对于对于STMSTM指令,若指令,若指令,若指令,若RnRn为寄存器列表中的最
82、低数为寄存器列表中的最低数为寄存器列表中的最低数为寄存器列表中的最低数字的寄存器,则会将字的寄存器,则会将字的寄存器,则会将字的寄存器,则会将RnRn的初值保存;的初值保存;的初值保存;的初值保存;其它情况下其它情况下其它情况下其它情况下RnRn的加载值和存储值不可预知。的加载值和存储值不可预知。的加载值和存储值不可预知。的加载值和存储值不可预知。(6)地址字对齐)地址字对齐这些指令寻址是字对齐的,即忽略地这些指令寻址是字对齐的,即忽略地址位址位1:0。(7)关于模式项)关于模式项LDM/STMLDM/STM的的的的主主主主要要要要用用用用途途途途是是是是现现现现场场场场保保保保护护护护、数数
83、数数据据据据复复复复制制制制和和和和参参参参数数数数传传传传送送送送等等等等。其其其其模模模模式式式式有有有有如如如如下下下下8 8种种种种(前前前前面面面面4 4种种种种用用用用于于于于数数数数据据据据块的传输(块的传输(块的传输(块的传输(为存储操作为存储操作为存储操作为存储操作), , 后面后面后面后面4 4种是堆栈操作)种是堆栈操作)种是堆栈操作)种是堆栈操作): :IAIA: 先传、后地址加先传、后地址加先传、后地址加先传、后地址加4 4;IBIB: 先地址加先地址加先地址加先地址加4 4 、后传;、后传;、后传;、后传;DADA:先传、后地址减:先传、后地址减:先传、后地址减:先传
84、、后地址减4 4;DBDB:先地址减:先地址减:先地址减:先地址减4 4 、后传;、后传;、后传;、后传;FDFD: 满递减堆栈,先地址减满递减堆栈,先地址减满递减堆栈,先地址减满递减堆栈,先地址减4 4、后传,与、后传,与、后传,与、后传,与DBDB对应;对应;对应;对应;EDED: 空递减堆栈,先传、后地址减空递减堆栈,先传、后地址减空递减堆栈,先传、后地址减空递减堆栈,先传、后地址减4 4,与,与,与,与DADA对应;对应;对应;对应;FAFA: 满递增堆栈,先地址加满递增堆栈,先地址加满递增堆栈,先地址加满递增堆栈,先地址加4 4、后传,与、后传,与、后传,与、后传,与IBIB对应;对
85、应;对应;对应;EAEA: 空递增堆栈,先传、后地址加空递增堆栈,先传、后地址加空递增堆栈,先传、后地址加空递增堆栈,先传、后地址加4 4,与,与,与,与IAIA对应。对应。对应。对应。(7)关于模式项)关于模式项LDM/STMLDM/STM的的的的主主主主要要要要用用用用途途途途是是是是现现现现场场场场保保保保护护护护、数数数数据据据据复复复复制制制制和和和和参参参参数数数数传传传传送送送送等等等等。其其其其模模模模式式式式有有有有如如如如下下下下8 8种种种种(前前前前面面面面4 4种种种种用用用用于于于于数数数数据据据据块的传输(块的传输(块的传输(块的传输(为加载寄存器为加载寄存器为加
86、载寄存器为加载寄存器) ),后面,后面,后面,后面4 4种是堆栈操作)种是堆栈操作)种是堆栈操作)种是堆栈操作): :IAIA: 先传、后地址加先传、后地址加先传、后地址加先传、后地址加4 4;IBIB: 先地址加先地址加先地址加先地址加4 4 、后传;、后传;、后传;、后传;DADA:先传、后地址减:先传、后地址减:先传、后地址减:先传、后地址减4 4;DBDB:先地址减:先地址减:先地址减:先地址减4 4 、后传;、后传;、后传;、后传;FDFD: 满递减堆栈,先减地址、后传,与满递减堆栈,先减地址、后传,与满递减堆栈,先减地址、后传,与满递减堆栈,先减地址、后传,与IAIA对应;对应;对
87、应;对应;EDED: 空递减堆栈,先传、后减地址,与空递减堆栈,先传、后减地址,与空递减堆栈,先传、后减地址,与空递减堆栈,先传、后减地址,与IBIB对应;对应;对应;对应;FAFA: 满递增堆栈,先加地址、后传,与满递增堆栈,先加地址、后传,与满递增堆栈,先加地址、后传,与满递增堆栈,先加地址、后传,与DADA对应;对应;对应;对应;EAEA: 空递增堆栈,先传、后加地址,与空递增堆栈,先传、后加地址,与空递增堆栈,先传、后加地址,与空递增堆栈,先传、后加地址,与DBDB对应。对应。对应。对应。3、应用举例、应用举例LDMIA R0!LDMIA R0!,R3 - R9R3 - R9 ;加载;
88、加载;加载;加载R0R0指向地址上的多字数据,保存到指向地址上的多字数据,保存到指向地址上的多字数据,保存到指向地址上的多字数据,保存到R3R9R3R9中,中,中,中,R0R0值更新。值更新。值更新。值更新。STMIA R1!STMIA R1!,R3 - R9R3 - R9 ;将;将;将;将R3R3R9R9的数据存储到的数据存储到的数据存储到的数据存储到R1R1指向的地址上,指向的地址上,指向的地址上,指向的地址上,R1R1值更新值更新值更新值更新 。STMFD SP!STMFD SP!,R0 - R7R0 - R7,LR LR ;现场保存,将;现场保存,将;现场保存,将;现场保存,将R0R0
89、R7R7、LRLR入栈,入栈,入栈,入栈,SPSP值更新值更新值更新值更新 。LDMFD SP!LDMFD SP!,R0 - R7R0 - R7,PC PC ;恢复现场,包括;恢复现场,包括;恢复现场,包括;恢复现场,包括CPSRCPSR,异常处理返回,异常处理返回,异常处理返回,异常处理返回,SPSP值更新。值更新。值更新。值更新。三、三、单寄存器交换指令(单寄存器交换指令(SWP)SWPSWP指令指令指令指令用于将一个存储单元用于将一个存储单元用于将一个存储单元用于将一个存储单元( (该单元地址放在寄存器该单元地址放在寄存器该单元地址放在寄存器该单元地址放在寄存器RnRn中中中中) )的内
90、容读取到一个寄存器的内容读取到一个寄存器的内容读取到一个寄存器的内容读取到一个寄存器RdRd中,同时将另一个寄存中,同时将另一个寄存中,同时将另一个寄存中,同时将另一个寄存器器器器RmRm的内容写入到该存储单元中。的内容写入到该存储单元中。的内容写入到该存储单元中。的内容写入到该存储单元中。1、指令格式、指令格式SWPcondB RdSWPcondB Rd,RmRm,RnRn B B为可选后缀为可选后缀为可选后缀为可选后缀,若有,若有,若有,若有B B,则交换字节,否则交换,则交换字节,否则交换,则交换字节,否则交换,则交换字节,否则交换3232位字位字位字位字 RdRd为被加载的寄存器为被加
91、载的寄存器为被加载的寄存器为被加载的寄存器 RmRm的数据的数据的数据的数据用于存储到用于存储到用于存储到用于存储到RnRn所指的地址中所指的地址中所指的地址中所指的地址中 若若若若RmRm与与与与RdRd相同相同相同相同,则为寄存器与存储器内容进行交换,则为寄存器与存储器内容进行交换,则为寄存器与存储器内容进行交换,则为寄存器与存储器内容进行交换 RnRn为要进行数据交换的存储器地址,为要进行数据交换的存储器地址,为要进行数据交换的存储器地址,为要进行数据交换的存储器地址,RnRn不能与不能与不能与不能与RdRd和和和和RmRm相同。相同。相同。相同。2、指令举例、指令举例 SWP R1,R
92、1,R0 ;将;将R1的内容与的内容与R0指向的存储单元指向的存储单元的内容进行交换。的内容进行交换。 SWPB R1,R2,R0 ;将;将R0指向的存储单元的内容读取指向的存储单元的内容读取1字节数据到字节数据到R1中中(高高24位清零位清零),并将,并将R2的的内容写入到该内存单元中内容写入到该内存单元中(最低字节有效最低字节有效) 3.3.2 数据处理指令数据处理指令主要内容主要内容1、数据处理指令概述、数据处理指令概述2、算术运算指令、算术运算指令3、逻辑运算指令、逻辑运算指令4、数据传送指令、数据传送指令5、比较指令、比较指令6、测试指令、测试指令3.3.2.1 数据处理指令概述数据
93、处理指令概述1、ARM数据处理指令的功能数据处理指令的功能主要完成寄存器中数据的算术和逻辑运算操作主要完成寄存器中数据的算术和逻辑运算操作主要完成寄存器中数据的算术和逻辑运算操作主要完成寄存器中数据的算术和逻辑运算操作。2、ARM数据处理指令的特点数据处理指令的特点操作数来源:操作数来源:操作数来源:操作数来源:所有的操作数要么来自寄存器,要么所有的操作数要么来自寄存器,要么所有的操作数要么来自寄存器,要么所有的操作数要么来自寄存器,要么来自立即数,不会来自存储器。来自立即数,不会来自存储器。来自立即数,不会来自存储器。来自立即数,不会来自存储器。操作结果:操作结果:操作结果:操作结果:如果有
94、结果,则结果一定是为如果有结果,则结果一定是为如果有结果,则结果一定是为如果有结果,则结果一定是为3232位宽、位宽、位宽、位宽、或或或或6464位宽(长乘法指令),并且放在一个或两个位宽(长乘法指令),并且放在一个或两个位宽(长乘法指令),并且放在一个或两个位宽(长乘法指令),并且放在一个或两个寄存器中,不会写入存储器。寄存器中,不会写入存储器。寄存器中,不会写入存储器。寄存器中,不会写入存储器。有第二个操作数(除了乘法指令)有第二个操作数(除了乘法指令)有第二个操作数(除了乘法指令)有第二个操作数(除了乘法指令) Operand2 Operand2 :切记其三种形式:立即数、寄存器、寄存器
95、移位。切记其三种形式:立即数、寄存器、寄存器移位。切记其三种形式:立即数、寄存器、寄存器移位。切记其三种形式:立即数、寄存器、寄存器移位。乘法指令的操作数:乘法指令的操作数:乘法指令的操作数:乘法指令的操作数:全部是寄存器。全部是寄存器。全部是寄存器。全部是寄存器。3、ARM数据处理指令分类数据处理指令分类2222条可分为条可分为条可分为条可分为5 5类:类:类:类:算术运算指令:算术运算指令:算术运算指令:算术运算指令: ADDADD ADC ADC SUBSUB SBC SBC RSB RSB RSC RSCMUL MLA UMULL UMLAL SMULL SMLALMUL MLA UM
96、ULL UMLAL SMULL SMLAL逻辑运算指令:逻辑运算指令:逻辑运算指令:逻辑运算指令: ANDANDORRORR EOR BIC EOR BIC数据传送指令:数据传送指令:数据传送指令:数据传送指令: MOVMOV MVN MVN比较指令:比较指令:比较指令:比较指令: CMP CMNCMP CMN测试指令:测试指令:测试指令:测试指令: TST TEQTST TEQ上述指令只能对寄存器操作,不能针对存储器。上述指令只能对寄存器操作,不能针对存储器。上述指令只能对寄存器操作,不能针对存储器。上述指令只能对寄存器操作,不能针对存储器。4、数据处理指令对程序状态寄存器、数据处理指令对程
97、序状态寄存器CPSR的影响的影响(1 1)选择)选择)选择)选择“ “S S” ”后缀问题:后缀问题:后缀问题:后缀问题:指令中可以选择指令中可以选择指令中可以选择指令中可以选择s s后缀,以影响状态标志。但是比后缀,以影响状态标志。但是比后缀,以影响状态标志。但是比后缀,以影响状态标志。但是比较指令(较指令(较指令(较指令(cmpcmp、cmncmn、tsttst和和和和teqteq)不需要后缀)不需要后缀)不需要后缀)不需要后缀S S,它,它,它,它们总会直接影响们总会直接影响们总会直接影响们总会直接影响CPSRCPSR中的状态标志。中的状态标志。中的状态标志。中的状态标志。 (2 2)对
98、)对)对)对CPSRCPSR中标志位的影响:中标志位的影响:中标志位的影响:中标志位的影响: 标志位:标志位:标志位:标志位:如果结果为负,则标志位置;否则清。如果结果为负,则标志位置;否则清。如果结果为负,则标志位置;否则清。如果结果为负,则标志位置;否则清。 标志位:标志位:标志位:标志位:如果结果为,则标志位置;否则清。如果结果为,则标志位置;否则清。如果结果为,则标志位置;否则清。如果结果为,则标志位置;否则清。 标志位:标志位:标志位:标志位:如果是加、减运算指令或比较指令时,标志位如果是加、减运算指令或比较指令时,标志位如果是加、减运算指令或比较指令时,标志位如果是加、减运算指令或
99、比较指令时,标志位设置为的进位输出;否则设置为移位器的移位输出。设置为的进位输出;否则设置为移位器的移位输出。设置为的进位输出;否则设置为移位器的移位输出。设置为的进位输出;否则设置为移位器的移位输出。如果不需要移位,则保持不变。如果不需要移位,则保持不变。如果不需要移位,则保持不变。如果不需要移位,则保持不变。 标志位:标志位:标志位:标志位:在非加减操作中,标志位保持原值。在加减操在非加减操作中,标志位保持原值。在加减操在非加减操作中,标志位保持原值。在加减操在非加减操作中,标志位保持原值。在加减操作中,如果有溢出,则置;不发生溢出,则清。作中,如果有溢出,则置;不发生溢出,则清。作中,如
100、果有溢出,则置;不发生溢出,则清。作中,如果有溢出,则置;不发生溢出,则清。(3)关于恢复)关于恢复CPSR原值问题:原值问题:如果指令带有如果指令带有如果指令带有如果指令带有S S后缀后缀后缀后缀(除了比较指令以外),(除了比较指令以外),(除了比较指令以外),(除了比较指令以外),同时又以同时又以同时又以同时又以PCPC为目标寄存器进行操作,为目标寄存器进行操作,为目标寄存器进行操作,为目标寄存器进行操作,在异常模式下:在异常模式下:在异常模式下:在异常模式下:则操作的同时从则操作的同时从则操作的同时从则操作的同时从SPSRSPSR恢复恢复恢复恢复CPSRCPSR。比如:。比如:。比如:。
101、比如: movs pc, #0xffmovs pc, #0xff/* cpsr = spsr; pc = 0xff /* cpsr = spsr; pc = 0xff */*/ adds pc, r1, #0xffffff00adds pc, r1, #0xffffff00/* cpsr = spsr; pc = r1 + 0xffffff00 */* cpsr = spsr; pc = r1 + 0xffffff00 */ ands pc, r1, r2ands pc, r1, r2/* cpsr = spsr; pc = r1 & r2; */* cpsr = spsr; pc = r1
102、& r2; */在在在在useruser或者或者或者或者systemsystem模式:模式:模式:模式:会产生不可预料的结果,因为会产生不可预料的结果,因为会产生不可预料的结果,因为会产生不可预料的结果,因为在这两种模式下没有在这两种模式下没有在这两种模式下没有在这两种模式下没有SPSRSPSR。数据处理指令的二进制编码数据处理指令的二进制编码add r0, r1, #0xffadd r0, r1, r1, LSL r2add r0, r1, r1, LSL #315 5、数据处理指令的详细列表、数据处理指令的详细列表、数据处理指令的详细列表、数据处理指令的详细列表(未含(未含(未含(未含6
103、6条乘法指令)条乘法指令)条乘法指令)条乘法指令)操作码操作码24:21助记符助记符意意 义义效效 果果0000AND逻辑位与逻辑位与Rd = Rn AND Op20001EOR逻辑位异或逻辑位异或Rd = Rn EOR Op20010SUB减减Rd = Rn - Op20011RSB反向减反向减Rd = Op2 Rn0100ADD加加Rd = Rn + Op20101ADC带进位加带进位加Rd = Rn + Op2 + C0110SBC带进位减带进位减Rd = Rn - Op2 + C -10111RSC反向带进位减反向带进位减Rd = Op2 - Rn + C -11000TST测试测试根
104、据根据Rn AND Op2设置条件码设置条件码1001TEQ测试相等测试相等根据根据Rn EOR Op2设置条件设置条件1010CMP比较比较根据根据Rn - Op2设置条件码设置条件码1011CMN负数比较负数比较根据根据Rn + Op2设置条件码设置条件码1100ORR逻辑位或逻辑位或Rd = Rn OR Op21101MOV传送传送Rd = Op21110BIC位清零位清零Rd = Rn AND NOT Op21111MVN求反求反Rd = NOT Op23.3.2.2 算术运算指令算术运算指令一、加减运算指令一、加减运算指令1、 ADD加法运算指令加法运算指令指令格式指令格式指令格式指
105、令格式ADDcondS RdADDcondS Rd,RnRn,operand2operand2ADDADD指令将指令将指令将指令将operand2operand2的数据与的数据与的数据与的数据与RnRn的值相加,的值相加,的值相加,的值相加,结果保存到结果保存到结果保存到结果保存到RdRd寄存器。寄存器。寄存器。寄存器。指令举例指令举例指令举例指令举例ADDS R1ADDS R1,R1R1,#1 #1 ;R1R1R1+1R1+1ADDS R3ADDS R3,R1R1,R2R2,LSL #2LSL #2; R3R3R1+R22 R1+R22 2、ADC带进位加法指令带进位加法指令指令格式指令格式
106、ADCcondS Rd,Rn,operand2ADC指令将指令将operand2的数据与的数据与Rn的值的值相加,再加上相加,再加上CPSR中的中的C条件标志位,结果条件标志位,结果保存到保存到Rd寄存器。寄存器。指令举例指令举例ADDS R4ADDS R4,R0R0,R2 R2 ;使用;使用;使用;使用ADCADC实现实现实现实现6464位加法位加法位加法位加法ADC R5ADC R5,R1R1,R3 R3 ;(R5(R5、R4)R4)(R1(R1、R0)+(R3R0)+(R3、R2)R2)3、SUB减法运算指令减法运算指令指令格式指令格式SUBcondS Rd,Rn,operand2 SU
107、B指令用寄存器指令用寄存器Rn减去减去operand2,结果保存到结果保存到Rd中。中。 指令举例指令举例指令举例指令举例SUBS R0,R0,#l ;R0R0-1SUB R6,R7,#0x10 ;R6R7-0x104、SBC带进位减法指令带进位减法指令指令格式指令格式指令格式指令格式SBCcondS RdSBCcondS Rd,RnRn,operand2operand2 SBC SBC指令用寄存器指令用寄存器指令用寄存器指令用寄存器RnRn减去减去减去减去operand2operand2,再减去,再减去,再减去,再减去CPSRCPSR中的中的中的中的C C条件标志位的反码,结果保存到条件标志
108、位的反码,结果保存到条件标志位的反码,结果保存到条件标志位的反码,结果保存到RdRd中。中。中。中。指令举例指令举例指令举例指令举例SUBS R4SUBS R4,R0R0,R2 R2 ;使用;使用;使用;使用SBCSBC实现实现实现实现6464位减法,位减法,位减法,位减法,SBC R5SBC R5,R1R1,R3 R3 ;(R5,R4)(R5,R4)(R1,R0)-(R1,R0)-(R3,R2)(R3,R2)5、 RSB反向减法指令反向减法指令指令格式如下:指令格式如下:指令格式如下:指令格式如下:RSBcondS RdRSBcondS Rd,RnRn,operand2operand2 RS
109、BRSB指令用寄存器指令用寄存器指令用寄存器指令用寄存器operand2operand2减去减去减去减去RnRn,结果保,结果保,结果保,结果保存到存到存到存到RdRd中。中。中。中。 指令举例如下:指令举例如下:指令举例如下:指令举例如下:RSB R3RSB R3,R1R1,#0xFF00 #0xFF00 ;R3R30xFF00-0xFF00-R1R1RSBS R1RSBS R1,R2R2,R2R2,LSL #2 LSL #2 ;R1R1R22-R22-R2R2 ;(R1 (R1 =R23)=R23)6、RSC带进位反向减法指令带进位反向减法指令指令格式如下:指令格式如下:指令格式如下:指令
110、格式如下:RSCcondS RdRSCcondS Rd,RnRn,operand2operand2RSC RSC 指令用寄存器指令用寄存器指令用寄存器指令用寄存器operand2operand2减去减去减去减去RnRn,再减去,再减去,再减去,再减去CPSRCPSR中的中的中的中的C C条件标志位的反码,结果保存到条件标志位的反码,结果保存到条件标志位的反码,结果保存到条件标志位的反码,结果保存到RdRd中。中。中。中。指令举例如下:指令举例如下:指令举例如下:指令举例如下:RSBS R2RSBS R2,R0R0,#0#0;求一个;求一个;求一个;求一个3232位数位数位数位数的负数的负数的负
111、数的负数RSC R3RSC R3,R1R1,#0 #0 ;使用;使用;使用;使用RSCRSC指令实现指令实现指令实现指令实现 ;求;求;求;求6464位数值的负数位数值的负数位数值的负数位数值的负数 二、乘法指令二、乘法指令ARMARM有两类乘法指令:有两类乘法指令:有两类乘法指令:有两类乘法指令:3232位的乘法指令,即乘法操作的结果为位的乘法指令,即乘法操作的结果为位的乘法指令,即乘法操作的结果为位的乘法指令,即乘法操作的结果为3232位;位;位;位;6464位的乘法指令,即乘法操作的结果为位的乘法指令,即乘法操作的结果为位的乘法指令,即乘法操作的结果为位的乘法指令,即乘法操作的结果为64
112、64位。位。位。位。MUL Rd,Rn,RmMUL Rd,Rn,Rm3232位乘法指令位乘法指令位乘法指令位乘法指令MLA Rd,Rn,Rm,RaMLA Rd,Rn,Rm,Ra3232位乘加指令位乘加指令位乘加指令位乘加指令UMULL RdL,RdH,Rn,RmUMULL RdL,RdH,Rn,Rm6464位无符号乘法位无符号乘法位无符号乘法位无符号乘法UMLAL RdL,RdH,Rn,RmUMLAL RdL,RdH,Rn,Rm6464位无符号乘加位无符号乘加位无符号乘加位无符号乘加SMULL RdL,RdH,Rn,RmSMULL RdL,RdH,Rn,Rm6464位有符号乘法位有符号乘法位有
113、符号乘法位有符号乘法SMLAL RdL,RdH,Rn,RmSMLAL RdL,RdH,Rn,Rm6464位有符号乘加位有符号乘加位有符号乘加位有符号乘加二、乘法指令二、乘法指令二、乘法指令二、乘法指令ARMARM有两类乘法指令:有两类乘法指令: 3232位的乘法指令,即乘法操作的结果为位的乘法指令,即乘法操作的结果为3232位;位; 6464位的乘法指令,即乘法操作的结果为位的乘法指令,即乘法操作的结果为6464位。位。助记符助记符助记符助记符说说说说 明明明明操操操操 作作作作条件码位置条件码位置条件码位置条件码位置MUL Rd,Rm,RsMUL Rd,Rm,Rs3232位乘法指令位乘法指令
114、位乘法指令位乘法指令RdRdRm*Rs(RdRm*Rs(RdRm)Rm)MUA Rd,Rm,Rs,RnMUA Rd,Rm,Rs,Rn3232位乘加指令位乘加指令位乘加指令位乘加指令RdRdRm*Rs+Rn Rm*Rs+Rn (Rd(RdRm)Rm)UMULL UMULL RdL,RdH,Rm,Rs,RnRdL,RdH,Rm,Rs,Rn6464位无符号乘位无符号乘位无符号乘位无符号乘法法法法(RdL,RdH)(RdL,RdH)Rm*RsRm*RsUMAL UMAL RdL,RdH,Rm,Rs,RnRdL,RdH,Rm,Rs,Rn6464位无符号乘位无符号乘位无符号乘位无符号乘加加加加(RdL,R
115、dH)(RdL,RdH)Rm*RsRm*RsSMULL SMULL RdL,RdH,Rm,Rs,RnRdL,RdH,Rm,Rs,Rn6464位有符号乘位有符号乘位有符号乘位有符号乘法法法法SMULL SMULL RdL,RdH,Rm,Rs,RnRdL,RdH,Rm,Rs,Rn6464位有符号乘位有符号乘位有符号乘位有符号乘加加加加1、 MUL32位乘法指令位乘法指令 指令格式如下:指令格式如下:MULcondS RdMULcondS Rd,RmRm,Rs Rs ;RdRdRm*RsRm*Rs MUL指令将指令将Rm和和Rs中的值相乘,结果中的值相乘,结果的低的低32位保存到位保存到Rd中。中。
116、指令举例如下:指令举例如下:MUL R1MUL R1,R2R2,R3 R3 ;R1=R2R3R1=R2R3MULS R0MULS R0,R3R3,R7 R7 ;R0=R3R7R0=R3R7, ;设置;设置;设置;设置CPSRCPSR的的的的NN位和位和位和位和Z Z位位位位 2、 MLA32位乘加指令位乘加指令指令格式如下指令格式如下: MLAcondS RdMLAcondS Rd,RmRm,RsRs,Rn Rn ; RdRdRm*Rs+RnRm*Rs+Rn MLA指令将指令将Rm和和Rs中的值相乘,再将中的值相乘,再将乘积加上第乘积加上第3个操作数,结果的低个操作数,结果的低32位保存位保存
117、到到Rd中。中。指令举例如下:指令举例如下: MLA R1,R2,R3,R0 ;R1=R2R3+R03、 UMULL64位无符号乘法指令位无符号乘法指令指令格式如下:指令格式如下:指令格式如下:指令格式如下: UMULLcondS RdLoUMULLcondS RdLo,RdHiRdHi,RmRm,RsRs ; RdHi, RdLoRdHi, RdLo Rm*RsRm*Rs UMULL指令将指令将Rm和和Rs中的值作无符中的值作无符号数相乘,结果的低号数相乘,结果的低32位保存到位保存到RdLo中,中,高高32位保存到位保存到RdHi中。中。指令举例如下:指令举例如下:指令举例如下:指令举例如
118、下: UMULL R0UMULL R0,R1R1,R5R5,R8 R8 ;(R1,R0)(R1,R0)R5R8R5R84、 UMLAL64位无符号乘加指令位无符号乘加指令指令格式如下:指令格式如下:指令格式如下:指令格式如下: UMLALcondS RdLoUMLALcondS RdLo,RdHiRdHi,RmRm,RsRs ;RdHi, RdLoRdHi, RdLo Rm*Rs+ RdHi, Rm*Rs+ RdHi, RdLoRdLo UMLALUMLAL指令将指令将指令将指令将RmRm和和和和RsRs中的值作无符号数相中的值作无符号数相中的值作无符号数相中的值作无符号数相乘,乘,乘,乘,6
119、464位乘积与位乘积与位乘积与位乘积与RdHiRdHi、RdLoRdLo相加,结果的低相加,结果的低相加,结果的低相加,结果的低3232位位位位保存到保存到保存到保存到RdLoRdLo中,而高中,而高中,而高中,而高3232位保存到位保存到位保存到位保存到RdHiRdHi中。中。中。中。指令举例如下:指令举例如下:指令举例如下:指令举例如下: UMLAL R0 UMLAL R0,R1R1,R5R5,R8 R8 ;(R1,R0)(R1,R0)R5R8+(R1,R0)R5R8+(R1,R0)第第6次到此次到此5、SMULL64位有符号乘法指令位有符号乘法指令指令格式如下:指令格式如下:SMULLc
120、ondS RdLoSMULLcondS RdLo,RdHiRdHi,RmRm,RsRs ; RdHi, RdLoRdHi, RdLo Rm*Rs Rm*Rs SMULL指令将指令将Rm和和Rs中的值作有符号中的值作有符号数相乘,结果的低数相乘,结果的低32位保存到位保存到RdLo中,而高中,而高32位保存到位保存到RdHi中。中。指令举例如下:指令举例如下: SMULL R2SMULL R2,R3R3,R7R7,R6 R6 ;(R3,R2)(R3,R2)R7R6R7R66、 SMLAL64位有符号乘加指令位有符号乘加指令 指令格式如下:指令格式如下:指令格式如下:指令格式如下:SMLALcon
121、dS RdLoSMLALcondS RdLo,RdHiRdHi,RmRm,RsRs ; RdHi, RdLoRdHi, RdLo Rm*Rs+ RdHi, Rm*Rs+ RdHi, RdLoRdLo SMLALSMLAL指令将指令将指令将指令将RmRm和和和和RsRs中的值作有符号数相中的值作有符号数相中的值作有符号数相中的值作有符号数相乘,乘,乘,乘,6464位乘积与位乘积与位乘积与位乘积与RdHiRdHi、RdLoRdLo相加,结果的低相加,结果的低相加,结果的低相加,结果的低3232位位位位保存到保存到保存到保存到RdLoRdLo中,高中,高中,高中,高3232位保存到位保存到位保存到位
122、保存到RdHiRdHi中。中。中。中。指令举例如下:指令举例如下:指令举例如下:指令举例如下:SMLAL R2SMLAL R2,R3R3,R7R7,R6 R6 ; ;(R3,R2)(R3,R2)R7R6+(R3,R2)R7R6+(R3,R2)7、乘法指令的特点、乘法指令的特点a.不支持第不支持第不支持第不支持第2 2操作数为立即数。操作数为立即数。操作数为立即数。操作数为立即数。b.结果寄存器不能与第一源寄存器相同。结果寄存器不能与第一源寄存器相同。结果寄存器不能与第一源寄存器相同。结果寄存器不能与第一源寄存器相同。RdRd、RdHiRdHi、RdLoRdLo不能与不能与不能与不能与RmRm为
123、同一寄存器。为同一寄存器。为同一寄存器。为同一寄存器。RdHiRdHi和和和和RdLoRdLo不能为同一寄存器。不能为同一寄存器。不能为同一寄存器。不能为同一寄存器。c.避免将避免将避免将避免将R15R15定义为任一操作数或结果寄存器。定义为任一操作数或结果寄存器。定义为任一操作数或结果寄存器。定义为任一操作数或结果寄存器。d.早期的早期的早期的早期的ARMARM处理器仅支持处理器仅支持处理器仅支持处理器仅支持3232位乘法指令。位乘法指令。位乘法指令。位乘法指令。ARM7ARM7版本和后续的在名字中有版本和后续的在名字中有版本和后续的在名字中有版本和后续的在名字中有MM的处理器才的处理器才的
124、处理器才的处理器才支持支持支持支持6464位乘法指令。位乘法指令。位乘法指令。位乘法指令。a. 对标志位的影响对标志位的影响对对对对NN标志位:标志位:标志位:标志位:对有符号数乘法,若结果是对有符号数乘法,若结果是对有符号数乘法,若结果是对有符号数乘法,若结果是3232位位位位指令形式,指令形式,指令形式,指令形式,RdRd的第的第的第的第3131位是标志位位是标志位位是标志位位是标志位NN;对于产生;对于产生;对于产生;对于产生长结果的指令形式,长结果的指令形式,长结果的指令形式,长结果的指令形式,RdHiRdHi的第的第的第的第3131位是标志位。位是标志位。位是标志位。位是标志位。对对
125、对对Z Z标志位:标志位:标志位:标志位:如果如果如果如果RdRd或或或或RdHiRdHi、RdLoRdLo为为为为0 0,则标,则标,则标,则标志位志位志位志位Z Z置位。置位。置位。置位。对对对对V V标志位:标志位:标志位:标志位:乘法指令乘法指令乘法指令乘法指令不影响不影响不影响不影响V V标志位。标志位。标志位。标志位。对对对对C C标志位:标志位:标志位:标志位: ARM v5ARM v5及以上的版本及以上的版本及以上的版本及以上的版本不影响不影响不影响不影响C C标标标标志位;志位;志位;志位; ARM v5ARM v5以前的版本,以前的版本,以前的版本,以前的版本,C C标志位
126、数值不标志位数值不标志位数值不标志位数值不确定。确定。确定。确定。3.3.2.3 逻辑运算指令逻辑运算指令1、AND逻辑逻辑“与与”操作指令操作指令指令格式如下:指令格式如下:指令格式如下:指令格式如下:ANDcondS RdANDcondS Rd,RnRn,operand2operand2ANDAND指令将指令将指令将指令将operand2operand2的值与寄存器的值与寄存器的值与寄存器的值与寄存器RnRn的值按的值按的值按的值按位逻辑位逻辑位逻辑位逻辑“ “与与与与” ”操作,结果保存到操作,结果保存到操作,结果保存到操作,结果保存到RdRd中。中。中。中。指令举例如下:指令举例如下:
127、指令举例如下:指令举例如下:ANDS R0ANDS R0,R0R0,#0x01 #0x01 ;R0R0R0&0x01R0&0x01 ;取出最低位数据;取出最低位数据;取出最低位数据;取出最低位数据AND R2AND R2,R1R1,R3 R3 ;R2R2R1&R3R1&R3 ANDAND指令可用于提取寄存器中某些位的值。指令可用于提取寄存器中某些位的值。指令可用于提取寄存器中某些位的值。指令可用于提取寄存器中某些位的值。2、ORR逻辑逻辑“或或”操作指令操作指令指令格式如下:指令格式如下:指令格式如下:指令格式如下: ORRcondS RdORRcondS Rd,RnRn,operand2op
128、erand2 ORRORR指令将指令将指令将指令将operand2operand2的值与寄存器的值与寄存器的值与寄存器的值与寄存器RnRn的值按位逻辑的值按位逻辑的值按位逻辑的值按位逻辑“ “或或或或” ”操作,操作,操作,操作,结果保存到结果保存到结果保存到结果保存到RdRd中。中。中。中。 指令举例如下:指令举例如下:指令举例如下:指令举例如下: ORR R0ORR R0,R0R0,#0x0F #0x0F ;将;将;将;将R0R0的低的低的低的低4 4位置位置位置位置1 1 ORRORR指令用于将寄存器中某些位的值设置成指令用于将寄存器中某些位的值设置成指令用于将寄存器中某些位的值设置成指
129、令用于将寄存器中某些位的值设置成1 1。3、 EOR逻辑逻辑“异或异或”操作指令操作指令指令格式如下:指令格式如下:指令格式如下:指令格式如下:EORcondS RdEORcondS Rd,RnRn,operand2operand2 EOREOR指令将指令将指令将指令将operand2operand2的值与寄存器的值与寄存器的值与寄存器的值与寄存器RnRn的值按的值按的值按的值按位逻辑位逻辑位逻辑位逻辑“ “异或异或异或异或” ”操作,结果保存到操作,结果保存到操作,结果保存到操作,结果保存到RdRd中。中。中。中。指令举例如下:指令举例如下:指令举例如下:指令举例如下: EOR R1EOR
130、R1,R1R1,#0x0F #0x0F ;将;将;将;将RlRl的低的低的低的低4 4位取反位取反位取反位取反 EOREORS S R0 R0,R5R5,#0x01 #0x01 ;将;将;将;将R0R0R5R5异或异或异或异或0x010x01, ;并影响标志位并影响标志位并影响标志位并影响标志位 EOR EOR指令可用于将寄存器中某些位的值取反。指令可用于将寄存器中某些位的值取反。指令可用于将寄存器中某些位的值取反。指令可用于将寄存器中某些位的值取反。将某一位与将某一位与将某一位与将某一位与0 0异或,该位值不变;与异或,该位值不变;与异或,该位值不变;与异或,该位值不变;与1 1异或,该位值
131、异或,该位值异或,该位值异或,该位值被求反。被求反。被求反。被求反。4、BIC位清除指令位清除指令指令格式如下:指令格式如下:指令格式如下:指令格式如下:BICcondS RdBICcondS Rd,RnRn,operand2operand2BICBIC指令将寄存器指令将寄存器指令将寄存器指令将寄存器RnRn的值与的值与的值与的值与operand2operand2的值的的值的的值的的值的反码按位逻辑反码按位逻辑反码按位逻辑反码按位逻辑“ “与与与与” ”操作,结果保存到操作,结果保存到操作,结果保存到操作,结果保存到RdRd中。中。中。中。指令举例如下:指令举例如下:指令举例如下:指令举例如下
132、:BIC R1BIC R1,R1R1,#0x0F #0x0F ;将;将;将;将R1R1的低的低的低的低4 4位清位清位清位清0 0, ;其它位不变;其它位不变;其它位不变;其它位不变 BICBIC指令可用于将寄存器中某些位的值设置成指令可用于将寄存器中某些位的值设置成指令可用于将寄存器中某些位的值设置成指令可用于将寄存器中某些位的值设置成0 0。将某一位与将某一位与将某一位与将某一位与1 1做做做做BICBIC操作,该位值被设置成操作,该位值被设置成操作,该位值被设置成操作,该位值被设置成0 0;将某;将某;将某;将某一位与一位与一位与一位与0 0做做做做BICBIC操作,该位值不变。操作,该
133、位值不变。操作,该位值不变。操作,该位值不变。 3.3.2.4 数据传送指令数据传送指令1、 MOV数据传送指令数据传送指令(1 1)指令格式如下:)指令格式如下:)指令格式如下:)指令格式如下:MOVcondS RdMOVcondS Rd,operand2operand2MOVMOV指令将指令将指令将指令将operand2operand2传送到目标寄存器传送到目标寄存器传送到目标寄存器传送到目标寄存器RdRd中。中。中。中。(2 2)指令举例如下:)指令举例如下:)指令举例如下:)指令举例如下:MOVMOVS S R3 R3,R1R1,LSL #2 LSL #2 ;R3R3R12R12;影响
134、标志位影响标志位影响标志位影响标志位MOV PCMOV PC,LR LR ;PCPCLRLR,子程序返回,子程序返回,子程序返回,子程序返回(3)MOV指令的功能指令的功能寄存器之间传送寄存器之间传送寄存器之间传送寄存器之间传送。立即数传送到寄存器中立即数传送到寄存器中立即数传送到寄存器中立即数传送到寄存器中。(。(。(。(8 8位立即数位图)位立即数位图)位立即数位图)位立即数位图)实现单纯的移位操作实现单纯的移位操作实现单纯的移位操作实现单纯的移位操作。MOV RdMOV Rd,RdRd,LSLLSL,#3#3实现子程序调用、从子程序中返回实现子程序调用、从子程序中返回实现子程序调用、从子
135、程序中返回实现子程序调用、从子程序中返回。当。当。当。当PCPC寄存器寄存器寄存器寄存器作为目标寄存器时可以实现程序跳转。作为目标寄存器时可以实现程序跳转。作为目标寄存器时可以实现程序跳转。作为目标寄存器时可以实现程序跳转。实现把当前处理器模式的实现把当前处理器模式的实现把当前处理器模式的实现把当前处理器模式的SPSRSPSR寄存器内容复制寄存器内容复制寄存器内容复制寄存器内容复制到到到到CPSRCPSR中中中中。 方法:方法:方法:方法:当当当当PCPC寄存器作为目标寄存器且指令中寄存器作为目标寄存器且指令中寄存器作为目标寄存器且指令中寄存器作为目标寄存器且指令中S S位被设位被设位被设位被
136、设置时,指令在执行跳转操作的同时,将当前处理器模式置时,指令在执行跳转操作的同时,将当前处理器模式置时,指令在执行跳转操作的同时,将当前处理器模式置时,指令在执行跳转操作的同时,将当前处理器模式的的的的SPSRSPSR寄存器内容复制到寄存器内容复制到寄存器内容复制到寄存器内容复制到CPSRCPSR中。这样可以实现从某中。这样可以实现从某中。这样可以实现从某中。这样可以实现从某些异常中断中返回。些异常中断中返回。些异常中断中返回。些异常中断中返回。 例子:例子:例子:例子:MOVSMOVSPCPC,LRLR2、 MVN数据求反传送指令数据求反传送指令指令格式如下指令格式如下:MVNcondS R
137、d,operand2MVN指令将指令将operand2按位取反后传送到按位取反后传送到目标寄存器目标寄存器Rd中。中。指令举例如下:指令举例如下:MVN R1,#0xFF ;R10xFFFFFF00MVN R1,R2 ; Rl R2取反取反3、比较指令、比较指令(1)CMP比较指令比较指令指令格式如下:指令格式如下:指令格式如下:指令格式如下:CMPcond Rn,operand2 CMP CMP指令将寄存器指令将寄存器指令将寄存器指令将寄存器RnRn的值减去的值减去的值减去的值减去operand2operand2的值,的值,的值,的值,根据操作的结果更新根据操作的结果更新根据操作的结果更新根
138、据操作的结果更新CPSRCPSR中的相应条件标志位,中的相应条件标志位,中的相应条件标志位,中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执以便后面的指令根据相应的条件标志来判断是否执以便后面的指令根据相应的条件标志来判断是否执以便后面的指令根据相应的条件标志来判断是否执行。行。行。行。指令举例如下:指令举例如下:指令举例如下:指令举例如下:CMP R1CMP R1,#10 #10 ;R1R1与与与与1010比较,设置相关标志位比较,设置相关标志位比较,设置相关标志位比较,设置相关标志位 CMPCMP指令与指令与指令与指令与SUBSSUBS指令的区别?指令的区别?指令的区别?指
139、令的区别? (2 2)CMNCMN负数比较指令负数比较指令负数比较指令负数比较指令指令格式如下:指令格式如下:指令格式如下:指令格式如下:CMNcond RnCMNcond Rn,operand2operand2CMNCMN指令将寄存器指令将寄存器指令将寄存器指令将寄存器RnRn的值加上的值加上的值加上的值加上operand2operand2的值,根据的值,根据的值,根据的值,根据操作的结果更新操作的结果更新操作的结果更新操作的结果更新CPSRCPSR中的相应条件标志位,以便后面的指中的相应条件标志位,以便后面的指中的相应条件标志位,以便后面的指中的相应条件标志位,以便后面的指令根据相应的条件
140、标志来判断是否执行。令根据相应的条件标志来判断是否执行。令根据相应的条件标志来判断是否执行。令根据相应的条件标志来判断是否执行。使用方法:使用方法:使用方法:使用方法:一般一般一般一般RnRn中存放的是欲比较的负数,中存放的是欲比较的负数,中存放的是欲比较的负数,中存放的是欲比较的负数,operand2operand2为另一被比较的数。为另一被比较的数。为另一被比较的数。为另一被比较的数。指令举例如下:指令举例如下:指令举例如下:指令举例如下:CMN R0CMN R0,#1 #1 ;R0+1R0+1,判断,判断,判断,判断R0R0是否为是否为是否为是否为1 1的补码。的补码。的补码。的补码。
141、;若是,则;若是,则;若是,则;若是,则Z Z位置位置位置位置1 1。CMNCMN指令与指令与指令与指令与ADDSADDS指令的区别:指令的区别:指令的区别:指令的区别:在于在于在于在于CMNCMN指令不保存指令不保存指令不保存指令不保存运算结果。运算结果。运算结果。运算结果。CMNCMN指令可用于负数比较,比如指令可用于负数比较,比如指令可用于负数比较,比如指令可用于负数比较,比如“ “CMN R0CMN R0,#1#1” ”指令则表示指令则表示指令则表示指令则表示R0R0与与与与-1-1比较。若比较。若比较。若比较。若R0R0为为为为-1(-1(即即即即1 1的补码的补码的补码的补码) )
142、,则,则,则,则Z Z置位;否则置位;否则置位;否则置位;否则Z Z复位复位复位复位4、测试指令、测试指令(1 1)TSTTST位测试指令位测试指令位测试指令位测试指令 指令格式如下:指令格式如下:指令格式如下:指令格式如下:TSTcond RnTSTcond Rn,operand2operand2 TST TST指令将寄存器指令将寄存器指令将寄存器指令将寄存器RnRn的值与的值与的值与的值与operand2operand2的值按位的值按位的值按位的值按位逻辑逻辑逻辑逻辑“ “与与与与” ”操作,根据操作的结果更新操作,根据操作的结果更新操作,根据操作的结果更新操作,根据操作的结果更新CPSR
143、CPSR中的相应条件标志位,中的相应条件标志位,中的相应条件标志位,中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。以便后面的指令根据相应的条件标志来判断是否执行。以便后面的指令根据相应的条件标志来判断是否执行。以便后面的指令根据相应的条件标志来判断是否执行。 指令举例如下:指令举例如下:指令举例如下:指令举例如下: TST R0 TST R0,#0x01 #0x01 ;判断;判断;判断;判断R0R0的最低位是否为的最低位是否为的最低位是否为的最低位是否为0 0 TST Rl TST Rl,#0x0F #0x0F ;判断;判断;判断;判断R1R1的低的低的低的低4 4位是否
144、为位是否为位是否为位是否为0 0TSTTST指令与指令与指令与指令与ANDSANDS指令的区别在于指令的区别在于指令的区别在于指令的区别在于TSTTST指令不保存运算指令不保存运算指令不保存运算指令不保存运算结果。结果。结果。结果。TSTTST指令通常与指令通常与指令通常与指令通常与EQEQ、NENE条件码配合使用。当所有测条件码配合使用。当所有测条件码配合使用。当所有测条件码配合使用。当所有测试位均为试位均为试位均为试位均为0 0时,时,时,时,EQEQ有效。而只要有一个测试位不为有效。而只要有一个测试位不为有效。而只要有一个测试位不为有效。而只要有一个测试位不为0 0,则,则,则,则NEN
145、E有效。有效。有效。有效。 (2)TEQ测试相等指令测试相等指令 指令格式如下:指令格式如下:指令格式如下:指令格式如下:TEQcond RnTEQcond Rn,operand2operand2 TEQ TEQ指令将寄存器指令将寄存器指令将寄存器指令将寄存器RnRn的值与的值与的值与的值与operand2operand2的值的值的值的值按位逻辑按位逻辑按位逻辑按位逻辑“ “异或异或异或异或” ”操作,根据操作的结果更新操作,根据操作的结果更新操作,根据操作的结果更新操作,根据操作的结果更新CPSRCPSR中的相应条件标志位,以便后面的指令根据相应的中的相应条件标志位,以便后面的指令根据相应的
146、中的相应条件标志位,以便后面的指令根据相应的中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。条件标志来判断是否执行。条件标志来判断是否执行。条件标志来判断是否执行。 指令举例如下:指令举例如下:指令举例如下:指令举例如下:TEQ R0TEQ R0,R1 R1 ;比较;比较;比较;比较R0R0与与与与R1R1是否相等是否相等是否相等是否相等 ;( (不影响不影响不影响不影响V V位和位和位和位和C C位位位位) ) TEQ TEQ指令与指令与指令与指令与EORSEORS指令的区别在于指令的区别在于指令的区别在于指令的区别在于TEQTEQ指令不指令不指令不指令不保存运算结果。使
147、用保存运算结果。使用保存运算结果。使用保存运算结果。使用TEQTEQ进行相等测试时,常与进行相等测试时,常与进行相等测试时,常与进行相等测试时,常与EQEQ、NENE条件码配合使用。当两个数据相等时,条件码配合使用。当两个数据相等时,条件码配合使用。当两个数据相等时,条件码配合使用。当两个数据相等时,EQEQ有效;有效;有效;有效;否则否则否则否则NENE有效。有效。有效。有效。3.3.3 分支指令分支指令概述概述在在在在ARMARM中有两种方式可以实现程序的跳转:中有两种方式可以实现程序的跳转:中有两种方式可以实现程序的跳转:中有两种方式可以实现程序的跳转: 一种是使用分支转移指令直接跳转;
148、一种是使用分支转移指令直接跳转;一种是使用分支转移指令直接跳转;一种是使用分支转移指令直接跳转; 另一种则是直接向另一种则是直接向另一种则是直接向另一种则是直接向PCPC寄存器赋值来实现跳转。寄存器赋值来实现跳转。寄存器赋值来实现跳转。寄存器赋值来实现跳转。 ARMARM的的的的分分分分支支支支转转转转移移移移指指指指令令令令,可可可可以以以以从从从从当当当当前前前前指指指指令令令令向向向向前前前前或或或或向向向向后后后后的的的的32MB32MB的的的的地地地地址址址址空空空空间间间间跳跳跳跳转转转转,根根根根据据据据完完完完成成成成的的的的功功功功能能能能它它它它可以分为以下可以分为以下可以
149、分为以下可以分为以下4 4种种种种 : B B 分支指令分支指令分支指令分支指令 BL BL 带链接的分支指令带链接的分支指令带链接的分支指令带链接的分支指令 BX BX 带状态切换的分支指令带状态切换的分支指令带状态切换的分支指令带状态切换的分支指令 BLX BLX 带链接和状态切换的分支指令带链接和状态切换的分支指令带链接和状态切换的分支指令带链接和状态切换的分支指令1、B转移指令转移指令指令格式如下:指令格式如下: Bcond label B指令跳转到指定的地址执行程序。指令跳转到指定的地址执行程序。指令举例如下:指令举例如下: B WAITA ;跳转到;跳转到WAITA标号处标号处 B
150、 0x1234 ;跳转到绝对地址;跳转到绝对地址;跳转到绝对地址;跳转到绝对地址0x12340x1234处处处处转移指令转移指令B限制在当前指令的限制在当前指令的32 MB的的范围内。范围内。例子:例子: 无条件跳转:无条件跳转: B label label 执行执行10次循环:次循环: MOV R0, #10 LOOP SUBS R0,R0, #1 BNE LOOP2、 BL带链接的转移指令带链接的转移指令指令格式如下:指令格式如下:指令格式如下:指令格式如下: BLcond label BLcond label BL BL指令先将指令先将指令先将指令先将下一条指令的地址拷贝到下一条指令的地
151、址拷贝到下一条指令的地址拷贝到下一条指令的地址拷贝到LRLR 链接链接链接链接寄存器中,然后跳转到指定地址运行程序。寄存器中,然后跳转到指定地址运行程序。寄存器中,然后跳转到指定地址运行程序。寄存器中,然后跳转到指定地址运行程序。指令举例如下:指令举例如下:指令举例如下:指令举例如下: BL SUB1 BL SUB1 ;LRLR下条指令地址下条指令地址下条指令地址下条指令地址 ;转至子程序;转至子程序;转至子程序;转至子程序SUB1SUB1处处处处 SUB1 SUB1 MOV PC, LR MOV PC, LR;子程序返回;子程序返回;子程序返回;子程序返回注意:注意:注意:注意:转移地址限制
152、在当前指令的转移地址限制在当前指令的转移地址限制在当前指令的转移地址限制在当前指令的32 MB32 MB的范围内。的范围内。的范围内。的范围内。BLBL指令用于子程序调用。指令用于子程序调用。指令用于子程序调用。指令用于子程序调用。例子:例子:根据不同的条件,执行不同的子程序。根据不同的条件,执行不同的子程序。根据不同的条件,执行不同的子程序。根据不同的条件,执行不同的子程序。 CMP R1, #5 CMP R1, #5 BLLT BLLT ADD11 ADD11 ;有符号数;有符号数;有符号数;有符号数 BLGE BLGE SUB22 SUB22 ;有符号数;有符号数;有符号数;有符号数 A
153、DD11ADD11 SUB22SUB22 注:注:注:注:如果如果如果如果R15R15,只有,只有,只有,只有ADD11ADD11不改变条件码,不改变条件码,不改变条件码,不改变条件码,本例才能正常工作。本例才能正常工作。本例才能正常工作。本例才能正常工作。例子:例子: BL SUB1BL SUB1 SUB1 SUB1 STMFD R13STMFD R13!,R0-R3,R14,R0-R3,R14 BL SUB2 BL SUB2 SUB2 SUB2 注意:注意:注意:注意:在保存在保存在保存在保存R14R14之前子程序不应再调用下一之前子程序不应再调用下一之前子程序不应再调用下一之前子程序不应
154、再调用下一级的嵌套子程序。否则,新的返回地址将覆盖原来级的嵌套子程序。否则,新的返回地址将覆盖原来级的嵌套子程序。否则,新的返回地址将覆盖原来级的嵌套子程序。否则,新的返回地址将覆盖原来的返回地址,就无法返回到原来的调用位置。的返回地址,就无法返回到原来的调用位置。的返回地址,就无法返回到原来的调用位置。的返回地址,就无法返回到原来的调用位置。3、BX带状态切换的转移指令带状态切换的转移指令指令格式如下:指令格式如下: BXcond Rm BX指令跳转到指令跳转到Rm指定的地址执行程序。指定的地址执行程序。若若若若RmRm的位的位的位的位00为为为为1 1,则跳转时自动将,则跳转时自动将,则跳
155、转时自动将,则跳转时自动将CPSRCPSR中的标中的标中的标中的标志志志志T T置位置位置位置位,即把目标地址的代码解释为,即把目标地址的代码解释为,即把目标地址的代码解释为,即把目标地址的代码解释为ThumbThumb代码;代码;代码;代码;若若若若RmRm的位的位的位的位00为为为为0 0,则跳转时自动将,则跳转时自动将,则跳转时自动将,则跳转时自动将CPSRCPSR中的标中的标中的标中的标志志志志T T复位复位复位复位,即把目标地址的代码解释为,即把目标地址的代码解释为,即把目标地址的代码解释为,即把目标地址的代码解释为ARMARM代码代码代码代码。 指令举例如下:指令举例如下: ADR
156、L R0,ThumbFun+1;中等范围的地址读取伪指令中等范围的地址读取伪指令中等范围的地址读取伪指令中等范围的地址读取伪指令 BX R0 ;跳转到跳转到跳转到跳转到R0R0指定的地址,并指定的地址,并指定的地址,并指定的地址,并;根据;根据;根据;根据R0R0的最低位来切换处理的最低位来切换处理的最低位来切换处理的最低位来切换处理;器到;器到;器到;器到ThumbThumb状态。状态。状态。状态。. . ThumbFun 4、BLX 带链接和状态切换的转移指令带链接和状态切换的转移指令指令格式如下:指令格式如下: BLX BLXBLX指指指指令令令令先先先先将将将将下下下下一一一一条条条条
157、指指指指令令令令的的的的地地地地址址址址拷拷拷拷贝贝贝贝到到到到R14 R14 ( (即即即即LR)LR)连连连连接接接接寄寄寄寄存存存存器器器器中中中中,然然然然后后后后跳跳跳跳转转转转到到到到指指指指定定定定地地地地址址址址处处处处执执执执行行行行程程程程序。序。序。序。( (只有只有只有只有V5TV5T及以上体系及以上体系及以上体系及以上体系 支持支持支持支持BLX)BLX)转移转移转移转移地址限制在当前指令的地址限制在当前指令的地址限制在当前指令的地址限制在当前指令的32MB32MB的范围内。的范围内。的范围内。的范围内。3.3.4 协处理器指令协处理器指令 ARMARM协处理器:协处
158、理器:协处理器:协处理器: ARM ARM支持支持支持支持1616个协处理器,用个协处理器,用个协处理器,用个协处理器,用于各种协处理器操作,最常使用的协处理器是用于于各种协处理器操作,最常使用的协处理器是用于于各种协处理器操作,最常使用的协处理器是用于于各种协处理器操作,最常使用的协处理器是用于控制片上功能的系统协处理器,例如控制高速缓存控制片上功能的系统协处理器,例如控制高速缓存控制片上功能的系统协处理器,例如控制高速缓存控制片上功能的系统协处理器,例如控制高速缓存和存储器的管理单元,浮点和存储器的管理单元,浮点和存储器的管理单元,浮点和存储器的管理单元,浮点ARMARM协处理器等,还可协
159、处理器等,还可协处理器等,还可协处理器等,还可以开发专用的协处理器。以开发专用的协处理器。以开发专用的协处理器。以开发专用的协处理器。ARMARM协处理器指令协处理器指令协处理器指令协处理器指令根据其用途主要分为以下三根据其用途主要分为以下三根据其用途主要分为以下三根据其用途主要分为以下三类:类:类:类:协处理器数据操作指令。协处理器数据操作指令。协处理器数据操作指令。协处理器数据操作指令。ARMARM寄存器与协处理器寄存器的数据传送指令。寄存器与协处理器寄存器的数据传送指令。寄存器与协处理器寄存器的数据传送指令。寄存器与协处理器寄存器的数据传送指令。协处理器寄存器和内存单元之间数据存协处理器
160、寄存器和内存单元之间数据存协处理器寄存器和内存单元之间数据存协处理器寄存器和内存单元之间数据存/ /取指令。取指令。取指令。取指令。ARMARM的协处理器指令功能:的协处理器指令功能:的协处理器指令功能:的协处理器指令功能:(1 1)ARMARM处处处处理器初始化理器初始化理器初始化理器初始化ARMARM协处理器的数据处理操作;协处理器的数据处理操作;协处理器的数据处理操作;协处理器的数据处理操作;(2 2)在)在)在)在ARMARM处理器的寄存器和协处理器的寄处理器的寄存器和协处理器的寄处理器的寄存器和协处理器的寄处理器的寄存器和协处理器的寄存器之间传送数据;(存器之间传送数据;(存器之间传
161、送数据;(存器之间传送数据;(3 3)在)在)在)在ARMARM协处理器的协处理器的协处理器的协处理器的寄存器和存储器之间传送数据。寄存器和存储器之间传送数据。寄存器和存储器之间传送数据。寄存器和存储器之间传送数据。ARMARM协处理器指令协处理器指令协处理器指令协处理器指令包括以下包括以下包括以下包括以下5 5条:条:条:条: CDP CDP 协处理器数操作指令协处理器数操作指令协处理器数操作指令协处理器数操作指令 coprocessorcoprocessor LDC LDC 协处理器数据加载指令协处理器数据加载指令协处理器数据加载指令协处理器数据加载指令 STC STC 协处理器数据存储指
162、令协处理器数据存储指令协处理器数据存储指令协处理器数据存储指令 MCR ARM MCR ARM处理器寄存器到协处理器寄存器的处理器寄存器到协处理器寄存器的处理器寄存器到协处理器寄存器的处理器寄存器到协处理器寄存器的数据传送指令数据传送指令数据传送指令数据传送指令 MRC MRC 协处理器寄存器到协处理器寄存器到协处理器寄存器到协处理器寄存器到ARMARM处理器寄存器的处理器寄存器的处理器寄存器的处理器寄存器的数据传送指令数据传送指令数据传送指令数据传送指令一、一、 CDP协处理器数据操作指令协处理器数据操作指令 ARMARM处理器通过处理器通过处理器通过处理器通过CDPCDP指令通知指令通知指
163、令通知指令通知ARMARM协处理器执行特定的操作。协处协处理器执行特定的操作。协处协处理器执行特定的操作。协处协处理器执行特定的操作。协处理器数据操作完全是协处理器内部的操作,用于初始化理器数据操作完全是协处理器内部的操作,用于初始化理器数据操作完全是协处理器内部的操作,用于初始化理器数据操作完全是协处理器内部的操作,用于初始化ARMARM协处理器,完协处理器,完协处理器,完协处理器,完成协处理器寄存器的状态改变。成协处理器寄存器的状态改变。成协处理器寄存器的状态改变。成协处理器寄存器的状态改变。指令格式如下:指令格式如下:指令格式如下:指令格式如下:CDP CDP ,CRdCRd,CRnCR
164、n,CRm ,CRm ,其中:其中:其中:其中: CP# CP# 指令操作的协处理器名。标准名为指令操作的协处理器名。标准名为指令操作的协处理器名。标准名为指令操作的协处理器名。标准名为pnpn,n n为为为为0 01515。 Cop1 Cop1 协处理器的特定操作码。协处理器的特定操作码。协处理器的特定操作码。协处理器的特定操作码。 CRd CRd 作为目标寄存器的协处理器寄存器。作为目标寄存器的协处理器寄存器。作为目标寄存器的协处理器寄存器。作为目标寄存器的协处理器寄存器。 CRn CRn 存放第存放第存放第存放第1 1个操作数的协处理器寄存器。个操作数的协处理器寄存器。个操作数的协处理器
165、寄存器。个操作数的协处理器寄存器。 CRm CRm 存放第存放第存放第存放第2 2个操作数的协处理器寄存器。个操作数的协处理器寄存器。个操作数的协处理器寄存器。个操作数的协处理器寄存器。 Cop2 Cop2 可选的协处理器特定操作码。可选的协处理器特定操作码。可选的协处理器特定操作码。可选的协处理器特定操作码。指令举例如下指令举例如下: CDP p7CDP p7,0 0,c0c0,c2c2,c3c3,0 0 ;协处理器;协处理器;协处理器;协处理器7 7执行操作码执行操作码执行操作码执行操作码1 1为为为为0 0和和和和;可选操作码;可选操作码;可选操作码;可选操作码2 2为为为为0 0的操作
166、。的操作。的操作。的操作。 CDP p6CDP p6,1 1,c3c3,c4c4,c5 c5 ;协处理器;协处理器;协处理器;协处理器6 6执行执行执行执行;操作码为;操作码为;操作码为;操作码为1 1的操作的操作的操作的操作 指令特点:指令特点:该操作由协处理器完成,即对命令参数的解释与协该操作由协处理器完成,即对命令参数的解释与协该操作由协处理器完成,即对命令参数的解释与协该操作由协处理器完成,即对命令参数的解释与协处理器有关,指令的使用取决于协处理器。处理器有关,指令的使用取决于协处理器。处理器有关,指令的使用取决于协处理器。处理器有关,指令的使用取决于协处理器。若协处理器不能成功地执行
167、该操作,将产生未定义若协处理器不能成功地执行该操作,将产生未定义若协处理器不能成功地执行该操作,将产生未定义若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令异常中断。指令异常中断。指令异常中断。二、二、 LDC/STC协处理器数据取协处理器数据取/存指令存指令 协处理器数据取协处理器数据取协处理器数据取协处理器数据取/ /存指令从存储器读取数据装存指令从存储器读取数据装存指令从存储器读取数据装存指令从存储器读取数据装入协处理器寄存器,或将协处理器寄存器的数据存入协处理器寄存器,或将协处理器寄存器的数据存入协处理器寄存器,或将协处理器寄存器的数据存入协处理器寄存器,或将协处理器寄存
168、器的数据存入存储器。入存储器。入存储器。入存储器。1、LDC协处理器数据读取指令协处理器数据读取指令 LDC LDC指令指令指令指令从某一连续的内存单元从某一连续的内存单元从某一连续的内存单元从某一连续的内存单元将数据读取到将数据读取到将数据读取到将数据读取到协处理器的寄存器中。进行协处理器的数据传送时,协处理器的寄存器中。进行协处理器的数据传送时,协处理器的寄存器中。进行协处理器的数据传送时,协处理器的寄存器中。进行协处理器的数据传送时,由协处理器来控制传送的字数。若协处理器不能成由协处理器来控制传送的字数。若协处理器不能成由协处理器来控制传送的字数。若协处理器不能成由协处理器来控制传送的字
169、数。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。功地执行该操作,将产生未定义指令异常中断。功地执行该操作,将产生未定义指令异常中断。功地执行该操作,将产生未定义指令异常中断。指令格式如下:指令格式如下:指令格式如下:指令格式如下: LDCcondL LDCcondL ,CRdCRd, 其中:其中:其中:其中: L L 可选后缀,指明是长整数传送。可选后缀,指明是长整数传送。可选后缀,指明是长整数传送。可选后缀,指明是长整数传送。 CP# CP# 指令操作的协处理器名。标准名为指令操作的协处理器名。标准名为指令操作的协处理器名。标准名为指令操作的协处理器名。标准名为pnpn,n n
170、为为为为015015。 CRd CRd 作为目标寄存的协处理器寄存器。作为目标寄存的协处理器寄存器。作为目标寄存的协处理器寄存器。作为目标寄存的协处理器寄存器。 指定的内存地址。指定的内存地址。指定的内存地址。指定的内存地址。指令举例如下:指令举例如下:指令举例如下:指令举例如下:LDC p5LDC p5,c2c2,R2R2,#4 #4 ;读取;读取;读取;读取R2+4R2+4指向的内存指向的内存指向的内存指向的内存单元的数据,传送到协处理器单元的数据,传送到协处理器单元的数据,传送到协处理器单元的数据,传送到协处理器p5p5的的的的c2c2寄存器中。寄存器中。寄存器中。寄存器中。LDC p6
171、LDC p6,c2c2,R1 R1 ;读取;读取;读取;读取R1R1指向的内存指向的内存指向的内存指向的内存单元的数据,传送到协处理器单元的数据,传送到协处理器单元的数据,传送到协处理器单元的数据,传送到协处理器p6p6的的的的c2c2寄存器中。寄存器中。寄存器中。寄存器中。2、STC协处理器数据存入指令协处理器数据存入指令 将协处理器的寄存器数据存入到将协处理器的寄存器数据存入到将协处理器的寄存器数据存入到将协处理器的寄存器数据存入到某一连续的内某一连续的内某一连续的内某一连续的内存单元中存单元中存单元中存单元中,由协处理器来控制写入的字数。,由协处理器来控制写入的字数。,由协处理器来控制写
172、入的字数。,由协处理器来控制写入的字数。 若协处理器不能成功地执行该操作,将产生未若协处理器不能成功地执行该操作,将产生未若协处理器不能成功地执行该操作,将产生未若协处理器不能成功地执行该操作,将产生未定义指令异常中断。定义指令异常中断。定义指令异常中断。定义指令异常中断。指令格式如下:指令格式如下:指令格式如下:指令格式如下:STCcondL CP#STCcondL CP#,CRdCRd, 其中格式说明同其中格式说明同其中格式说明同其中格式说明同 LDC LDC 指令。指令。指令。指令。指令举例如下:指令举例如下:指令举例如下:指令举例如下:STC p5STC p5,c1c1,R0R0STC
173、 p5STC p5,c1c1,R0R0,#0x04#0x04三、三、MCR/MRCARM寄存器与寄存器与协处理器寄存器的数据传送指令协处理器寄存器的数据传送指令1 1、MCR MCR ARMARM寄存器到协处理器寄存器的数据传送指令寄存器到协处理器寄存器的数据传送指令寄存器到协处理器寄存器的数据传送指令寄存器到协处理器寄存器的数据传送指令 MCRMCR指令将指令将指令将指令将ARMARM处理器的寄存器中的数据传送到协处理器的寄存器中。处理器的寄存器中的数据传送到协处理器的寄存器中。处理器的寄存器中的数据传送到协处理器的寄存器中。处理器的寄存器中的数据传送到协处理器的寄存器中。 若协处理器不能成
174、功地执行该操作,将产生未定义指令异常中断。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:指令格式如下:指令格式如下:指令格式如下:MCRcond CP# , Cop1, Rd, CRn, CRm, MCRcond CP# , Cop1, Rd, CRn, CRm, 其中格式说明同其中格式说明同其中格式说明同其中格式说明同 CDP CDP 指令。指令。指令。指令。指令举例如下:指令举例如下:指令举例如下:指令举例如下: MCR p14 MCR p14,3
175、3,R7R7,c7c7,c11c11,6 6 ;从;从;从;从ARMARM寄存器中将数据传送到协处理器寄存器中将数据传送到协处理器寄存器中将数据传送到协处理器寄存器中将数据传送到协处理器p14p14的寄存器的寄存器的寄存器的寄存器;中,其中;中,其中;中,其中;中,其中R7R7为为为为ARMARM寄存器,存放源操作数;寄存器,存放源操作数;寄存器,存放源操作数;寄存器,存放源操作数;c7c7和和和和c11c11为为为为;协处理器寄存器,是目标寄存器;操作码;协处理器寄存器,是目标寄存器;操作码;协处理器寄存器,是目标寄存器;操作码;协处理器寄存器,是目标寄存器;操作码1 1为为为为3 3;操作
176、;操作;操作;操作码码码码2 2为为为为6 6。 2、MRC协处理器寄存器协处理器寄存器到到ARM寄存器的数据传送指令寄存器的数据传送指令 MRC MRC指令将协处理器寄存器中的数据传送到指令将协处理器寄存器中的数据传送到指令将协处理器寄存器中的数据传送到指令将协处理器寄存器中的数据传送到ARMARM处理器的寄存器中。若协处理器不能成功地执处理器的寄存器中。若协处理器不能成功地执处理器的寄存器中。若协处理器不能成功地执处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。行该操作,将产生未定义指令异常中断。行该操作,将产生未定义指令异常中断。行该操作,将产生未定义指令异常
177、中断。指令格式如下:指令格式如下:指令格式如下:指令格式如下: MRCcond CP# , Cop1, RdMRCcond CP# , Cop1, Rd,CRnCRn,CRm, CRm, 其中格式说明同其中格式说明同其中格式说明同其中格式说明同 CDP CDP 指令。指令。指令。指令。指令举例如下:指令举例如下:指令举例如下:指令举例如下:MRC p5MRC p5,2 2,R2R2,c3c3,c2c23.3.5 杂项指令杂项指令 主主主主要要要要由由由由两两两两种种种种类类类类型型型型指指指指令令令令组组组组成成成成,程程程程序序序序状状状状态态态态寄寄寄寄存存存存器器器器操操操操作作作作指令
178、、中断操作指令,一共有指令、中断操作指令,一共有指令、中断操作指令,一共有指令、中断操作指令,一共有5 5条指令。条指令。条指令。条指令。状态寄存器操作指令:状态寄存器操作指令:状态寄存器操作指令:状态寄存器操作指令: MRSMRS:读程序状态寄存器指令读程序状态寄存器指令读程序状态寄存器指令读程序状态寄存器指令 MSRMSR:写程序状态寄存器指令写程序状态寄存器指令写程序状态寄存器指令写程序状态寄存器指令 异常中断操作指令:异常中断操作指令:异常中断操作指令:异常中断操作指令: SWISWI: 软件中断指令软件中断指令软件中断指令软件中断指令 BKPTBKPT:断点指令(断点指令(断点指令(
179、断点指令(v5Tv5T体系)体系)体系)体系) CLZCLZ: 前导前导前导前导0 0计数(计数(计数(计数(v5Tv5T体系)体系)体系)体系)一、程序状态寄存器处理指令一、程序状态寄存器处理指令 ARMARM指指指指令令令令中中中中有有有有两两两两条条条条指指指指令令令令,用用用用于于于于在在在在状状状状态态态态寄寄寄寄存存存存器器器器和和和和通通通通用用用用寄寄寄寄存存存存器器器器之之之之间间间间传传传传送送送送数数数数据据据据。修修修修改改改改状状状状态态态态寄寄寄寄存存存存器器器器一一一一般般般般是是是是通通通通过过过过“ “读读读读取取取取修修修修改改改改写回写回写回写回” ”三个
180、步骤的操作来实现的。三个步骤的操作来实现的。三个步骤的操作来实现的。三个步骤的操作来实现的。1 1、MRSMRS读状态寄存器指令读状态寄存器指令读状态寄存器指令读状态寄存器指令 指令格式如下:指令格式如下:指令格式如下:指令格式如下:MRScond RdMRScond Rd,psr psr ; Rd Rd psr psr 把状态寄存器把状态寄存器把状态寄存器把状态寄存器psrpsr(CPSRCPSR或或或或SPSRSPSR)的内容传送到目标)的内容传送到目标)的内容传送到目标)的内容传送到目标寄存器中。寄存器中。寄存器中。寄存器中。其中:其中:其中:其中: Rd Rd 目标寄存器。目标寄存器。
181、目标寄存器。目标寄存器。RdRd不允许为不允许为不允许为不允许为R15R15。 psr psr CPSR CPSR或或或或SPSRSPSR。 注意:注意:注意:注意:在在在在ARMARM处理器中,只有处理器中,只有处理器中,只有处理器中,只有MRSMRS指令可以将状态寄指令可以将状态寄指令可以将状态寄指令可以将状态寄存器存器存器存器CPSRCPSR或或或或SPSRSPSR读出到通用寄存器中。读出到通用寄存器中。读出到通用寄存器中。读出到通用寄存器中。ARM状态寄存器的格式状态寄存器的格式1 1、条件码标志位、条件码标志位、条件码标志位、条件码标志位(保存(保存(保存(保存ALUALU中的当前操
182、作信息)中的当前操作信息)中的当前操作信息)中的当前操作信息)NN:正负号:正负号:正负号:正负号/ /大小大小大小大小 标志位标志位标志位标志位0 0表示:正数表示:正数表示:正数表示:正数/ /大于;大于;大于;大于;1 1表示:负数表示:负数表示:负数表示:负数/ /小于小于小于小于Z Z:零标志位:零标志位:零标志位:零标志位0 0表示:结果不为零;表示:结果不为零;表示:结果不为零;表示:结果不为零;1 1表示:结果为零表示:结果为零表示:结果为零表示:结果为零C C:进位:进位:进位:进位/ /借位借位借位借位/ /移出位移出位移出位移出位0 0表示:未进位表示:未进位表示:未进位
183、表示:未进位/ /借位借位借位借位/ /移出移出移出移出0 0;1 1表示:进位表示:进位表示:进位表示:进位/ /未借位未借位未借位未借位/ /移出移出移出移出1 1V V:溢出标志位:溢出标志位:溢出标志位:溢出标志位0 0表示:结果未溢出;表示:结果未溢出;表示:结果未溢出;表示:结果未溢出;1 1表示:结果溢出表示:结果溢出表示:结果溢出表示:结果溢出QQ:DSPDSP指令溢出标志位指令溢出标志位指令溢出标志位指令溢出标志位(用于(用于(用于(用于v5v5以上以上以上以上E E系列)系列)系列)系列) 0 0表示:结果未溢出;表示:结果未溢出;表示:结果未溢出;表示:结果未溢出;1 1
184、表示:结果溢出表示:结果溢出表示:结果溢出表示:结果溢出3131 3030 2929 2828 2727 26268 87 76 65 54 43 32 21 10 0NNZ ZC CV VQQ( (保留保留保留保留) )I IF FT TM4M4 M3M3 M2M2 M1M1 M0M0指令举例如下:指令举例如下:MRS R1MRS R1,CPSR CPSR ; R1R1 CPSR CPSRMRS R2MRS R2,SPSR SPSR ; R2 R2 SPSR SPSRMRS与与MSR指令的应用目的:指令的应用目的: 获得获得获得获得CPSRCPSR或或或或SPSRSPSR的状态:的状态:的状
185、态:的状态: 用用用用MRSMRS指指指指令令令令读读读读取取取取CPSRCPSR,可可可可用用用用来来来来判判判判断断断断ALUALU的的的的状状状状态态态态标标标标志志志志,或或或或IRQIRQ、FIQFIQ中断是否允许等。中断是否允许等。中断是否允许等。中断是否允许等。 用用用用MRSMRS指指指指令令令令在在在在异异异异常常常常处处处处理理理理程程程程序序序序中中中中,读读读读SPSRSPSR可可可可知知知知道道道道进进进进行行行行异异异异常常常常前的处理器状态等。前的处理器状态等。前的处理器状态等。前的处理器状态等。 CPSRCPSR或或或或SPSRSPSR进行修改:进行修改:进行修
186、改:进行修改: MRSMRS与与与与MSRMSR配配配配合合合合使使使使用用用用,实实实实现现现现CPSRCPSR或或或或SPSRSPSR寄寄寄寄存存存存器器器器的的的的读读读读修修修修改改改改写写写写操操操操作作作作,可可可可用用用用来来来来进进进进行行行行处处处处理理理理器器器器模模模模式式式式切切切切换换换换、允允允允许许许许禁止禁止禁止禁止IRQ/FIQIRQ/FIQ中断等设置。中断等设置。中断等设置。中断等设置。2、MSR写状态寄存器指令写状态寄存器指令 在在在在ARMARM处处处处理理理理器器器器中中中中,只只只只有有有有MSRMSR指指指指令令令令可可可可以以以以直直直直接接接接
187、设设设设置置置置状态寄存器状态寄存器状态寄存器状态寄存器CPSRCPSR或或或或SPSRSPSR。 指令格式如下:指令格式如下:指令格式如下:指令格式如下:MSRcond psr_fieldsMSRcond psr_fields,#immed#immedMSRcond psr_fieldsMSRcond psr_fields,RmRm其中:其中:其中:其中: psrpsr: CPSRCPSR或或或或SPSRSPSR。 immedimmed: 要传送到状态寄存器指定域的要传送到状态寄存器指定域的要传送到状态寄存器指定域的要传送到状态寄存器指定域的8 8位立即数。位立即数。位立即数。位立即数。 R
188、mRm: 要传送到状态寄存器指定域的数据的源寄要传送到状态寄存器指定域的数据的源寄要传送到状态寄存器指定域的数据的源寄要传送到状态寄存器指定域的数据的源寄 存器。存器。存器。存器。 fields fields 指定传送的区域。指定传送的区域。指定传送的区域。指定传送的区域。fieldsfields可以是以下的一种或多种可以是以下的一种或多种可以是以下的一种或多种可以是以下的一种或多种( (字母必须为字母必须为字母必须为字母必须为小写小写小写小写) ): c c 控制域控制域控制域控制域 (psr7(psr70)0); x x 扩展域扩展域扩展域扩展域(psr15(psr158)8);( (暂未
189、用暂未用暂未用暂未用) ) s s 状态域状态域状态域状态域 (psr23(psr2316)16);( (暂未用暂未用暂未用暂未用) ) f f 标志位域标志位域标志位域标志位域 (psr31(psr3124)24)。程序状态寄存器分域图程序状态寄存器分域图15 8 7 015 8 7 0保留保留保留保留I IF FT Tmodemodex x(扩展域)(扩展域)(扩展域)(扩展域)c c(控制域)(控制域)(控制域)(控制域)31 24 23 1631 24 23 16NN Z Z C C V V QQ保留保留保留保留保留保留保留保留f f(标志位域)(标志位域)(标志位域)(标志位域) s
190、 s(状态域)(状态域)(状态域)(状态域) 指令举例如下:指令举例如下:指令举例如下:指令举例如下:MSR CPSR_fMSR CPSR_f,#0xf0 #0xf0 ;CPSR31:28CPSR31:280xf(0b1111) 0xf(0b1111) ;即;即;即;即N,Z,C,VN,Z,C,V均被置均被置均被置均被置1 1。修改状态寄存器一般是通过修改状态寄存器一般是通过修改状态寄存器一般是通过修改状态寄存器一般是通过“ “读取修改写回读取修改写回读取修改写回读取修改写回” ”三个步三个步三个步三个步骤的操作来实现的。骤的操作来实现的。骤的操作来实现的。骤的操作来实现的。CPSRCPSR的
191、读的读的读的读修改修改修改修改写操作举例如下:写操作举例如下:写操作举例如下:写操作举例如下: 例例例例1 1:设置进位位:设置进位位:设置进位位:设置进位位C CMRSMRSR0, CPSRR0, CPSR ;R0 ;R0CPSRCPSRORR R0,R0,#0x20000000 ;ORR R0,R0,#0x20000000 ;置置置置1 1进位位进位位进位位进位位C CMSRMSRCPSR_f, R0CPSR_f, R0 ;CPSR_f ;CPSR_fR031:24R031:24 例例例例2 2:从管理模式切换到:从管理模式切换到:从管理模式切换到:从管理模式切换到IRQIRQ模式模式模式
192、模式MRSMRS R0, CPSRR0, CPSR ;R0 ;R0CPSRCPSRBICBICR0,R0,#0x1fR0,R0,#0x1f ; ;低低低低5 5位清零位清零位清零位清零ORRORRR0,R0,#0x12 ;R0,R0,#0x12 ;设置为设置为设置为设置为IRQIRQ模式模式模式模式MSRMSR CPSR_c, R0CPSR_c, R0 ; ;传送回传送回传送回传送回CPSRCPSR注注 意:意: 控控控控制制制制域域域域的的的的修修修修改改改改问问问问题题题题:只只只只有有有有在在在在特特特特权权权权模模模模式式式式下下下下才才才才能能能能修修修修改改改改状状状状态态态态寄寄
193、寄寄存存存存器器器器的的的的控控控控制制制制域域域域77:00,以以以以实实实实现现现现处处处处理理理理器器器器模模模模式式式式转转转转换,或设置开换,或设置开换,或设置开换,或设置开/ /关异常中断关异常中断关异常中断关异常中断 。 T T控控控控制制制制位位位位的的的的修修修修改改改改问问问问题题题题:程程程程序序序序中中中中不不不不能能能能通通通通过过过过MSRMSR指指指指令令令令,直直直直接接接接修修修修改改改改CPSRCPSR中中中中的的的的T T控控控控制制制制位位位位来来来来实实实实现现现现ARMARM状状状状态态态态ThumbThumb状状状状态态态态的的的的切切切切换换换换
194、,必必必必须须须须使使使使用用用用BXBX指指指指令令令令完完完完成成成成处处处处理理理理器器器器状态的切换。状态的切换。状态的切换。状态的切换。 用用用用户户户户模模模模式式式式下下下下能能能能够够够够修修修修改改改改的的的的位位位位:在在在在用用用用户户户户模模模模式式式式只只只只能能能能修修修修改改改改“ “标志位域标志位域标志位域标志位域” ”,不能对,不能对,不能对,不能对CPSR23CPSR23:00做修改。做修改。做修改。做修改。 S S后后后后缀缀缀缀的的的的使使使使用用用用问问问问题题题题:在在在在MRS/MSRMRS/MSR指指指指令令令令中中中中不不不不可可可可以以以以使
195、用使用使用使用S S后缀。后缀。后缀。后缀。例:堆栈初始化例:堆栈初始化例:堆栈初始化例:堆栈初始化INITSTACKINITSTACK;堆栈初始化子程序;堆栈初始化子程序;堆栈初始化子程序;堆栈初始化子程序MOVMOVR0R0,LRLR;保存返回地址;保存返回地址;保存返回地址;保存返回地址MRSMRSR1R1,CPSRCPSR;保存;保存;保存;保存CPSRCPSR原值原值原值原值MSRMSRCPSR_cCPSR_c,#0xD3#0xD3 ;切换到管理模式;切换到管理模式;切换到管理模式;切换到管理模式;设置堆栈大小等;设置堆栈大小等;设置堆栈大小等;设置堆栈大小等LDRLDRSPSP,S
196、tackSvcStackSvc;设置堆栈指针;设置堆栈指针;设置堆栈指针;设置堆栈指针MSRMSRCPSR_cCPSR_c,#0xD2#0xD2 ;切换到中断模式;切换到中断模式;切换到中断模式;切换到中断模式;设置堆栈大小等;设置堆栈大小等;设置堆栈大小等;设置堆栈大小等LDRLDRSPSP,StackIrqStackIrq;设置堆栈指针;设置堆栈指针;设置堆栈指针;设置堆栈指针;对其它模式设置;对其它模式设置;对其它模式设置;对其它模式设置MSRMSRCPSR_cCPSR_c,R1R1;恢复;恢复;恢复;恢复CPUCPU原模式原模式原模式原模式MOVMOVPCPC,R0R0;子程序返回;子
197、程序返回;子程序返回;子程序返回二、异常中断产生指令二、异常中断产生指令异常中断指令可以分为以下几种:异常中断指令可以分为以下几种: SWI: 软件中断指令软件中断指令 BKPT:断点指令(:断点指令(v5T及以上体系)及以上体系) CLZ: 前导前导0计数(计数(v5T及以上体系)及以上体系)1、SWI软件中断指令软件中断指令 软件中断指令软件中断指令软件中断指令软件中断指令SWISWI产生软件异常中断,用来实产生软件异常中断,用来实产生软件异常中断,用来实产生软件异常中断,用来实现现现现用户模式到特权模式的切换用户模式到特权模式的切换用户模式到特权模式的切换用户模式到特权模式的切换。用于在
198、用户模式下。用于在用户模式下。用于在用户模式下。用于在用户模式下对操作系统中特权模式的程序的调用;它将处理器对操作系统中特权模式的程序的调用;它将处理器对操作系统中特权模式的程序的调用;它将处理器对操作系统中特权模式的程序的调用;它将处理器置于管理(置于管理(置于管理(置于管理(_svc_svc)模式,中断矢量地址为)模式,中断矢量地址为)模式,中断矢量地址为)模式,中断矢量地址为0x080x08。指令格式如下:指令格式如下:指令格式如下:指令格式如下: SWI SWI 24 说明:说明:说明:说明: 主要用于用户程序调用操作系统的主要用于用户程序调用操作系统的主要用于用户程序调用操作系统的主
199、要用于用户程序调用操作系统的APIAPI。 参数传递通常有两种方法:参数传递通常有两种方法:参数传递通常有两种方法:参数传递通常有两种方法: 指令中的指令中的指令中的指令中的24bit24bit立即数指定立即数指定立即数指定立即数指定APIAPI号,其它参数通过寄存器传号,其它参数通过寄存器传号,其它参数通过寄存器传号,其它参数通过寄存器传递。递。递。递。 忽略指令中的忽略指令中的忽略指令中的忽略指令中的24bit24bit立即数,立即数,立即数,立即数,r0r0指定指定指定指定APIAPI号,其它参数通过号,其它参数通过号,其它参数通过号,其它参数通过其它寄存器传递。其它寄存器传递。其它寄存
200、器传递。其它寄存器传递。SWI指令举例指令举例: 软中断号在指令中,不传递其它参数软中断号在指令中,不传递其它参数软中断号在指令中,不传递其它参数软中断号在指令中,不传递其它参数SWISWI1010;中断号为;中断号为;中断号为;中断号为1010SWISWI0x1234560x123456;中断号为;中断号为;中断号为;中断号为0x1234560x123456 软中断号在指令中,其它参数在寄存器中传递软中断号在指令中,其它参数在寄存器中传递软中断号在指令中,其它参数在寄存器中传递软中断号在指令中,其它参数在寄存器中传递MOVMOVR0R0,#34#34;准备参数;准备参数;准备参数;准备参数S
201、WISWI1212;调用;调用;调用;调用1212号软中断号软中断号软中断号软中断 不用指令中的立即数,软中断号和其它参数都在寄存器中传递不用指令中的立即数,软中断号和其它参数都在寄存器中传递不用指令中的立即数,软中断号和其它参数都在寄存器中传递不用指令中的立即数,软中断号和其它参数都在寄存器中传递MOVMOVR0R0,#12#12;准备中断号;准备中断号;准备中断号;准备中断号MOVMOVR1R1,#34#34;准备参数;准备参数;准备参数;准备参数SWISWI0 0;进入软中断;进入软中断;进入软中断;进入软中断SWI程序举例程序举例:T_bitT_bit EQUEQU0x200x20;用
202、于测试;用于测试;用于测试;用于测试ThumbThumb标志位标志位标志位标志位( (第第第第5 5位位位位) )SWI_handlerSWI_handlerSTMFDSTMFDSPSP!,!,!,!,R0-R3R0-R3,R12R12,LRLRMRSMRSR0R0,SPSRSPSR;保存中断前的;保存中断前的;保存中断前的;保存中断前的CPSRCPSR值值值值STMFDSTMFDSPSP!,!,!,!,R0R0;到堆栈中;到堆栈中;到堆栈中;到堆栈中TSTTSTR0R0,#T_bit#T_bit;测试;测试;测试;测试T T位标志位标志位标志位标志LDRNEHLDRNEHR0R0,LRLR,
203、# -2# -2;读取;读取;读取;读取1616位的位的位的位的SWISWI指令指令指令指令码码码码BICNEBICNER0R0,R0R0,#0xFF00#0xFF00;获取;获取;获取;获取SWISWI中的中中的中中的中中的中断号断号断号断号LDREQLDREQR0R0,LRLR,# -4# -4;读取;读取;读取;读取3232的的的的SWISWI指令码指令码指令码指令码BICEQ R0BICEQ R0,R0R0,#0xFF000000#0xFF000000;获取;获取;获取;获取SWISWI中的中断中的中断中的中断中的中断号号号号;转去处理相应的软中断;转去处理相应的软中断;转去处理相应的
204、软中断;转去处理相应的软中断LDMFDLDMFDSPSP!,!,!,!,R0-R3R0-R3,R12R12,PCPC;中断返回,包括恢复原;中断返回,包括恢复原;中断返回,包括恢复原;中断返回,包括恢复原CPSRCPSR值值值值2、BKPT断点指令断点指令 断点中断指令断点中断指令BKPT用于产生软件断点,用于产生软件断点,供调试程序用。供调试程序用。v5T及以上体系使用。及以上体系使用。指令格式如下:指令格式如下: BKPT immed_16 immed_16immed_16:1616位位位位的的的的立立立立即即即即数数数数。该该该该立立立立即即即即数数数数被被被被调调调调试试试试软件用来保
205、存额外的断点信息。软件用来保存额外的断点信息。软件用来保存额外的断点信息。软件用来保存额外的断点信息。 断点指令用于软件调试;它使处理器停止执行正断点指令用于软件调试;它使处理器停止执行正断点指令用于软件调试;它使处理器停止执行正断点指令用于软件调试;它使处理器停止执行正常指令而进入相应的调试程序。常指令而进入相应的调试程序。常指令而进入相应的调试程序。常指令而进入相应的调试程序。3、 CLZ前导前导0计数指令计数指令 前导前导前导前导0 0计数指令计数指令计数指令计数指令CLZ CLZ 对对对对RmRm中的前导中的前导中的前导中的前导0 0的个数进的个数进的个数进的个数进行计数,结果放到行计
206、数,结果放到行计数,结果放到行计数,结果放到RdRd中。中。中。中。 v5Tv5T及以上体系使用。及以上体系使用。及以上体系使用。及以上体系使用。 指令格式:指令格式:指令格式:指令格式: CLZ Rd, Rm举例如下:举例如下:举例如下:举例如下: MOV R2 MOV R2, #0X17C00#0X17C00;R2=0b0000 0000 0000 0001 0111 1100 R2=0b0000 0000 0000 0001 0111 1100 0000 00000000 0000 CLZ R3 CLZ R3, R2 R2 ;R3=15R3=153.3.6 例例 题题一、算数逻辑运算指令
207、的应用一、算数逻辑运算指令的应用例例1: 实现乘法的指令段实现乘法的指令段MOV R0,R0,LSL #n ;R0=R0nMOV R0,R0,LSL #n ;R0=R0b) a=a-b; if (ab) a=a-b; else b=b-a;else b=b-a; return a;return a; 对应的对应的ARM汇编代码段。(代汇编代码段。(代码执行前码执行前R0中存放中存放a,R1中存放中存放b;代码执行后代码执行后R0中存放最大公约数。中存放最大公约数。gcdCMP R0,R1 ;比较比较a和和b的大小的大小SUBGT R0,R0,R1 ;if(ab) a=a-bSUBLT R1,R
208、1,R0 ;if(ba) b=b-aBNE gcd ;if(a!=b)跳转到跳转到gcd继续执行继续执行MOV PC,LR ;子程序结束,返回子程序结束,返回循环结构循环结构MOVR1,#10LOOP;循环体循环体SUBSUBR1,R1,#1R1,R1,#1BNEBNELOOPLOOP例例3:循环语句:循环语句将内存中从将内存中从将内存中从将内存中从0x4008000x400800开始的开始的开始的开始的100100个字数据相加,其结果个字数据相加,其结果个字数据相加,其结果个字数据相加,其结果存于存于存于存于R3R3、R2R2中(中(中(中(R3R3中为高中为高中为高中为高3232位)。位)
209、。位)。位)。LDRLDR R0 R0,=0x400800=0x400800 MOV R1MOV R1,#100 #100 ; ;初始化循环次数初始化循环次数初始化循环次数初始化循环次数MOV R2MOV R2,#0#0MOV R3MOV R3,#0#0 loop ;loop ;循环体循环体循环体循环体LDRLDR R4 R4,R0R0,#4#4 ADDS R2ADDS R2,R2R2,R4R4ADC R3ADC R3,R3R3,#0#0或者或者或者或者ADDCS R3ADDCS R3,R3R3,#1 #1 SUBS R1SUBS R1,R1R1,#1 #1 ; ;循环计数器减循环计数器减循环
210、计数器减循环计数器减1 1,设置条件标,设置条件标,设置条件标,设置条件标志志志志 BNE loop ;BNE loop ;循环计数器不为循环计数器不为循环计数器不为循环计数器不为0,0,跳到跳到跳到跳到looploop继续执行继续执行继续执行继续执行 ; ;循环计数器为循环计数器为循环计数器为循环计数器为0 0,程序继续执行,程序继续执行,程序继续执行,程序继续执行 例例4:链表操作中的条件码应用:链表操作中的条件码应用在链表中搜索与某一数据相等的元素。在链表中搜索与某一数据相等的元素。在链表中搜索与某一数据相等的元素。在链表中搜索与某一数据相等的元素。链表的每个元素包括两个字,第链表的每个
211、元素包括两个字,第链表的每个元素包括两个字,第链表的每个元素包括两个字,第1 1个字中包含一个字中包含一个字中包含一个字中包含一个字节数据;第个字节数据;第个字节数据;第个字节数据;第2 2个字中包含指向下一个链表元素个字中包含指向下一个链表元素个字中包含指向下一个链表元素个字中包含指向下一个链表元素的指针,当这个指针为的指针,当这个指针为的指针,当这个指针为的指针,当这个指针为0 0时表示链表结束。时表示链表结束。时表示链表结束。时表示链表结束。代码执行前代码执行前代码执行前代码执行前R0R0指向链表的头元素,指向链表的头元素,指向链表的头元素,指向链表的头元素,R1R1中存放将中存放将中存
212、放将中存放将要搜索的数据;代码执行后要搜索的数据;代码执行后要搜索的数据;代码执行后要搜索的数据;代码执行后R0R0指向第指向第指向第指向第1 1个匹配的元个匹配的元个匹配的元个匹配的元素,或者当没有匹配元素时,素,或者当没有匹配元素时,素,或者当没有匹配元素时,素,或者当没有匹配元素时,R0R0为为为为0 0。SEARCH CMP R0,#0 ;R0指针是否为空指针是否为空 LDRNEB R2,R0 ;读取当前元素中的字节数据读取当前元素中的字节数据 CMPNE R1,R2 ;判断数据是否为搜索的数据判断数据是否为搜索的数据 LDRNE R0,R0,#4 ;如果不是如果不是,指针指针R0指向
213、下一个元素指向下一个元素 BNE SEARCH ;跳转到跳转到search执行执行 MOV PC,LR ;搜索完成,程序返回搜索完成,程序返回SEARCHSEARCH CMP R0,#0 ;R0 CMP R0,#0 ;R0指针是否为空指针是否为空指针是否为空指针是否为空 LDRNEB R2,R0 ; LDRNEB R2,R0 ;读取当前元素中的字节读取当前元素中的字节读取当前元素中的字节读取当前元素中的字节数据数据数据数据 CMPNE R1,R2 ; CMPNE R1,R2 ;判断数据是否为搜索的判断数据是否为搜索的判断数据是否为搜索的判断数据是否为搜索的数据数据数据数据 LDRNE R0,R
214、0,#4 ; LDRNE R0,R0,#4 ;如果不是如果不是如果不是如果不是, ,指针指针指针指针R0R0指向指向指向指向下一下一下一下一;个;个;个;个元素元素元素元素 BNE BNE SEARCHSEARCH ; ;跳转到跳转到跳转到跳转到searchsearch执行执行执行执行 MOV PC,LR ; MOV PC,LR ;搜索完成,程序返回搜索完成,程序返回搜索完成,程序返回搜索完成,程序返回3.4 Thumb指令集指令集(在本章最后)(在本章最后)(在本章最后)(在本章最后)主要内容主要内容3.5.1 3.5.1 概念概念概念概念3.5.2 ARM3.5.2 ARM汇编伪指令汇编伪
215、指令汇编伪指令汇编伪指令3.5.3 ARM3.5.3 ARM汇编伪操作汇编伪操作汇编伪操作汇编伪操作一、符号定义伪操作一、符号定义伪操作一、符号定义伪操作一、符号定义伪操作 二、二、二、二、 数据定义伪操作数据定义伪操作数据定义伪操作数据定义伪操作 三、汇编控制伪操作三、汇编控制伪操作三、汇编控制伪操作三、汇编控制伪操作 四、其他伪操作四、其他伪操作四、其他伪操作四、其他伪操作3.5.4 ARM3.5.4 ARM汇编宏指令汇编宏指令汇编宏指令汇编宏指令ADSADS编译环境下的伪操作编译环境下的伪操作编译环境下的伪操作编译环境下的伪操作3.5 ARM汇编伪指令和伪操作汇编伪指令和伪操作3.5.1
216、 伪指令、伪操作和宏指令概念伪指令、伪操作和宏指令概念 伪指令伪指令伪指令伪指令是汇编语言程序里的特殊指令助记符,是汇编语言程序里的特殊指令助记符,是汇编语言程序里的特殊指令助记符,是汇编语言程序里的特殊指令助记符,在汇编时被合适的机器指令替代。在汇编时被合适的机器指令替代。在汇编时被合适的机器指令替代。在汇编时被合适的机器指令替代。 伪操作伪操作伪操作伪操作为汇编程序所用,在源程序进行汇编为汇编程序所用,在源程序进行汇编为汇编程序所用,在源程序进行汇编为汇编程序所用,在源程序进行汇编时由汇编程序处理,只在汇编过程起作用,不参与时由汇编程序处理,只在汇编过程起作用,不参与时由汇编程序处理,只在
217、汇编过程起作用,不参与时由汇编程序处理,只在汇编过程起作用,不参与程序运行。程序运行。程序运行。程序运行。 宏指令宏指令宏指令宏指令通过伪操作定义的一段独立的代码。通过伪操作定义的一段独立的代码。通过伪操作定义的一段独立的代码。通过伪操作定义的一段独立的代码。在调用它时将宏体插入到源程序中。在调用它时将宏体插入到源程序中。在调用它时将宏体插入到源程序中。在调用它时将宏体插入到源程序中。也就是常说的也就是常说的也就是常说的也就是常说的宏宏宏宏。说明:说明:说明:说明:所有的伪指令、伪操作和宏指令,均与所有的伪指令、伪操作和宏指令,均与所有的伪指令、伪操作和宏指令,均与所有的伪指令、伪操作和宏指令
218、,均与具体的开发工具中的编译器有关,当前主要采用具体的开发工具中的编译器有关,当前主要采用具体的开发工具中的编译器有关,当前主要采用具体的开发工具中的编译器有关,当前主要采用ARMARM公司的公司的公司的公司的“ “ADS/SDT IDEADS/SDT IDE” ”开发工具,所以后面开发工具,所以后面开发工具,所以后面开发工具,所以后面的讨论,均是基于的讨论,均是基于的讨论,均是基于的讨论,均是基于ARMARM公司的开发工具。公司的开发工具。公司的开发工具。公司的开发工具。3.5.2 ARM汇编伪指令汇编伪指令 ARM伪指令不属于伪指令不属于ARM指令集中的指令,指令集中的指令,是为了编程方便
219、而定义的。伪指令可以像其是为了编程方便而定义的。伪指令可以像其它它ARM指令一样使用,但在编译时这些指令指令一样使用,但在编译时这些指令将被等效的将被等效的ARM指令代替。指令代替。ARM伪指令有四伪指令有四条,分别是:条,分别是:ADRADR:小范围的地址读取伪指令。:小范围的地址读取伪指令。:小范围的地址读取伪指令。:小范围的地址读取伪指令。ADRLADRL:中等范围的地址读取伪指令。:中等范围的地址读取伪指令。:中等范围的地址读取伪指令。:中等范围的地址读取伪指令。LDRLDR:大范围的地址读取伪指令。:大范围的地址读取伪指令。:大范围的地址读取伪指令。:大范围的地址读取伪指令。NOPN
220、OP:空操作伪指令。:空操作伪指令。:空操作伪指令。:空操作伪指令。一、一、ADR小范围的地址读取小范围的地址读取ADRADR伪指令功能:伪指令功能:伪指令功能:伪指令功能:将基于将基于将基于将基于PCPC相对偏移的地址值或相对偏移的地址值或相对偏移的地址值或相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。基于寄存器相对偏移的地址值读取到寄存器中。基于寄存器相对偏移的地址值读取到寄存器中。基于寄存器相对偏移的地址值读取到寄存器中。 ADRADR伪指令功能的实现方法:伪指令功能的实现方法:伪指令功能的实现方法:伪指令功能的实现方法:在汇编编译器编译在汇编编译器编译在汇编编译器编译在汇
221、编编译器编译源程序时,源程序时,源程序时,源程序时,ADRADR伪指令被编译器替换成一条合适的伪指令被编译器替换成一条合适的伪指令被编译器替换成一条合适的伪指令被编译器替换成一条合适的指令。通常,编译器用一条指令。通常,编译器用一条指令。通常,编译器用一条指令。通常,编译器用一条ADDADD指令或指令或指令或指令或SUBSUB指令来指令来指令来指令来实现此实现此实现此实现此ADRADR伪指令的功能,若不能用一条指令实现,伪指令的功能,若不能用一条指令实现,伪指令的功能,若不能用一条指令实现,伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。则产生错误,编译失败。则产生错误,编译失败。则
222、产生错误,编译失败。语法格式:语法格式:语法格式:语法格式: ADRcond registerADRcond register,exprexpr其中:其中:其中:其中: registerregister:加载的目标寄存器。:加载的目标寄存器。:加载的目标寄存器。:加载的目标寄存器。 exprexpr:地址表达式。取值范围是参考:地址表达式。取值范围是参考:地址表达式。取值范围是参考:地址表达式。取值范围是参考P212P212例例例例1 1: (0x20) (0x20) ADR R1,DelayADR R1,Delay DelayDelay(0x64)(0x64) MOV R0,R14 MOV
223、R0,R14 使用使用使用使用ADRADR将程序标号将程序标号将程序标号将程序标号DelayDelay所表示的地址存入所表示的地址存入所表示的地址存入所表示的地址存入R1R1。编译后的反汇编代码:编译后的反汇编代码: ADD R1,PC,#0x3C MOV R0,R14 PC+0x3C=0x20+0x08+0x3C=0x64例例2:查表:查表 ADR R0,D_TAB ; ;加载转换表地址加载转换表地址加载转换表地址加载转换表地址 LDRB R1,R0,R2 ; ;使用使用使用使用R2R2作为参数,进行作为参数,进行作为参数,进行作为参数,进行查表查表查表查表 D_TAB DCB 0xC0,
224、0xF9, 0xA4, 0xB0, 0x99, 0x92二、二、ADRL中等范围的地址读取中等范围的地址读取ADRLADRL伪指令功能:伪指令功能:伪指令功能:伪指令功能:将基于将基于将基于将基于PCPC相对偏移的地址值相对偏移的地址值相对偏移的地址值相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比或基于寄存器相对偏移的地址值读取到寄存器中,比或基于寄存器相对偏移的地址值读取到寄存器中,比或基于寄存器相对偏移的地址值读取到寄存器中,比ADRADR伪指令可以读取更大范围的地址。伪指令可以读取更大范围的地址。伪指令可以读取更大范围的地址。伪指令可以读取更大范围的地址。ADRLADRL
225、伪指令功能实现方法:伪指令功能实现方法:伪指令功能实现方法:伪指令功能实现方法:在汇编编译器编译在汇编编译器编译在汇编编译器编译在汇编编译器编译源程序时,源程序时,源程序时,源程序时,ADRLADRL被编译器替换成两条合适的指令。被编译器替换成两条合适的指令。被编译器替换成两条合适的指令。被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。若不能用两条指令实现,则产生错误,编译失败。若不能用两条指令实现,则产生错误,编译失败。若不能用两条指令实现,则产生错误,编译失败。语法格式:语法格式:语法格式:语法格式: ADRLcond register,expr ADRLcond
226、 register,expr其中:其中:其中:其中: registerregister:加载的目标寄存器。:加载的目标寄存器。:加载的目标寄存器。:加载的目标寄存器。 exprexpr:地址表达式。取值范围参考:地址表达式。取值范围参考:地址表达式。取值范围参考:地址表达式。取值范围参考P212P212例例3: (0x20) ADRL R1,Delay Delay(0x64) MOV R0,R14 使用使用使用使用ADRLADRL将程序标号将程序标号将程序标号将程序标号DelayDelay所表示的地址存入所表示的地址存入所表示的地址存入所表示的地址存入R1R1。编译后的反汇编代码:编译后的反汇
227、编代码: ADD R1,PC,#0x3CADD R1,R1,#0 MOV R0,R14 ADRL ADRL伪指令被汇编成两伪指令被汇编成两条指令,尽管第条指令,尽管第2 2条指令并没条指令并没有意义。有意义。三、三、LDR 大范围的地址读取大范围的地址读取LDRLDR伪指令功能:伪指令功能:伪指令功能:伪指令功能:用于加载用于加载用于加载用于加载3232位立即数或一个位立即数或一个位立即数或一个位立即数或一个地址值到指定的寄存器。地址值到指定的寄存器。地址值到指定的寄存器。地址值到指定的寄存器。LDRLDR伪指令功能实现方法:伪指令功能实现方法:伪指令功能实现方法:伪指令功能实现方法:在汇编编
228、译源程序在汇编编译源程序在汇编编译源程序在汇编编译源程序时,时,时,时,LDRLDR伪指令被编译器替换成一条合适的指令。伪指令被编译器替换成一条合适的指令。伪指令被编译器替换成一条合适的指令。伪指令被编译器替换成一条合适的指令。 若若若若加载的常数未超过加载的常数未超过加载的常数未超过加载的常数未超过MOVMOV或或或或MVNMVN的范围,则使用的范围,则使用的范围,则使用的范围,则使用MOVMOV或或或或MVNMVN指令代替该指令代替该指令代替该指令代替该LDRLDR伪指令;伪指令;伪指令;伪指令; 否则否则否则否则汇编器将常量放入文字池,并使用一条程序相对偏汇编器将常量放入文字池,并使用一
229、条程序相对偏汇编器将常量放入文字池,并使用一条程序相对偏汇编器将常量放入文字池,并使用一条程序相对偏移的移的移的移的LDRLDR指令从文字池读出常量。指令从文字池读出常量。指令从文字池读出常量。指令从文字池读出常量。语法格式:语法格式:语法格式:语法格式: LDRcond register,LDRcond register,=exprexpr其中:其中:其中:其中: RegisterRegister:加载的目标寄存器。:加载的目标寄存器。:加载的目标寄存器。:加载的目标寄存器。 exprexpr:3232位常量或地址表达式。位常量或地址表达式。位常量或地址表达式。位常量或地址表达式。例例例例4
230、 4: (0x060) (0x060) LDR LDR R1,=DelayR1,=Delay DelayDelay(0x102) (0x102) MOV MOV R0,R14R0,R14 使用使用LDR将程序标号将程序标号Delay所表示的地址存入所表示的地址存入R1。编译后的反汇编代码:编译后的反汇编代码: LDR R1,stack Delay MOV R0,R14 LTORGstack DCD 0x102 LDR伪指令被汇编成一条伪指令被汇编成一条LDR指令指令,并在文字池中定义一个常量并在文字池中定义一个常量,该常量为标号该常量为标号Delay的地址。的地址。注意:注意: 从指令位置到文
231、字池的偏移量必须小于从指令位置到文字池的偏移量必须小于4KB。 与与ARM指令的指令的LDR的区别:伪指令的区别:伪指令LDR的的参数有参数有“=”号。号。四、四、NOP空操作伪指令空操作伪指令NOPNOP伪指令功能实现方法:伪指令功能实现方法:伪指令功能实现方法:伪指令功能实现方法:在汇编时将被替代在汇编时将被替代在汇编时将被替代在汇编时将被替代成成成成ARMARM中的空操作,比如可能是中的空操作,比如可能是中的空操作,比如可能是中的空操作,比如可能是“ “MOV R0,R0MOV R0,R0” ”指指指指令等。令等。令等。令等。用途:用途:用途:用途:NOPNOP可用于延时操作。可用于延时
232、操作。可用于延时操作。可用于延时操作。语法格式:语法格式:语法格式:语法格式: NOPNOP例:延时子程序例:延时子程序例:延时子程序例:延时子程序 DelayDelay NOP ; NOP ;空操作空操作空操作空操作 NOP NOP NOP NOP SUBS R1,R1,#1 ; SUBS R1,R1,#1 ;循环次数减循环次数减循环次数减循环次数减1 1 BNE Delay BNE Delay MOV PC,LR MOV PC,LR第第8次到此次到此3.5.3 ARM汇编伪操作汇编伪操作ADS编译环境下的伪操作可分为编译环境下的伪操作可分为以下几类:以下几类:符号定义(符号定义(Symbo
233、l Definition)伪操作)伪操作 数据定义(数据定义(Data Definition)伪操作)伪操作 汇编控制(汇编控制(Assembly Control)伪操作)伪操作 其它(其它(Miscellaneous)伪操作)伪操作 一、符号定义伪操作一、符号定义伪操作 GBLA,GBLL,GBLS:声明全局变量。:声明全局变量。LCLA,LCLL,LCLS:声明局部变量。:声明局部变量。SETA,SETL,SETS:给变量赋值。:给变量赋值。RLIST:为通用寄存器列表定义名称。:为通用寄存器列表定义名称。Test3 SETA 0xaa ;将该变量赋值为0xaa二、数据定义伪操作二、数据定
234、义伪操作LTORGLTORG:声明一个数据缓冲池的开始:声明一个数据缓冲池的开始:声明一个数据缓冲池的开始:声明一个数据缓冲池的开始SPACESPACE:分配一块字节内存单元,并用:分配一块字节内存单元,并用:分配一块字节内存单元,并用:分配一块字节内存单元,并用0 0初始化初始化初始化初始化DCBDCB:分配一段字节内存单元,并初始化:分配一段字节内存单元,并初始化:分配一段字节内存单元,并初始化:分配一段字节内存单元,并初始化DCDDCD、DCDUDCDU:分配一段字内存单元,并初始化:分配一段字内存单元,并初始化:分配一段字内存单元,并初始化:分配一段字内存单元,并初始化MAPMAP:定
235、义一个结构化的内存表的首地址:定义一个结构化的内存表的首地址:定义一个结构化的内存表的首地址:定义一个结构化的内存表的首地址FIELDFIELD:定义结构化内存表中的一个数据域:定义结构化内存表中的一个数据域:定义结构化内存表中的一个数据域:定义结构化内存表中的一个数据域MAP 0x100MAP 0x100, R0 R0 ;定义结构化内存表首地址的值为;定义结构化内存表首地址的值为0x1000x100R0R0A FIELD 16 A FIELD 16 ;定义;定义A A的长度为的长度为1616字节,位置为字节,位置为0x110+R00x110+R0 LTORG LTORG ; ;定义数据缓冲池
236、定义数据缓冲池&0x8000&0x8000Data SPACE 4200 ;Data SPACE 4200 ;从当前位置开始分配从当前位置开始分配42004200字节的内存单元,字节的内存单元,; ;并初始化为并初始化为0 0。1、 LTORG用于声明一个数据缓冲池(文字池)的开始。用于声明一个数据缓冲池(文字池)的开始。用于声明一个数据缓冲池(文字池)的开始。用于声明一个数据缓冲池(文字池)的开始。语法格式:语法格式:语法格式:语法格式:LTORGLTORG例:例:例:例:start BL funcstart BL func;(;(;(;(146146页)页)页)页) func LDR R1
237、,=0x8000 ;func LDR R1,=0x8000 ;子程序子程序子程序子程序 MOV PC,LR ;MOV PC,LR ;子程序返回子程序返回子程序返回子程序返回 LTORGLTORG ; ;定义数据缓冲池定义数据缓冲池定义数据缓冲池定义数据缓冲池&0x8000&0x8000Data SPACE 4200 ;Data SPACE 4200 ;从当前位置开始分配从当前位置开始分配从当前位置开始分配从当前位置开始分配42004200字节的字节的字节的字节的内内内内 存单元,并初始化为存单元,并初始化为存单元,并初始化为存单元,并初始化为0 0。 ENDEND 默认数据缓冲池为空默认数据缓
238、冲池为空默认数据缓冲池为空默认数据缓冲池为空注意:注意:LTORGLTORG伪操作通常放在无条件跳转指令之后,伪操作通常放在无条件跳转指令之后,伪操作通常放在无条件跳转指令之后,伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器不会错误地或者子程序返回指令之后,这样处理器不会错误地或者子程序返回指令之后,这样处理器不会错误地或者子程序返回指令之后,这样处理器不会错误地将数据缓冲池中的数据当作指令来执行。将数据缓冲池中的数据当作指令来执行。将数据缓冲池中的数据当作指令来执行。将数据缓冲池中的数据当作指令来执行。通常通常通常通常ARMARM汇编编译器把数据缓冲池放在代码段汇编编译
239、器把数据缓冲池放在代码段汇编编译器把数据缓冲池放在代码段汇编编译器把数据缓冲池放在代码段的最后面,即下一个代码段开始之前,或者的最后面,即下一个代码段开始之前,或者的最后面,即下一个代码段开始之前,或者的最后面,即下一个代码段开始之前,或者ENDEND伪伪伪伪操作之前。操作之前。操作之前。操作之前。3、DCB也可以用符号也可以用符号”=”表示表示用于定义并且初始化一个或者多个字节的用于定义并且初始化一个或者多个字节的内存区域。内存区域。语法格式:语法格式: label label DCB expr,expr expr,expr或或或或 label = expr,exprlabel = expr
240、,expr其中其中expr表示:表示:-128-128到到到到255255之间的一个数值常量或者表达式。之间的一个数值常量或者表达式。之间的一个数值常量或者表达式。之间的一个数值常量或者表达式。一个字符串。一个字符串。一个字符串。一个字符串。注意:注意:注意:注意:当当当当DCBDCB后面紧跟一个指令时,可能需要后面紧跟一个指令时,可能需要后面紧跟一个指令时,可能需要后面紧跟一个指令时,可能需要使用使用使用使用ALIGNALIGN确保指令是字对齐的。确保指令是字对齐的。确保指令是字对齐的。确保指令是字对齐的。例:例:short DCB 1 ; ;为为为为shortshort分配了一个分配了一个
241、分配了一个分配了一个 ; ;字节字节字节字节, ,并初始并初始并初始并初始化为化为化为化为1 1。string DCB “string”,0 ; ;构造一个以构造一个以构造一个以构造一个以0 0 ; ;结尾的字符结尾的字符结尾的字符结尾的字符串串串串 4、DCD、DCDU分配一段字内存单元分配一段字内存单元(1)DCD 分配一段字对齐的内存单分配一段字对齐的内存单元元用于分配一段字对齐的内存单元,并初始化。用于分配一段字对齐的内存单元,并初始化。 DCD也可以用符号也可以用符号”&”表示表示语法格式:语法格式: label label DCD expr,expr expr,expr或或或或 l
242、abel & expr,exprlabel & expr,expr expressionexpression其中:其中:expr expr :数字表达式或程序中的标号。:数字表达式或程序中的标号。:数字表达式或程序中的标号。:数字表达式或程序中的标号。注意:注意:注意:注意:DCDDCD伪操作可能在分配的第一个内存单元伪操作可能在分配的第一个内存单元伪操作可能在分配的第一个内存单元伪操作可能在分配的第一个内存单元前插入填补字节以保证分配的内存是字对齐的。前插入填补字节以保证分配的内存是字对齐的。前插入填补字节以保证分配的内存是字对齐的。前插入填补字节以保证分配的内存是字对齐的。例:例:data
243、1 DCD 2,4,6 ;为为data1分配三个字分配三个字,内容初始化为内容初始化为2,4,6data2 DCD label+4 ;初始化初始化data2为为label+4对应的地址对应的地址(2)DCDU 分配一段字非严格对齐的分配一段字非严格对齐的内存单元内存单元DCDU与与DCD的不同之处在于的不同之处在于DCDU分配的分配的内存单元并不严格字对齐。内存单元并不严格字对齐。三、汇编控制伪操作三、汇编控制伪操作IF,ELSEIF,ELSE及及及及ENDIFENDIF:有条件选择汇编:有条件选择汇编:有条件选择汇编:有条件选择汇编WHILEWHILE及及及及WENDWEND:有条件循环(重
244、复)汇编:有条件循环(重复)汇编:有条件循环(重复)汇编:有条件循环(重复)汇编MACRO,MENDMACRO,MEND及及及及MEXITMEXIT:宏定义汇编:宏定义汇编:宏定义汇编:宏定义汇编四、其它伪操作四、其它伪操作1 1、AREAAREA:定义一个代码段或数据段定义一个代码段或数据段定义一个代码段或数据段定义一个代码段或数据段2 2、CODE16CODE16、CODE32CODE32:告诉编译器后面的指令序列位数告诉编译器后面的指令序列位数告诉编译器后面的指令序列位数告诉编译器后面的指令序列位数3 3、ENTRYENTRY:指定程序的入口点指定程序的入口点指定程序的入口点指定程序的入
245、口点4 4、ALIGNALIGN:将当前的位置以某种形式对齐将当前的位置以某种形式对齐将当前的位置以某种形式对齐将当前的位置以某种形式对齐 ALIGNALIGN或或或或5 5、ENDEND:源程序结尾源程序结尾源程序结尾源程序结尾 ALIGN nALIGN n:以字或:以字或:以字或:以字或n n字节对齐字节对齐字节对齐字节对齐6 6、EQUEQU:为数字常量、基于寄存器的值和程序中的标号定义一为数字常量、基于寄存器的值和程序中的标号定义一为数字常量、基于寄存器的值和程序中的标号定义一为数字常量、基于寄存器的值和程序中的标号定义一个字符名称。个字符名称。个字符名称。个字符名称。7 7、EXPO
246、RTEXPORT、GLOBALGLOBAL:声明源文件中的符号可以被其他源文:声明源文件中的符号可以被其他源文:声明源文件中的符号可以被其他源文:声明源文件中的符号可以被其他源文件引用件引用件引用件引用8 8、IMPORTIMPORT、EXTERNEXTERN:声明某符号是在其他源文件中定义的:声明某符号是在其他源文件中定义的:声明某符号是在其他源文件中定义的:声明某符号是在其他源文件中定义的9 9、GETGET、INCLUDEINCLUDE:将一个源文件包含到当前源文件中,并将:将一个源文件包含到当前源文件中,并将:将一个源文件包含到当前源文件中,并将:将一个源文件包含到当前源文件中,并将被
247、包含的文件在其当前位置进行汇编处理。被包含的文件在其当前位置进行汇编处理。被包含的文件在其当前位置进行汇编处理。被包含的文件在其当前位置进行汇编处理。1010、INCBININCBIN:将一个文件包含到当前源文件中,而被包含的文:将一个文件包含到当前源文件中,而被包含的文:将一个文件包含到当前源文件中,而被包含的文:将一个文件包含到当前源文件中,而被包含的文件不进行汇编处理件不进行汇编处理件不进行汇编处理件不进行汇编处理1、AREA用于定义一个代码段或是数据段。用于定义一个代码段或是数据段。语法格式:语法格式: AREA sectionname,attr ,attrattributeattri
248、bute其中:其中:sectionnamesectionname:为所定义的段的名称。:为所定义的段的名称。:为所定义的段的名称。:为所定义的段的名称。attrattr:该段的属性。具有的属性为:该段的属性。具有的属性为:该段的属性。具有的属性为:该段的属性。具有的属性为:CODECODE:定义代码段。定义代码段。定义代码段。定义代码段。DATADATA:定义数据段。定义数据段。定义数据段。定义数据段。READONLYREADONLY:指定本段为只读指定本段为只读指定本段为只读指定本段为只读, ,代码段的默认属性。代码段的默认属性。代码段的默认属性。代码段的默认属性。READWRITEREAD
249、WRITE:指定本段为可读可写指定本段为可读可写指定本段为可读可写指定本段为可读可写, ,数据段的默认数据段的默认数据段的默认数据段的默认属性。属性。属性。属性。ALIGNALIGN:指定段的对齐方式为指定段的对齐方式为指定段的对齐方式为指定段的对齐方式为2 2expressionexpression。expressionexpression的取值为的取值为的取值为的取值为031031。COMMONCOMMON:指定一个通用段。该段不包含任指定一个通用段。该段不包含任指定一个通用段。该段不包含任指定一个通用段。该段不包含任何用户代码和数据。何用户代码和数据。何用户代码和数据。何用户代码和数据。
250、NOINITNOINIT:指定此数据段仅仅保留了内存单元,指定此数据段仅仅保留了内存单元,指定此数据段仅仅保留了内存单元,指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个而没有将各初始值写入内存单元,或者将各个而没有将各初始值写入内存单元,或者将各个而没有将各初始值写入内存单元,或者将各个内存单元值初始化为内存单元值初始化为内存单元值初始化为内存单元值初始化为0 0。注意:注意:注意:注意:一个大的程序可包含多个代码段和一个大的程序可包含多个代码段和一个大的程序可包含多个代码段和一个大的程序可包含多个代码段和数据段。一个汇编程序至少包含一个代码段。数据段。一个汇编程序至
251、少包含一个代码段。数据段。一个汇编程序至少包含一个代码段。数据段。一个汇编程序至少包含一个代码段。2、CODE16和和CODE32CODE16CODE16告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为1616位的位的位的位的ThumbThumb指令。指令。指令。指令。CODE32CODE32告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为3232位的位的位的位的ARMARM指令。指令。指令。指令。语法格式:语法格式:语法格式:语法格式: CODE16
252、CODE16 CODE32 CODE32 注意:注意:注意:注意:CODE16CODE16和和和和CODE32CODE32只是告诉编译器后面指令只是告诉编译器后面指令只是告诉编译器后面指令只是告诉编译器后面指令的类型,该伪操作本身不进行程序状态的切换。的类型,该伪操作本身不进行程序状态的切换。的类型,该伪操作本身不进行程序状态的切换。的类型,该伪操作本身不进行程序状态的切换。例:例:AREA ChangeState, CODE, READONLYAREA ChangeState, CODE, READONLY ENTRY ENTRY CODE32CODE32 ; ;下面为下面为下面为下面为32
253、32位位位位ARMARM指令指令指令指令 LDR R0,=start+1 LDR R0,=start+1 BX R0 BX R0 CODE16CODE16 ; ;下面为下面为下面为下面为1616位位位位ThumbThumb指令指令指令指令start MOV R1,#10start MOV R1,#10 . . END END;切换到切换到Thumb状态,并跳转到状态,并跳转到start处执行处执行3、ENTRY指定程序的入口点。指定程序的入口点。语法格式:语法格式: ENTRY注意:注意: 一个程序(可包含多个源文件)中至少要一个程序(可包含多个源文件)中至少要有一个有一个ENTRY(可以有多
254、个(可以有多个ENTRY),但一),但一个源文件中最多只能有一个个源文件中最多只能有一个ENTRY(可以没(可以没有有ENTRY)4、ALIGNALIGNALIGN伪操作通过填充伪操作通过填充伪操作通过填充伪操作通过填充0 0将当前的位置以某种形将当前的位置以某种形将当前的位置以某种形将当前的位置以某种形式对齐。式对齐。式对齐。式对齐。语法格式:语法格式:语法格式:语法格式:ALIGN expr,offsetALIGN expr,offset其中:其中:其中:其中: exprexpr:一个数字,表示对齐的单位。这个数字是:一个数字,表示对齐的单位。这个数字是:一个数字,表示对齐的单位。这个数字
255、是:一个数字,表示对齐的单位。这个数字是2 2的整数的整数的整数的整数次幂,范围在次幂,范围在次幂,范围在次幂,范围在2 20 0223131之间。之间。之间。之间。 如果没有指定如果没有指定如果没有指定如果没有指定exprexpr,则当前位置对齐到下一个字边,则当前位置对齐到下一个字边,则当前位置对齐到下一个字边,则当前位置对齐到下一个字边界处界处界处界处。 OffsetOffset:偏移量,可以为常数或数值表达式。:偏移量,可以为常数或数值表达式。:偏移量,可以为常数或数值表达式。:偏移量,可以为常数或数值表达式。不指定不指定不指定不指定offsetoffset表示将当前位置对齐到以表示将
256、当前位置对齐到以表示将当前位置对齐到以表示将当前位置对齐到以exprexpr为单位的起始位置。为单位的起始位置。为单位的起始位置。为单位的起始位置。例例1:short DCB 1 ;本操作使字对齐被破坏本操作使字对齐被破坏ALIGN ;重新使其为字对齐重新使其为字对齐MOV R0,1例例2:ALIGN 8 ;当前位置以当前位置以2个字的方个字的方式对齐式对齐5、ENDEND伪操作告诉编译器已经到了源程伪操作告诉编译器已经到了源程序结尾。序结尾。语法格式:语法格式: END注意:注意: 每一个汇编源程序都必须包含每一个汇编源程序都必须包含END伪伪操作,以表明本源程序的结束。操作,以表明本源程序
257、的结束。6、EQU 也可以用符号也可以用符号”*”表示表示EQUEQU伪操作伪操作伪操作伪操作为数字常量、基于寄存器的值和程为数字常量、基于寄存器的值和程为数字常量、基于寄存器的值和程为数字常量、基于寄存器的值和程序中的标号定义一个字符名称序中的标号定义一个字符名称序中的标号定义一个字符名称序中的标号定义一个字符名称。语法格式:语法格式:语法格式:语法格式: name EQU exprname EQU expr,typetype其中:其中:其中:其中: namename:为:为:为:为exprexpr定义的字符名称。定义的字符名称。定义的字符名称。定义的字符名称。 exprexpr:基于寄存器
258、的地址值、程序中的标号、:基于寄存器的地址值、程序中的标号、:基于寄存器的地址值、程序中的标号、:基于寄存器的地址值、程序中的标号、3232位的地位的地位的地位的地址常量或者址常量或者址常量或者址常量或者3232位的常量。位的常量。位的常量。位的常量。表达式,为常量。表达式,为常量。表达式,为常量。表达式,为常量。 typetype:当:当:当:当exprexpr为为为为3232位常量时,可以使用位常量时,可以使用位常量时,可以使用位常量时,可以使用typetype指示指示指示指示exprexpr的数据的类型。取值为:的数据的类型。取值为:的数据的类型。取值为:的数据的类型。取值为: CODE
259、32CODE32 CODE16CODE16 DATADATA例:例: abcd EQU 2 ; ;定义定义定义定义abcdabcd符号的值为符号的值为符号的值为符号的值为2 2 abcd EQU label+16 ; ;定义定义定义定义abcdabcd符号的值为符号的值为符号的值为符号的值为(label+16)(label+16) abcd EQU 0x1c,CODE32 ; ;定义定义定义定义abcdabcd符号的值为绝对符号的值为绝对符号的值为绝对符号的值为绝对地址地址地址地址 ; ;值值值值0x1c0x1c,而且此处为,而且此处为,而且此处为,而且此处为ARMARM指令指令指令指令7、E
260、XPORT及及GLOBAL声明一个源文件中的符号,使此符号可以被其他声明一个源文件中的符号,使此符号可以被其他声明一个源文件中的符号,使此符号可以被其他声明一个源文件中的符号,使此符号可以被其他源文件引用。源文件引用。源文件引用。源文件引用。语法格式:语法格式:语法格式:语法格式:EXPORT/GLOBAL symbol weakEXPORT/GLOBAL symbol weak其中:其中:其中:其中: symbolsymbol:声明的符号的名称。(区分大小写):声明的符号的名称。(区分大小写):声明的符号的名称。(区分大小写):声明的符号的名称。(区分大小写) weakweak:声明其他同名
261、符号优先于本符号被引用。:声明其他同名符号优先于本符号被引用。:声明其他同名符号优先于本符号被引用。:声明其他同名符号优先于本符号被引用。例:例:例:例: AREA exampleAREA example,CODECODE,READONLYREADONLY EXPORTEXPORT DoAdd DoAdd DoAdd ADD R0DoAdd ADD R0,R0R0,R1R18、IMPORT及及EXTERN声明一个符号是在其他源文件中定义的。声明一个符号是在其他源文件中定义的。语法格式:语法格式:IMPORT symbolweakEXTERN symbolweak其中:其中:symbolsymb
262、ol:声明的符号的名称。:声明的符号的名称。:声明的符号的名称。:声明的符号的名称。weakweak:当没有指定此项时,如果当没有指定此项时,如果当没有指定此项时,如果当没有指定此项时,如果symbolsymbol在所有的源文件在所有的源文件在所有的源文件在所有的源文件中都没有被定义,则连接器会报告错误。中都没有被定义,则连接器会报告错误。中都没有被定义,则连接器会报告错误。中都没有被定义,则连接器会报告错误。当指定此项时,如果当指定此项时,如果当指定此项时,如果当指定此项时,如果symbolsymbol在所有的源文件中都在所有的源文件中都在所有的源文件中都在所有的源文件中都没有被定义,则连接
263、器不会报告错误,而是进行下没有被定义,则连接器不会报告错误,而是进行下没有被定义,则连接器不会报告错误,而是进行下没有被定义,则连接器不会报告错误,而是进行下面的操作。面的操作。面的操作。面的操作。 如果该符号被如果该符号被如果该符号被如果该符号被B B或者或者或者或者BLBL指令引用,则该符号被设置指令引用,则该符号被设置指令引用,则该符号被设置指令引用,则该符号被设置成下一条指令的地址,该成下一条指令的地址,该成下一条指令的地址,该成下一条指令的地址,该B B或或或或BLBL指令相当于一条指令相当于一条指令相当于一条指令相当于一条NOPNOP指令。指令。指令。指令。 其他情况下此符号被设置
264、成其他情况下此符号被设置成其他情况下此符号被设置成其他情况下此符号被设置成0 0。9、GET及及INCLUDE将一个源文件包含到当前源文件中,并将被包将一个源文件包含到当前源文件中,并将被包将一个源文件包含到当前源文件中,并将被包将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。含的文件在其当前位置进行汇编处理。含的文件在其当前位置进行汇编处理。含的文件在其当前位置进行汇编处理。指令格式:指令格式:指令格式:指令格式:GET GET INCLUDE INCLUDE 其中其中其中其中: : : :包含的源文件名,可以使用路径信息(可包含空格)。包含的源文件名,可以使用路径
265、信息(可包含空格)。包含的源文件名,可以使用路径信息(可包含空格)。包含的源文件名,可以使用路径信息(可包含空格)。例:例:例:例:GET d:armfile.sGET d:armfile.s10、INCBIN将一个文件包含到当前源文件中,而被包含的将一个文件包含到当前源文件中,而被包含的将一个文件包含到当前源文件中,而被包含的将一个文件包含到当前源文件中,而被包含的文件不进行汇编处理文件不进行汇编处理文件不进行汇编处理文件不进行汇编处理指令格式:指令格式:指令格式:指令格式:INCBIN INCBIN 其中:其中:其中:其中: :被包含的文件名称,可使用路径信息(不能有空格)。:被包含的文件
266、名称,可使用路径信息(不能有空格)。:被包含的文件名称,可使用路径信息(不能有空格)。:被包含的文件名称,可使用路径信息(不能有空格)。适用情况:适用情况:适用情况:适用情况:通常使用此伪操作将一个可执行文通常使用此伪操作将一个可执行文通常使用此伪操作将一个可执行文通常使用此伪操作将一个可执行文件或者任意数据包含到当前文件中。件或者任意数据包含到当前文件中。件或者任意数据包含到当前文件中。件或者任意数据包含到当前文件中。例:例:例:例:INCBIN d:armINCBIN d:arm例:编写一具有完整汇编格式的程序,实现冒泡法排序功例:编写一具有完整汇编格式的程序,实现冒泡法排序功例:编写一具
267、有完整汇编格式的程序,实现冒泡法排序功例:编写一具有完整汇编格式的程序,实现冒泡法排序功能。设无符号字数据存放在从能。设无符号字数据存放在从能。设无符号字数据存放在从能。设无符号字数据存放在从0x4000040x400004开始的区域,字数据开始的区域,字数据开始的区域,字数据开始的区域,字数据的数目字存放在的数目字存放在的数目字存放在的数目字存放在0x4000000x400000中。中。中。中。AREA SORTAREA SORT,CODECODE,READONLYREADONLYENTRYENTRYSTARTSTARTMOVMOV R1 R1,#0x400000#0x400000LPLPS
268、UBSSUBS R1 R1,R1R1,#1#1BEQBEQ EXIT EXITMOVMOV R7 R7,R1R1LDRLDR R0 R0,=0x400004=0x400004LP1LP1LDRLDR R2 R2,R0R0,#4#4LDRLDR R3 R3,R0R0CMPCMP R2 R2,R3R3STRLO R3,R0, # -4STRLO R2,R0SUBS R7,R7,#1BNE LP1B LPEXITENDARMARM汇编中的文件格式汇编中的文件格式汇编中的文件格式汇编中的文件格式源程序文件源程序文件文件名文件名说说 明明汇编程序文件汇编程序文件*.S用用ARM汇编语言编写的汇编语言编写
269、的ARM程程序或序或Thumb程序。程序。C程序文件程序文件*.C用用C语言编写的程序代码。语言编写的程序代码。头文件头文件*.H为了简化源程序,把程序中常用到的为了简化源程序,把程序中常用到的常量命名、宏定义、数据结构定义等常量命名、宏定义、数据结构定义等等单独放在一个文件中,一般称为头等单独放在一个文件中,一般称为头文件。文件。ARM汇编与汇编与C的混合编程的混合编程内嵌汇编内嵌汇编语法:语法:语法:语法:_asm_asm 指令指令指令指令;指令指令指令指令 /* /*注释注释注释注释*/*/;指令指令指令指令 _inline void enable_IRQ(viod)inttmp;_as
270、mMRS tmp,CPSRBIC tmp,tmp,#0x80MSR CPSR_c,tmp习习 题题1 1ARMARM指令中的第二操作数指令中的第二操作数指令中的第二操作数指令中的第二操作数“ “operand2operand2” ”有哪些有哪些有哪些有哪些具体形式?具体形式?具体形式?具体形式?2 2对于对于对于对于ARMARM的变址寻址方式,有基地址和偏移地的变址寻址方式,有基地址和偏移地的变址寻址方式,有基地址和偏移地的变址寻址方式,有基地址和偏移地址两部分组成。(址两部分组成。(址两部分组成。(址两部分组成。(1 1)基地址可以是哪些寄存器?)基地址可以是哪些寄存器?)基地址可以是哪些寄
271、存器?)基地址可以是哪些寄存器?(2 2)偏移地址可以有哪些形式?()偏移地址可以有哪些形式?()偏移地址可以有哪些形式?()偏移地址可以有哪些形式?(3 3)总地址的)总地址的)总地址的)总地址的计算方法有哪些?怎么表示?(计算方法有哪些?怎么表示?(计算方法有哪些?怎么表示?(计算方法有哪些?怎么表示?(4 4)变址寻址应用)变址寻址应用)变址寻址应用)变址寻址应用于哪些指令?于哪些指令?于哪些指令?于哪些指令?3 3存储器从存储器从存储器从存储器从0x4000000x400000开始的开始的开始的开始的100100个单元中存放个单元中存放个单元中存放个单元中存放着着着着ASCIIASCI
272、I码,编写程序,将其所有的小写字母转换码,编写程序,将其所有的小写字母转换码,编写程序,将其所有的小写字母转换码,编写程序,将其所有的小写字母转换成大写字母,对其它的成大写字母,对其它的成大写字母,对其它的成大写字母,对其它的ASCIIASCII码不做变换。码不做变换。码不做变换。码不做变换。4 4编写程序,比较存储器中编写程序,比较存储器中编写程序,比较存储器中编写程序,比较存储器中0x4000000x400000和和和和0x4000040x400004两无符号字数据的大小,并且将比较结两无符号字数据的大小,并且将比较结两无符号字数据的大小,并且将比较结两无符号字数据的大小,并且将比较结果存
273、于果存于果存于果存于0x40080x4008的字中,若两数相等其结果记为的字中,若两数相等其结果记为的字中,若两数相等其结果记为的字中,若两数相等其结果记为0 0,若前者大于后者其结果记为,若前者大于后者其结果记为,若前者大于后者其结果记为,若前者大于后者其结果记为1 1,若前者小于后者,若前者小于后者,若前者小于后者,若前者小于后者其结果记为其结果记为其结果记为其结果记为-1-1。5 5将存储器中将存储器中将存储器中将存储器中0x4000000x400000开始的开始的开始的开始的200200字节的数据,字节的数据,字节的数据,字节的数据,传送到传送到传送到传送到0x4008000x4008
274、00开始的区域。开始的区域。开始的区域。开始的区域。6 6编写一程序,查找存储器从编写一程序,查找存储器从编写一程序,查找存储器从编写一程序,查找存储器从0x4000000x400000开始的开始的开始的开始的100100个字中为个字中为个字中为个字中为0 0的数目,将其结果存到的数目,将其结果存到的数目,将其结果存到的数目,将其结果存到0x4001900x400190中。中。中。中。7 7编写一程序,存储器中从编写一程序,存储器中从编写一程序,存储器中从编写一程序,存储器中从0x4002000x400200开始有一开始有一开始有一开始有一个个个个6464位数。(位数。(位数。(位数。(1 1
275、)将取反,再存回原处;()将取反,再存回原处;()将取反,再存回原处;()将取反,再存回原处;(2 2)求)求)求)求其补码,存放到其补码,存放到其补码,存放到其补码,存放到0x4002080x400208处处处处 。8 8编写一简单编写一简单编写一简单编写一简单ARMARM汇编程序段,实现汇编程序段,实现汇编程序段,实现汇编程序段,实现1+2+1+2+100+100的运算。的运算。的运算。的运算。9 9编写一具有完整汇编格式的程序,实现编写一具有完整汇编格式的程序,实现编写一具有完整汇编格式的程序,实现编写一具有完整汇编格式的程序,实现3232位二位二位二位二进制数转换成进制数转换成进制数转
276、换成进制数转换成1111位压缩的位压缩的位压缩的位压缩的BCDBCD码的十进制数。码的十进制数。码的十进制数。码的十进制数。设原数据存放在从设原数据存放在从设原数据存放在从设原数据存放在从0x4000000x400000处,转换后存放处,转换后存放处,转换后存放处,转换后存放在在在在0x4000040x400004开始的地方。开始的地方。开始的地方。开始的地方。1010假定有一个假定有一个假定有一个假定有一个2525字的数组,编译器分别用字的数组,编译器分别用字的数组,编译器分别用字的数组,编译器分别用R0R0、R1R1分配变量分配变量分配变量分配变量x x和和和和y y,若数组的基地址放在,
277、若数组的基地址放在,若数组的基地址放在,若数组的基地址放在R2R2中,使用后变址形式翻译:中,使用后变址形式翻译:中,使用后变址形式翻译:中,使用后变址形式翻译:x=array5+yx=array5+y。1111使用汇编完成系列使用汇编完成系列使用汇编完成系列使用汇编完成系列C C的数组赋值:的数组赋值:的数组赋值:的数组赋值:For(i=0;i=10;i+)For(i=0;i=10;i+)ai=bj+c;ai=bj+c;3.4 Thumb指令集(一)(一)Thumb指令集特点指令集特点ThumbThumb指令集是指令集是ARMARM指令集压缩形式的子集,所有指令集压缩形式的子集,所有Thum
278、bThumb指令均有对应的指令均有对应的ARMARM指令。指令。采用采用1616位二进制编码,代码密度小。位二进制编码,代码密度小。执行执行ThumbThumb指令时,先动态解压缩,然后作为标准指令时,先动态解压缩,然后作为标准的的ARMARM指令执行。指令执行。如何区分指令流取决于如何区分指令流取决于CPSRCPSR的第的第5 5位(位位(位T T)。)。大多数大多数ThumbThumb数据处理指令采用数据处理指令采用2 2个操作数格式。个操作数格式。由于16位的限制,移位操作变成单独指令。ThumbThumb指令集没有协处理器指令、单寄存器交换指令集没有协处理器指令、单寄存器交换指令、乘加
279、指令、指令、乘加指令、6464位乘法指令以及程序状态寄位乘法指令以及程序状态寄存器处理指令,而且指令的第存器处理指令,而且指令的第2 2操作数受到限制。操作数受到限制。除了分支指令除了分支指令B B有条件执行功能外,其他指令均有条件执行功能外,其他指令均为无条件执行。为无条件执行。ThumbThumb是一个不完整的体系结构,不能指望处理是一个不完整的体系结构,不能指望处理器只执行器只执行ThumbThumb代码而不支持代码而不支持ARMARM指令集。指令集。(二)状态切换(二)状态切换1、ARM状态进入Thumb状态的方法执行带状态切换的转移指令执行带状态切换的转移指令BXBX。若。若BXBX
280、指令指定的指令指定的寄存器的最低位为寄存器的最低位为1 1,则将,则将T T置位,并将程序计数置位,并将程序计数器切换为寄存器其他位给出的地址。器切换为寄存器其他位给出的地址。BX R0 BX R0 ;若;若R0R0最低位为最低位为1 1,则转入,则转入ThumbThumb状态状态异常返回也可以将微处理器从异常返回也可以将微处理器从ARMARM状态转换为状态转换为ThumbThumb状态。通常这种指令用于返回到进入异常前所执行的状态。通常这种指令用于返回到进入异常前所执行的指令流,而不是特地用于转换到指令流,而不是特地用于转换到ThumbThumb模式。模式。MOV PCMOV PC,LR L
281、R ;当返回地址保存在;当返回地址保存在LRLR时时STMFD SP!,LR ;STMFD SP!,LR ;当返回地址保存在堆栈时当返回地址保存在堆栈时, , ; ;进入异常后将进入异常后将R14R14入栈,入栈, ; ;假设异常前执行的是假设异常前执行的是ThumbThumb指令,指令,PCPC保存于保存于LRLR中中 LDMFD SP!,PC ;LDMFD SP!,PC ;返回指令返回指令2、 Thumb状态进入ARM状态的方法执行执行ThumbThumb指令中的交换转移指令中的交换转移BXBX指令可以显式地指令可以显式地返回到返回到ARMARM指令流。指令流。利用异常进入利用异常进入AR
282、MARM指令流。指令流。(三)(三)Thumb指令寄存器的使用指令寄存器的使用r0r1r2r3r4r5r6r7r8r9r10r11r12SP(r13)LR(r14)PC(r15)Lo寄存器Hi寄存器CPSR有阴影的寄存器访问时受到限制对低(Lo)8个通用寄存器R0R7具有全部访问权限,可以被任意指令访问。寄存器R8R12的访问受到限制,这些寄存器只能通过MOV、ADD和CMP访问。对寄存器R13R15进行扩展以作特殊应用。CPSR 间接访问 ( CMP 和数据处理指令影响)。SPSR 不能访问。CPSR的条件标志位由算术和逻辑操作设置并控制条件转移。Thumb-ARM相似处:Load/Stor
283、eLoad/Store结构。结构。支持支持8 8位字节、位字节、1616位半字和位半字和3232位字数据类型,半位字数据类型,半字以两字节边界对准,字以字以两字节边界对准,字以4 4字节边界对准。字节边界对准。Thumb-ARM差异处:大多数大多数ThumbThumb指令是无条件执行的,所有指令是无条件执行的,所有ARMARM指指令都是条件执行的。令都是条件执行的。许多许多ThumbThumb数据处理指令采用数据处理指令采用2 2个操作数格式个操作数格式(目的寄存器与一个源寄存器相同),(目的寄存器与一个源寄存器相同),ARMARM数据数据处理指令大多采用处理指令大多采用3 3个操作数格式。如
284、个操作数格式。如 ADD R0ADD R0,R1R1由于采用高密度编码,由于采用高密度编码,ThumbThumb指令格式没有指令格式没有ARMARM指令格式规则。指令格式规则。(四)(四)Thumb转移指令转移指令ThumbThumb转移指令用于:转移指令用于:向后转移形成循环;向后转移形成循环;条件结构向前转移;条件结构向前转移;转向子程序;转向子程序;处理器从处理器从ThumbThumb状态切换到状态切换到ARMARM状态。状态。程序相对转移,特别是条件转移与在程序相对转移,特别是条件转移与在ARMARM状态下相状态下相比,在范围上有更多的限制,比,在范围上有更多的限制,转向子程序只能是无
285、转向子程序只能是无条件转移条件转移。ThumbThumb转移指令包括:转移指令包括:B B;BLBL;BXBX;BLXBLXB指令目标为Thumb代码格式1:B :程序相对偏移表达式,多为同一代码块中的地址标号。程序相对偏移表达式,多为同一代码块中的地址标号。 编码结构:编码结构:-256+256-256+256格式2:B 编码结构:编码结构:2KB2KB Thumb指令集中唯一可以条件执行的指令。BL指令目标为Thumb代码格式:BL 编码结构:编码结构: 4M4M Why 4M4M ?BL指令实际上分为两条指令:(H=0) LR PC+(偏移量左移12位后符号扩展至32位);(H=1) P
286、C LR+(偏移量左移1位); 同时把下一条指令的地址写入LR中。BXBX指令指令目标为目标为ThumbThumb代码或代码或ARMARM代码代码格式:格式: BX RmBX Rm编码结构:编码结构:其中:Rm装有目的地址的ARM寄存器。Rm的位0不用于地址部分。 若Rm的位0清零,则: 位1也必须清零; 指令清零CPSR中的标志T,目的地址的代码被解释为ARM代码。 若Rm的位0置1,则: 目标地址的代码仍为Thumb代码。150 0 1 0 0 0 1 1 180 0 03Rm52670HBLX指令格式1:BLX 目标为目标为ARMARM代码代码151101 1 1 11010位偏移量12
287、H01格式2:BLX Rm目标为ARM代码或Thumb代码BLX指令执行时:拷贝下一条指令的地址到LR寄存器。引起处理器转移到label或Rm存储的地址。如果Rm的位0清0,或使用格式1,则指令集切换到ARM状态。(五)堆栈指令(五)堆栈指令(五)堆栈指令(五)堆栈指令功能:低寄存器和可选的功能:低寄存器和可选的LRLR进栈。低寄存器和可选的进栈。低寄存器和可选的PCPC出栈。出栈。格式:格式: POP , PCPOP , PC PUSH , LRPUSH , LR 其中:其中:Reglist Reglist 低寄存器低寄存器范围的、用逗号隔开的列表。范围的、用逗号隔开的列表。注释:注释: 1
288、 1ThumbThumb堆栈是满递减堆栈,向下增长,且堆栈是满递减堆栈,向下增长,且SPSP指向堆栈的指向堆栈的最后入口。最后入口。 2 2寄存器以数字顺序存储在堆栈中。最低数字的寄存器其寄存器以数字顺序存储在堆栈中。最低数字的寄存器其地址最低。地址最低。 3 3POPreglist,PCPOPreglist,PC这条指令引起处理器转移到从堆栈弹出给这条指令引起处理器转移到从堆栈弹出给PCPC的地址。这通常是从子程序返回,其中的地址。这通常是从子程序返回,其中LRLR在子程序开头压在子程序开头压进堆栈。进堆栈。 4 4指令采用基址回写,因此基址寄存器不应出现在指令采用基址回写,因此基址寄存器不
289、应出现在 寄存器寄存器列表中。列表中。条件码标志这些指令不影响条件码标志这些指令不影响条件码标志例例: : PUSHPUSH R0,R4-R7 R0,R4-R7 ;R0R0、R4R7R4R7进栈进栈PUSHPUSH R0,LR R0,LR POP R2,R5 POP R2,R5 POP R0-R7,PC POP R0-R7,PC ;出栈并从子程序返回;出栈并从子程序返回(六)寄存器读取和存储指令(六)寄存器读取和存储指令单寄存器读取和存储单寄存器读取和存储ThumbThumb单寄存器传送类指令是单寄存器传送类指令是ARMARM单寄存器传送单寄存器传送类指令的一个子集,和类指令的一个子集,和AR
290、MARM有相同的指令格式。有相同的指令格式。多寄存器读取和存储指令ThumbThumb多寄存器传送类指令和多寄存器传送类指令和ARMARM有相同的指令有相同的指令格式。格式。(七)移位和循环移位操作(七)移位和循环移位操作ASRASR、LSLLSL、LSRLSR和和RORROR运算运算 功能:移位和循环移位操作。这些指令可使用功能:移位和循环移位操作。这些指令可使用寄存器中的值或立即数来表示偏移量。寄存器中的值或立即数来表示偏移量。格式格式1 1: Rd Rd , Rn , Rn , : ASR、LSL、LSRRd: 立即数移位的目的寄存器。Rd必须在R0R7范围内。Rn: 立即数移位的源寄存
291、器。Rn必须在R0R7范围内。:立即数移位量。它是一个取值为整数的表达式。整数的范围如下: 若是LSL,则为031; 其它则为132。格式格式2 2: Rd Rd , Rs Rs 编码结构:编码结构:150 0 1 0 0 0 0 Rd3 Rs5269Op10其中:ASR、LSL、LSR 、ROR。Rd: 目的寄存器,它也是第1操作数寄存器。Rd必须在 R0R7范围内。Rs: 在寄存器控制移位中包含移位量的寄存器。Rs必须 在R0R7范围内,只有Rs的最低有效字节可用作偏 移量。 条件标志位:对于除对于除RORROR以外的所有指令,若移位量为以外的所有指令,若移位量为3232,则,则RdRd清
292、清0 0,最后移出的位保留在标志,最后移出的位保留在标志C C中,并根据结中,并根据结果影响果影响N N、Z Z标志位。若移位量大于标志位。若移位量大于3232,则,则RdRd和和标志标志C C均被清均被清0 0,并根据结果影响,并根据结果影响N N、Z Z标志位。标志位。对于对于RORROR指令,若移位量为指令,若移位量为3232,则,则RdRd不变且不影不变且不影响标志位;若移位量大于或小于响标志位;若移位量大于或小于3232时,则最后移时,则最后移出的位将存入到出的位将存入到C C中,并根据结果影响中,并根据结果影响N N、Z Z标志标志位。位。任何情况都不影响标志任何情况都不影响标志V V。例:ASR R3,R5LSR R0,R2,#6LSR R5,R5,zybLSL R0,R4,#0ROR R2,R3;将R3中的值算术右移R5次后再放入R3。;将R2中的值逻辑右移6次后放入R0。;zyb必须取值为132的整数。;将R4的内容放到R0中,除不影响标志位C和V外,同MOV R0,R4;R2中的值循环右移R3次后放入R2中。(八)数据处理指令除移位操作之外的数据处理指令,和ARM类似。