98
2.3 ARM/THUMB 2.3 ARM/THUMB 指指指指指指2.3.1 ARM 2.3.1 ARM 指指指指指指指 指指指指指指指 指指指指指指指指指指指指指指指指指指指指指指指指指指指指指指 指指指指指指指指指指指指指指指指指指指指指指指指指指指指指指 指指指指指指ARM ARM 指指指指 指指指指 9 9 指指指指指指指指指指指指指指1. 1. 指指指指指 指指指指指 指指指指指指指指指指 指指指指指指指指指指指指指指指指指指指 ,, 指指指指指指指指指指 指指指指指指指指指指指指指指指指指指指 ,, 指指指指指指指指指指指指指指指指 指指指指指指指指指指指指 。: 指指指指指指指指指指指指指指指指 指指指指指指指指指指指指 。: MOV R1 MOV R1 R2 R2 指指 指指 R2 R2 指指 指指 SUB R0 SUB R0 R1 R1 R2 R2 R1 R1 指指指指 指指指指 R2 R2 指指 指指指指指 ;, 指指 指指指指指 ;, R0 R0

2.3 ARM/THUMB 指令系统

  • Upload
    odell

  • View
    112

  • Download
    7

Embed Size (px)

DESCRIPTION

2.3 ARM/THUMB 指令系统. 2.3.1 ARM 处理器寻址方式 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。 ARM 处理具有 9 种基本寻址方式。 1. 寄存器寻址 操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下: MOV R1 , R2 ;读取 R2 的值 SUB R0 , R1 , R2 ;将 R1 的值减去 R2 的;值,结果保存到 R0 中. 2. 立即寻址. - PowerPoint PPT Presentation

Citation preview

Page 1: 2.3 ARM/THUMB 指令系统

2.3 ARM/THUMB2.3 ARM/THUMB 指令系指令系统统 2.3.1 ARM2.3.1 ARM 处理器寻址方式 处理器寻址方式 寻址方式是根据指令中给出的地址码字段来实寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。现寻找真实操作数地址的方式。 ARMARM 处理具有处理具有 99种基本寻址方式。种基本寻址方式。1. 1. 寄存器寻址 寄存器寻址 操作数的值在寄存器中,指令中的地址码字段操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:值来操作。寄存器寻址指令举例如下: MOV R1MOV R1 ,, R2R2 ;读取;读取 R2R2 的值的值 SUB R0SUB R0 ,, R1R1 ,, R2R2 ;将;将 R1R1 的值减去的值减去 R2R2的的 ;值,结果保存到;值,结果保存到 R0R0中中

Page 2: 2.3 ARM/THUMB 指令系统

2. 2. 立即寻址立即寻址立即寻址指令中的操作码字段后面的地址立即寻址指令中的操作码字段后面的地址码部分即是操作数本身。也就是说,数据就码部分即是操作数本身。也就是说,数据就包含在指令当中。立即寻址指令举例如下:包含在指令当中。立即寻址指令举例如下: SUBS R0SUBS R0 ,, R0R0 ,, #1#1 ;; R0R0 减减 11 ,,结果放入结果放入 R0R0 ,并且影响标志位,并且影响标志位 MOV R0MOV R0 ,, #0xFF000#0xFF000 ;将立即数;将立即数 0x0x

FF000FF000 装入装入 R0R0 寄存器寄存器 立即数要以“立即数要以“ #”#” 号为前缀,号为前缀, 1616 进制数进制数值时以“值时以“ 0x”0x” 表示。 表示。

Page 3: 2.3 ARM/THUMB 指令系统

3. 3. 寄存器偏移寻址寄存器偏移寻址 寄存器偏移寻址是寄存器偏移寻址是 ARMARM 指令集特有的寻指令集特有的寻址方式。当第址方式。当第 22 个操作数是寄存器偏移方式时,个操作数是寄存器偏移方式时,第第 22 个寄存器操作数在与第个寄存器操作数在与第 11 个操作数结合之个操作数结合之前,选择进行移位操作。前,选择进行移位操作。

寄存器偏移寻址指令举例如下:寄存器偏移寻址指令举例如下:MOV R0MOV R0 ,, R2R2 ,, LSL #3 LSL #3 ;; R2R2 的值左的值左移移 33 位,结果放人位,结果放人 R0R0ANDS R1ANDS R1 ,, R1R1 ,, R2R2 ,, LSL R3LSL R3 ;; R2R2的值左移的值左移 R3R3 位,与位,与 R1R1 相“与”,结果放入相“与”,结果放入 RR

11

Page 4: 2.3 ARM/THUMB 指令系统

可采用的移位操作如下:可采用的移位操作如下:各种移位操作如图所示,各种移位操作如图所示, LSLLSL 为逻辑左移,为逻辑左移,

LSRLSR 为逻辑右移,为逻辑右移, ASRASR 为算术右移,为算术右移, RORROR 为循环为循环右移,右移, RRXRRX 为带扩展的循环右移为带扩展的循环右移 11 位。位。

C 5 ) RRX 移位操作

4 ) ROR 移位操作3 ) ASR 移位操作

1 ) LSL 移位操作 2 ) LSR 移位操作

Page 5: 2.3 ARM/THUMB 指令系统

44 .寄存器间接寻址 .寄存器间接寻址 寄存器间接寻址是寄存器中存放操作数的寄存器间接寻址是寄存器中存放操作数的地址。地址。

举例如下:举例如下:LDR R1LDR R1 ,, [R2][R2] ;将;将 R2R2 指向的存储单指向的存储单元的数据读出,保存在元的数据读出,保存在 R1R1 中中SWP R1SWP R1 ,, R1R1 ,, [R2][R2] ;将寄存器;将寄存器 R1R1的值与的值与 R2R2 指定的存储单元的内容交换指定的存储单元的内容交换 [r2]->r1[r2]->r1

R1->[r2]R1->[r2]

Page 6: 2.3 ARM/THUMB 指令系统

5. 5. 基址寻址基址寻址基址寻址就是将基址寄存器的内容与指令基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。中给出的偏移量相加,形成操作数的有效地址。举例如下:举例如下:LDR R2LDR R2 ,, [R3[R3 ,, #0x0C]#0x0C] ;读取;读取 R3 + R3 +

0x0C0x0C 地址上的存储单元的内容,放人地址上的存储单元的内容,放人 R2R2STR R1STR R1 ,, [R0[R0 ,, #-4]!#-4]! ;先;先 R0 = R0 - R0 = R0 -

44 ,然后把,然后把 R1R1 的值保存到的值保存到 R0R0 指定的存储单元指定的存储单元LDR R1LDR R1 ,, [R0[R0 ,, R3R3 ,, LSL#1]LSL#1] ;将;将 RR

0+R3 2ⅹ0+R3 2ⅹ 地址上的存储单元的内容读出,存入地址上的存储单元的内容读出,存入R1 R1

Page 7: 2.3 ARM/THUMB 指令系统

6. 6. 多寄存器寻址多寄存器寻址 多寄存器寻址即是一次可传送几个寄存器值,多寄存器寻址即是一次可传送几个寄存器值,允许一条指令传送允许一条指令传送 1616 个寄存器的任何子集或所有寄个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:存器。多寄存器寻址指令举例如下: LDMIA R1!LDMIA R1! ,, {R2-R7{R2-R7 ,, R12}R12} ;将;将 R1R1 指向指向的单元中的数据读出到的单元中的数据读出到 R2~R7R2~R7 、、 R12R12 中,中, (R1(R1 自自动加动加 1)1) STMIA R0!STMIA R0! ,, {R2-R7{R2-R7 ,, R12}R12} ;将寄存器;将寄存器 RR22 ~~ R7R7 、、 R12R12 的值保存到的值保存到 R0R0 指向的存储单元中指向的存储单元中(R0(R0 自动加自动加 1)1) 使用多寄存器寻址指令时,寄存器子集的顺序使用多寄存器寻址指令时,寄存器子集的顺序是按由小到大的顺序排列,连续的寄存器可用“是按由小到大的顺序排列,连续的寄存器可用“ -”-”连接;否则用“,”分隔书写。 连接;否则用“,”分隔书写。

Page 8: 2.3 ARM/THUMB 指令系统

7. 7. 堆栈寻址堆栈寻址 堆栈寻址是隐含的,它使用一个专门的寄存器堆栈寻址是隐含的,它使用一个专门的寄存器(( 堆栈指针堆栈指针 )) 指向一块存储区域指向一块存储区域 (( 堆栈堆栈 )) 。指针所指。指针所指向的存储单元即是堆栈的栈顶。向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈。向上生长:向高地址方向生长,称为递增堆栈。向下生长:向低地址方向生长,称为递减堆栈。向下生长:向低地址方向生长,称为递减堆栈。 堆栈指针指向最后压入的堆栈的有效数据项,称堆栈指针指向最后压入的堆栈的有效数据项,称为为满堆栈满堆栈;; 堆栈指针指向下一个待压入数据的空位置,称为堆栈指针指向下一个待压入数据的空位置,称为空堆栈空堆栈。。 这样就有这样就有 44 种类型的堆栈表示递增和递减的满和种类型的堆栈表示递增和递减的满和空堆栈的各种组合。 空堆栈的各种组合。

Page 9: 2.3 ARM/THUMB 指令系统

满递增满递增:堆栈通过增大存储器的地址向上:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地增长,堆栈指针指向内含有效数据项的最高地址。指令如址。指令如 LDMFALDMFA 、、 STMFA(ascend)STMFA(ascend) 等。等。空递增空递增:堆栈通过增大存储器的地址向上:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。增长,堆栈指针指向堆栈上的第一个空位置。指令如指令如 LDMEALDMEA 、、 STMEASTMEA 等。等。满递减满递减:堆栈通过减小存储器的地址向下:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地增长,堆栈指针指向内含有效数据项的最低地址。指令如址。指令如 LDMFDLDMFD 、、 STMFDSTMFD 等。等。空递减空递减:堆栈通过减小存储器的地址向下:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。增长,堆栈指针指向堆栈下的第一个空位置。指令如指令如 LDMEDLDMED 、、 STMEDSTMED 等。 等。

Page 10: 2.3 ARM/THUMB 指令系统

堆栈寻址指令举例如下:堆栈寻址指令举例如下:STMFD SP!STMFD SP! ,, {R1-R7{R1-R7 ,, LR}LR} ;;将将 R1R1 ~~ R7R7 、、 LRLR 入栈。满递减入栈。满递减堆栈堆栈LDMFD SP!LDMFD SP! ,, {R1-R7{R1-R7 ,, LR} LR} ;;数据出栈,放人数据出栈,放人 R1R1 ~~ R7R7 、、 LRLR寄存器。满递减堆栈寄存器。满递减堆栈

Page 11: 2.3 ARM/THUMB 指令系统

8. 8. 块拷贝寻址块拷贝寻址多寄存器传送指令多寄存器传送指令用于将一块数据从存用于将一块数据从存储器的某一位置拷贝到另一位置。储器的某一位置拷贝到另一位置。例如:例如:STMIA R0!STMIA R0! ,, {R1-R7} {R1-R7} ;;将将 R1~RR1~R

77 的数据保存到存储器中。存储指针在保存的数据保存到存储器中。存储指针在保存第一个值之后增加,增长方向为向上增长。第一个值之后增加,增长方向为向上增长。STMIB R0!STMIB R0! ,, {R1-R7} {R1-R7} ;;将将 R1R1 ~~

R7R7 的数据保存到存储器中。存储指针在保的数据保存到存储器中。存储指针在保存第一个值之前增加,增长方向为向上增长 存第一个值之前增加,增长方向为向上增长

Page 12: 2.3 ARM/THUMB 指令系统

增加增加 之前之前 STMIBSTMIBSTMFASTMFA

LDMIBLDMIBLDMEDLDMED

之后之后 STMIASTMIASTMEASTMEA

LDMIALDMIALDMFDLDMFD

减少减少 之前之前 LDMDBLDMDBLDMEALDMEA

STMDBSTMDBSTMFDSTMFD

之后之后 LDMDALDMDALDMFALDMFA

STMDASTMDASTMEDSTMED

向上生长向上生长 向下生长向下生长 满满 空空 满满 空空

增长的方向增长的方向增长的先后增长的先后

多寄存器传送指令映射

Page 13: 2.3 ARM/THUMB 指令系统
Page 14: 2.3 ARM/THUMB 指令系统

9. 9. 相对寻址相对寻址 相对寻址是基址寻址的一种变通。由程序相对寻址是基址寻址的一种变通。由程序计数器计数器 PCPC 提供基准地址,指令中的地址码字提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操段作为偏移量,两者相加后得到的地址即为操作数的有效地址。作数的有效地址。相对寻址指令举例如下:相对寻址指令举例如下:BL SUBRl BL SUBRl ;调用到;调用到 SUBRlSUBRl 子程序子程序. . .. . .SUBR1…SUBR1…MOV PC,R14 MOV PC,R14 ;返回;返回

Page 15: 2.3 ARM/THUMB 指令系统

2.3.2 ARM2.3.2 ARM 指令集介绍指令集介绍 ARM7TDMI(-S)ARM7TDMI(-S) 的指令集,包括的指令集,包括 AA

RMRM 指令集和指令集和 ThumbThumb 指令集。指令集。首先介绍首先介绍 ARMARM 指令的基本格式及指令的基本格式及灵活的操作数,然后介绍条件码,再把灵活的操作数,然后介绍条件码,再把

ARMARM 指令集、指令集、 ThumbThumb 指令集按类分别指令集按类分别说明。 说明。

Page 16: 2.3 ARM/THUMB 指令系统

1. 1. 指令格式指令格式 ARMARM 指令的基本格式如下:指令的基本格式如下: <opcode>{<cond>}{S} <Rd><opcode>{<cond>}{S} <Rd> ,, <Rn>{<Rn>{ ,, <<

operand2>}operand2>} 其中:其中: opcode opcode 指令助记符,如指令助记符,如 LDRLDR 、、 STRSTR 等。等。 cond cond 执行条件,如执行条件,如 EQEQ 、、 NENE 等。等。 S S 是否影响是否影响 CPSRCPSR 寄存器的值,书写时影响寄存器的值,书写时影响

CPSRCPSR 。。 Rd Rd 目标寄存器。目标寄存器。 Rn Rn 第第 11 个操作数的寄存器。个操作数的寄存器。 operand2 operand2 第第 22 个操作数。 个操作数。

Page 17: 2.3 ARM/THUMB 指令系统

在上面的基本格式中,“在上面的基本格式中,“ <><>”” 符符号内的项是必需的,“号内的项是必需的,“ {}{}”” 符号内的项符号内的项是可选的。是可选的。例如,例如, <opcode><opcode> 是指令助记符,是指令助记符,这是必须书写的;而这是必须书写的;而 {<cond>}{<cond>} 为指令为指令执行条件,是可选项。若不书写,则执行条件,是可选项。若不书写,则使用默认条件使用默认条件 AL(AL( 无条件执行无条件执行 )) 。。

Page 18: 2.3 ARM/THUMB 指令系统

指令格式举例如下:指令格式举例如下: LDR LDR R0R0 ,, [R1][R1] ;读取;读取 R1R1 地址地址上的存储器单元内容,执行条件上的存储器单元内容,执行条件 ALAL BEQ BEQ D1D1 ;分支指令,执行条;分支指令,执行条件件 EQEQ ,即相等则跳转到,即相等则跳转到 D1D1 ADDS R1ADDS R1 ,, R1R1 ,, #1#1 ;加法指令,;加法指令, R1R1

+1+1 == >R1>R1 ,影响,影响 CPSRCPSR 寄存器寄存器 (S)(S) SUBNES R1SUBNES R1 ,, R1R1 ,, #0x10#0x10 ;条件;条件执行减法运算执行减法运算 (NE)(NE) ,, R1-0x10=>R1R1-0x10=>R1 ,影,影响响 CPSRCPSR 寄存器寄存器 (S)(S)

Page 19: 2.3 ARM/THUMB 指令系统

在在 ARMARM 指令中,灵活地使用指令中,灵活地使用第第 22 个操作数个操作数能够提高代码效率。第能够提高代码效率。第 22 个操作数的形式如个操作数的形式如下下 :: (1) #inmed_8r——(1) #inmed_8r——常数表达式常数表达式 该常数必须对应该常数必须对应 88 位位图,即常数是由一个位位图,即常数是由一个 88 位的常数循环位的常数循环移位偶数位得到的。移位偶数位得到的。 合法常量:合法常量: 0x3FC0x3FC 、、 00 、、 0xF00000000xF0000000 、、 200200 、、 0xF00000xF0000

001001 。。 非法常量:非法常量: 0xlFE0xlFE 、、 511511 、、 0xFFFF0xFFFF 、、 0x10100x1010 、、 0xF00000xF0000

010010 。。 常数表达式应用举例:常数表达式应用举例: MOV R0MOV R0 ,, #1 #1 ;; R0R0== 11 AND R1AND R1 ,, R2R2 ,, #0x0F #0x0F ;; R2R2 与与 0x0F0x0F ,结果保存在,结果保存在

RlRl LDR R0LDR R0 ,, [R1][R1] ,, #-4#-4 ;读取;读取 R1R1 地址上的存储器单元地址上的存储器单元内容,且内容,且 R1R1== R1- 4R1- 4

Page 20: 2.3 ARM/THUMB 指令系统

(2) Rm——(2) Rm—— 在寄存器方式下,操作数即为寄在寄存器方式下,操作数即为寄存器的数值。存器的数值。寄存器方式应用举例:寄存器方式应用举例:SUB R1SUB R1 ,, R1R1 ,, R2 R2 ;; R1-R2→R1R1-R2→R1

MOV PCMOV PC ,, R0 R0 ;; PC=R0PC=R0 ,程序跳转,程序跳转到指定地址到指定地址LDR R0LDR R0 ,, [R1][R1] ,, -R2 -R2 ;; RlRl 所指存所指存储器单元内容存人储器单元内容存人 R0R0 ,且,且 R1 = R1 - R2 R1 = R1 - R2

Page 21: 2.3 ARM/THUMB 指令系统

(3) Rm(3) Rm ,, shift——shift—— 寄存器移位方式寄存器移位方式将寄存器的移位结果作为操作数,但将寄存器的移位结果作为操作数,但 RmRm 值保存不变,移位值保存不变,移位方法如下:方法如下: ASRASR #n #n 算术右移算术右移 nn 位位 (1≤n≤32)(1≤n≤32) 。。LSLLSL #n #n 逻辑左移逻辑左移 nn 位位 (1≤n≤31)(1≤n≤31) 。。LSRLSR #n #n 逻辑右移逻辑右移 nn 位位 (1≤n≤32)(1≤n≤32) 。。ROR #n ROR #n 循环右移循环右移 nn 位位 (1≤n≤31)(1≤n≤31) 。。RRX RRX 带扩展的循环右移带扩展的循环右移 11 位。位。type Rstype Rs 其中,其中, typetype 为为 ASRASR 、、 LSLLSL 、、 LSRLSR 和和 RORROR中的一种;中的一种; RsRs 为偏移量寄存器,低为偏移量寄存器,低 88 位有效。若其值大于或等于位有效。若其值大于或等于

3232 ,则第,则第 22 个操作数的结果为个操作数的结果为 0 (ASR0 (ASR 、、 RORROR 例外例外 )) 。。寄存器偏移方式应用举例:寄存器偏移方式应用举例: ADD R1ADD R1 ,, R1R1 ,, R1R1 ,, LSL #3 LSL #3 ;; R1=R1×9R1=R1×9 SUB R1SUB R1 ,, R1R1 ,, R2R2 ,, LSR #2 LSR #2 ;; R1=R1-R2×4R1=R1-R2×4

Page 22: 2.3 ARM/THUMB 指令系统

2. 2. 条件码条件码 使用指令条件码可实现高效的逻辑操作。使用指令条件码可实现高效的逻辑操作。表表3-63-6所列为指令条件码表。 所列为指令条件码表。

对于对于 ThumbThumb 指令集,只有指令集,只有 BB 指令具有条指令具有条件码执行功能。此指令的条件码同件码执行功能。此指令的条件码同表表3-63-6。。但如果为无条件执行,条件码助记符但如果为无条件执行,条件码助记符 ALAL 不不能在指令中书写。能在指令中书写。

Page 23: 2.3 ARM/THUMB 指令系统

3. ARM3. ARM 存储器访问指令存储器访问指令 ARMARM 处理器是加载/存储体系结构的典型的处理器是加载/存储体系结构的典型的RISCRISC 处理器,对存储器的访问只能使用加载处理器,对存储器的访问只能使用加载和存储指令实现。和存储指令实现。ARMARM 的加载/存储指令可以实现字、半字、的加载/存储指令可以实现字、半字、无符号/有符号字节操作;无符号/有符号字节操作;多寄存器加载/存储指令可实现一条指令加多寄存器加载/存储指令可实现一条指令加载/存储多个寄存器的内容,效率大大提高;载/存储多个寄存器的内容,效率大大提高;

Page 24: 2.3 ARM/THUMB 指令系统

SWPSWP 指令是一条寄存器和存储指令是一条寄存器和存储器内容交换的指令器内容交换的指令 ,, 可用于信号量操可用于信号量操作等。作等。 ARMARM 处理器是冯处理器是冯 ··诺依曼存储结构,诺依曼存储结构,程序空间、程序空间、 RAMRAM 空间及空间及 I/OI/O 映射空间统映射空间统一编址,除对一编址,除对 RAMRAM 操作以外,对外围操作以外,对外围 I/I/

OO 、程序数据的访问均要通过加载/存、程序数据的访问均要通过加载/存储指令进行。储指令进行。表表 3-73-7 所列为所列为 ARMARM存储器访问指令表。 存储器访问指令表。

Page 25: 2.3 ARM/THUMB 指令系统

(1) LDR(1) LDR 和和 STR——STR—— 加载/存储指加载/存储指令令① 加载/存储字和无符号字节指令 ① 加载/存储字和无符号字节指令 使用使用 STRSTR 指令将单一字节或字指令将单一字节或字存储到内存,使用存储到内存,使用 LDRLDR 指令从内存指令从内存中加载单一字节或字到寄存器。中加载单一字节或字到寄存器。LDRLDR 指令用于从内存中读取数指令用于从内存中读取数据放入寄存器中;据放入寄存器中; STRSTR 指令用于将指令用于将寄存器中的数据保存到内存寄存器中的数据保存到内存。。

Page 26: 2.3 ARM/THUMB 指令系统

指令格式如下:指令格式如下: LDR{cond}{T} RdLDR{cond}{T} Rd ,, << 地址地址 >> ;加载指定地址上;加载指定地址上的数据的数据 (( 字字 )) ,放人,放人 RdRd 中中 STR{cond}{T} RdSTR{cond}{T} Rd ,, << 地址地址 >> ;存储数据;存储数据 (( 字字 )) 到到指定地址的存储单元,要存储的数据在指定地址的存储单元,要存储的数据在 RdRd 中中 LDR{cond}{T} RdLDR{cond}{T} Rd ,, << 地址地址 >> ;加载字节数据,放;加载字节数据,放入入 RdRd 中,即中,即 RdRd 最低字节有效,高最低字节有效,高 2424 位清零位清零 STR{cond}B{T} RdSTR{cond}B{T} Rd ,, << 地址地址 > > ;存储字节数据,;存储字节数据,要存储的数据在要存储的数据在 RdRd ,最低字节有效,最低字节有效

Page 27: 2.3 ARM/THUMB 指令系统

其中,其中, TT 为可选后缀。为可选后缀。若指令有若指令有 TT ,那么即使处理器是在特,那么即使处理器是在特权模式下,存储系统也将访问看成是处理权模式下,存储系统也将访问看成是处理器是在用户模式下。器是在用户模式下。TT 在用户模式下无效,不能与前索引在用户模式下无效,不能与前索引偏移一起使用偏移一起使用 TT 。。LDR/STRLDR/STR 指令寻址是非常灵活的,指令寻址是非常灵活的,由两部分组成,一部分为一个基址寄存器,由两部分组成,一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一可以为任一个通用寄存器;另一部分为一个地址偏移量。个地址偏移量。地址偏移量有以下地址偏移量有以下 33 种格式:种格式:

Page 28: 2.3 ARM/THUMB 指令系统

立即数立即数立即数可以是一个无符号的数值。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。存器中减去这个数值。指令举例如下:指令举例如下:LDR R1LDR R1 ,, [R0[R0 ,, #0x12] #0x12] ;将;将 R0+0x12R0+0x12地址处的数据读出,保存到地址处的数据读出,保存到 RlRl 中中 (R0(R0 的值不变的值不变 ))LDR R1LDR R1 ,, [R0[R0 ,, # -0x12] # -0x12] ;将;将 R0-0x12R0-0x12地址处的数据读出,保存到地址处的数据读出,保存到 R1R1 中中 (R0(R0 的值不变的值不变 ) )

Page 29: 2.3 ARM/THUMB 指令系统

寄存器寄存器 寄存器中的数值可以加到基址寄存器,寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。也可以从基址寄存器中减去这个数值。指令举例如下:指令举例如下:LDR R1LDR R1 ,, [R0[R0 ,, R2] R2] ;将;将 R0+R2R0+R2地址处的数据读出,保存到地址处的数据读出,保存到 R1R1 中中LDR R1LDR R1 ,, [R0[R0 ,, -R2] -R2] ;将;将 R0-R2R0-R2地址处的数据读出,保存到地址处的数据读出,保存到 R1R1 中中

Page 30: 2.3 ARM/THUMB 指令系统

寄存器及移位常数 寄存器及移位常数 寄存器移位后的值可以加到基址寄存器,寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。也可以从基址寄存器中减去这个数值。指令举例如下:指令举例如下:LDR R1LDR R1 ,, [R0[R0 ,, R2R2 ,, LSL #2]LSL #2];将;将 R0+R2×4R0+R2×4 地址处的数据读出,保存到地址处的数据读出,保存到 R1R1中中 (R0(R0 、、 R2R2 的值不变的值不变 ))LDR R1LDR R1 ,, [R0[R0 ,, -R2-R2 ,, LSL #2]LSL #2] ;将;将

R0-R2×4R0-R2×4 地址处的数据读出,保存到地址处的数据读出,保存到 R1R1 中中 (R(R00 、、 R2R2 的值不变的值不变 ) )

Page 31: 2.3 ARM/THUMB 指令系统

从寻址方式的地址计算方法分从寻址方式的地址计算方法分 ,, 加载加载// 存储指令有以下存储指令有以下 44 种形式: 种形式:

零偏移零偏移 :Rn:Rn 的值作为传送数据的地址,即地址偏移的值作为传送数据的地址,即地址偏移量为量为 00 。。 指令举例如下:指令举例如下:

LDR RdLDR Rd ,, [Rn][Rn] 前索引偏移前索引偏移 :: 在数据传送之前,将偏移量加到在数据传送之前,将偏移量加到 RnRn 中,中,其结果作为传送数据的存储地址。若使用后缀“其结果作为传送数据的存储地址。若使用后缀“ !!”,”,则结果写回到则结果写回到 RnRn 中中 ,, 且且 RnRn 的值不允许为的值不允许为 R15R15 。。 指令举例如下:指令举例如下: LDR RdLDR Rd ,, [Rn[Rn ,, #0x04]!#0x04]! LDR RdLDR Rd ,, [Rn[Rn ,, # -0x04]# -0x04]

Page 32: 2.3 ARM/THUMB 指令系统

程序相对偏移程序相对偏移 :: 程序相对偏移是前索引形式的另一程序相对偏移是前索引形式的另一个版本。汇编器由个版本。汇编器由 PCPC 寄存器计算偏移量,并将寄存器计算偏移量,并将 PCPC 寄寄存器作为存器作为 RnRn 生成前索引指令。不能使用后缀“!”生成前索引指令。不能使用后缀“!” 指令举例如下:指令举例如下:

LDR RdLDR Rd ,, label label ;; labellabel 为程序标号。为程序标号。 lalabelbel必须是在当前指令必须是在当前指令 ±4 KB±4 KB范围内范围内后索引偏移后索引偏移 :: RnRn 的值用做传送数据的存储地址。在的值用做传送数据的存储地址。在数据传送后数据传送后 ,, 将偏移量与将偏移量与 RnRn 相加相加 ,, 结果写回到结果写回到 RnRn 中。中。RnRn不允许是不允许是 R15R15 。。 指令举例如下:指令举例如下:LDR RdLDR Rd ,, [Rn][Rn] ,, #0x04#0x04地址对齐——大多数情况下,必须保证用于地址对齐——大多数情况下,必须保证用于 3232 位传送位传送的地址是的地址是 3232 位对齐的。 位对齐的。

Page 33: 2.3 ARM/THUMB 指令系统

② ② 加载/存储半字和有符号字加载/存储半字和有符号字节 节 这类这类 LDR/STRLDR/STR 指令可加载有符字节,加载有指令可加载有符字节,加载有符号半字,加载/存储无符号半字。符号半字,加载/存储无符号半字。偏移量格式、寻址方式与加载/存储字和无符偏移量格式、寻址方式与加载/存储字和无符号字节指令相同。号字节指令相同。指令格式如下:指令格式如下:LDR{cond}SB RdLDR{cond}SB Rd ,, << 地址地址 > > ;加载指定;加载指定地址上的数据地址上的数据 (( 有符号字节有符号字节 )) ,放入,放入 RdRd 中中LDR{cond}SH RdLDR{cond}SH Rd ,, << 地址地址 > > ;加载指定;加载指定地址上的数据地址上的数据 (( 有符号半字有符号半字 )) ,放入,放入 RdRd 中中LDR{cond}H RdLDR{cond}H Rd ,, << 地址地址 >> ;加载半字数;加载半字数据据 ,, 放人放人 RdRd 中中 ,, 即即 RdRd 最低最低 1616 位有效位有效 ,, 高高 1616 位清位清零零 . .

Page 34: 2.3 ARM/THUMB 指令系统

STR{cond}H RdSTR{cond}H Rd ,, << 地址地址 > > ;存储半;存储半字数据,要存储的数据在字数据,要存储的数据在 RdRd ,最低,最低 1616 位有效位有效说明:有符号位半字/字节加载是指有符说明:有符号位半字/字节加载是指有符号位加载扩展到号位加载扩展到 3232 位;无符号位半字加载是指位;无符号位半字加载是指零扩展到零扩展到 3232 位。位。地址对齐——对半字传送的地址必须为偶地址对齐——对半字传送的地址必须为偶数。非半字对齐的半字加载将使数。非半字对齐的半字加载将使 RdRd 内容不可内容不可靠;非半字对齐的半字存储将使指定地址的靠;非半字对齐的半字存储将使指定地址的 22字节存储内容不可靠。字节存储内容不可靠。

Page 35: 2.3 ARM/THUMB 指令系统

加载/存储半字和有符号字节指令举例如下:加载/存储半字和有符号字节指令举例如下:LDRSB R1LDRSB R1 ,, [R0[R0 ,, R3] R3] ;将;将 R0+R3R0+R3 地址地址上的字节数据读到上的字节数据读到 R1R1 ,高,高 2424 位用符号位扩展位用符号位扩展LDRSH R1LDRSH R1 ,, [R9] [R9] ;将;将 R9R9 地址上的半字数地址上的半字数据读出到据读出到 R1R1 ,高,高 1616 位用符号位扩展位用符号位扩展LDRH R6,[R2]LDRH R6,[R2] ,, #2#2 ;将;将 R2R2 地址上的半字数地址上的半字数据读出到据读出到 R6R6 ,高,高 1616 位用零扩展,位用零扩展, R2=R2+2R2=R2+2STRH R1STRH R1 ,, [Ro[Ro ,, #2]!#2]! ;将;将 R1R1 的数据保存的数据保存到到 R0+2R0+2 地址中,只存储低地址中,只存储低 22 字节数据,字节数据, R0=R0+2R0=R0+2LDR/STRLDR/STR 指令用于对内存变量的访问、内存指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等缓冲区数据的访问、查表、外围部件的控制操作等等。若使用等。若使用 LDRLDR 指令加载数据到指令加载数据到 PCPC 寄存器,则实寄存器,则实现程序跳转功能,这样也就实现了程序散转。 现程序跳转功能,这样也就实现了程序散转。

Page 36: 2.3 ARM/THUMB 指令系统

(2) LDM(2) LDM 和和 STM--STM-- 多寄存器加载/存储指多寄存器加载/存储指令 令 LDMLDM 和和 STMSTM 指令可以实现在一组寄存器指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。和一块连续的内存单元之间传输数据。LDMLDM 为加载多个寄存器;为加载多个寄存器; STMSTM 为存储多为存储多个寄存器。个寄存器。允许一条指令传送允许一条指令传送 1616 个寄存器的任何子集个寄存器的任何子集或所有寄存器。或所有寄存器。指令格式如下:指令格式如下:LDM{cond}<LDM{cond}<模式模式 > Rn{!}> Rn{!} ,, reglist{^}reglist{^}STM{cond}<STM{cond}<模式模式 > Rn{!}> Rn{!} ,, reglist{^}reglist{^}

Page 37: 2.3 ARM/THUMB 指令系统

LDM/STMLDM/STM 的主要用途是现场保护、数据的主要用途是现场保护、数据复制和参数传送等。复制和参数传送等。其模式有如下其模式有如下 88 种种 (( 前面前面 44 种用于数据块种用于数据块的传输,后面的传输,后面 44 种是堆栈操作种是堆栈操作 )) ::1.1.IAIA : 每次传送后地址加: 每次传送后地址加 44 ;;2.2.IBIB : 每次传送前地址加: 每次传送前地址加 44 ;;3.3.DADA : 每次传送后地址减: 每次传送后地址减 44 ;;4.4.DBDB : 每次传送前地址减: 每次传送前地址减 44 ;;5.5.FDFD : 满递减堆栈;: 满递减堆栈;6.6.EDED : 空递减堆栈;: 空递减堆栈;7.7.FAFA : 满递增堆栈;: 满递增堆栈;8.8.EAEA : 空递增堆栈。 : 空递增堆栈。

Page 38: 2.3 ARM/THUMB 指令系统

指令格式中,寄存器指令格式中,寄存器 RnRn 为基址寄存器,装为基址寄存器,装有传送数据的初始地址,有传送数据的初始地址, RnRn 不允许为不允许为 R15R15 。。后缀“后缀“ !!”” 表示最后的地址写回到表示最后的地址写回到 RnRn 中。中。寄存器列表寄存器列表 reglistreglist 可包含多于一个寄存器可包含多于一个寄存器或包含寄存器范围,使用“,”分开,如或包含寄存器范围,使用“,”分开,如 {R1{R1 ,,R2R2 ,, R6~R9}R6~R9} ,寄存器按由小到大排列。,寄存器按由小到大排列。后缀“后缀“ ^”^” 不允许在用户模式或系统模式下不允许在用户模式或系统模式下使用。若在使用。若在 LDMLDM 指令且寄存器列表中包含有指令且寄存器列表中包含有 PPCC 时使用,那么除了正常的多寄存器传送外,将时使用,那么除了正常的多寄存器传送外,将SPSRSPSR 也拷贝到也拷贝到 CPSRCPSR 中,这可用于异常处理中,这可用于异常处理返回。返回。使用后缀“使用后缀“ ^”^” 进行数据传送且寄存器列表进行数据传送且寄存器列表不包含不包含 PCPC 时,加载/存储的是用户模式的寄存时,加载/存储的是用户模式的寄存器,而不是当前模式的寄存器。器,而不是当前模式的寄存器。

Page 39: 2.3 ARM/THUMB 指令系统

当当 RnRn 在寄存器列表中且使用后缀“在寄存器列表中且使用后缀“ !!”” 时时 ,, 对于对于STMSTM 指令指令 ,,若若 RnRn 为寄存器列表中的最低数字的寄存器为寄存器列表中的最低数字的寄存器 ,,则会将则会将 RnRn 的初值保存的初值保存 ;; 其它情况下其它情况下 RnRn 的加载值和存的加载值和存储值不可预知。储值不可预知。地址对齐—这些指令忽略地址位地址对齐—这些指令忽略地址位 [1:0][1:0] 。。举例如下:举例如下:

LDMIA R0!LDMIA R0! ,, {R3 - R9}{R3 - R9} ;加载;加载 R0R0 指向地址指向地址上的多字数据,保存到上的多字数据,保存到 R3~R9R3~R9 中,中, R0R0 值更新值更新STMIA R1!STMIA R1! ,, {R3 - R9}{R3 - R9} ;将;将 R3R3 ~~ R9R9 的数的数据存储到据存储到 R1R1 指向的地址上,指向的地址上, R1R1 值更新 值更新 STMFD SP!STMFD SP! ,, {R0 - R7{R0 - R7 ,, LR} LR} ;现场保存,;现场保存,将将 R0R0 ~~ R7R7 、、 LRLR 人栈人栈LDMFD SP!LDMFD SP! ,, {R0 - R7{R0 - R7 ,, PC} PC} ;恢复现;恢复现场,异常处理返回场,异常处理返回

Page 40: 2.3 ARM/THUMB 指令系统

(3) SWP—(3) SWP— 寄存器和存储器交换指寄存器和存储器交换指令令SWPSWP 指令用于将一个内存单元指令用于将一个内存单元 (( 该单元地址该单元地址放在寄存器放在寄存器 RnRn 中中 )) 的内容读取到一个寄存器的内容读取到一个寄存器 RdRd中,同时将另一个寄存器中,同时将另一个寄存器 RmRm 的内容写入到该内的内容写入到该内存单元中。使用存单元中。使用 SWPSWP 可实现信号量操作。 可实现信号量操作。 指令格式如下:指令格式如下:SWP{cond}{B} RdSWP{cond}{B} Rd ,, RmRm ,, [Rn][Rn]其中,其中, BB 为可选后缀,若有为可选后缀,若有 BB ,则交换字节,,则交换字节,否则交换否则交换 3232 位字;位字; RdRd 为数据从存储器加载到的为数据从存储器加载到的寄存器;寄存器; RmRm 的数据用于存储到存储器中,若的数据用于存储到存储器中,若 RR

mm 与与 RdRd 相同,则为寄存器与存储器内容进行交相同,则为寄存器与存储器内容进行交换;换; RnRn 为要进行数据交换的存储器地址,为要进行数据交换的存储器地址, RnRn不能与不能与 RdRd 和和 RmRm 相同。 相同。

Page 41: 2.3 ARM/THUMB 指令系统

指令举例如下:指令举例如下: SWP RlSWP Rl ,, R1R1 ,, [R0][R0] ;将;将 RlRl 的的内容与内容与 R0R0 指向的存储单元的内容进行交指向的存储单元的内容进行交换换

SWPB R1SWPB R1 ,, R2R2 ,, [R0][R0] ;将;将 R0R0指向的存储单元的内容读取—字节数据到指向的存储单元的内容读取—字节数据到R1R1 中中 (( 高高 2424 位清零位清零 )) ,并将,并将 R2R2 的内容的内容写入到该内存单元中写入到该内存单元中 (( 最低字节有效最低字节有效 ))

Page 42: 2.3 ARM/THUMB 指令系统

4. ARM4. ARM 数据处理指令数据处理指令ARMARM数据处理指令数据处理指令((见表见表3-8)3-8)大致可分大致可分

为为 33 类类:数据传送指令:数据传送指令 (( 如如 MOVMOV 、、 MVN)MVN) 、、算术逻辑运算指令算术逻辑运算指令 (( 如如 ADDADD 、、 SUBSUB 、、 ANAND)D) 和比较指令和比较指令 (( 如如 CMPCMP 、、 TST)TST) 。。

数据处理指令只能对寄存器的内容进行数据处理指令只能对寄存器的内容进行操作。所有操作。所有 ARMARM 数据处理指令均可选择使数据处理指令均可选择使用用 SS 后缀,以影响状态标志。后缀,以影响状态标志。比较指令比较指令 CMPCMP 、、 CMNCMN 、、 TSTTST 和和 TEQTEQ不需要后缀不需要后缀 SS ,它们会直接影响状态标志,它们会直接影响状态标志。 。

Page 43: 2.3 ARM/THUMB 指令系统

(1) (1) 数据传送指令数据传送指令① ① MOV——MOV—— 数据传送指令 数据传送指令 MOVMOV 指令将指令将 88 位图立即数或寄存器位图立即数或寄存器 (operand2)(operand2)传送到目标寄存器传送到目标寄存器 (Rd),(Rd), 可用于移位运算等操作。可用于移位运算等操作。指令格式如下:指令格式如下:MOV{cond}{S} RdMOV{cond}{S} Rd ,, operand2operand2指令举例如下:指令举例如下:MOVS R3MOVS R3 ,, R1R1 ,, LSL #2LSL #2 ;; R3R3== R1<<2R1<<2 ,,并影响标志位并影响标志位MOV PCMOV PC ,, LR LR ;; PC = LRPC = LR ,子程序返回 ,子程序返回

Page 44: 2.3 ARM/THUMB 指令系统

② ② MVN——MVN—— 数据非传送指令数据非传送指令MVNMVN 指令将指令将 88 位图立即数或寄存器位图立即数或寄存器 (operand2)(operand2)按位取反后传送到目标寄存器按位取反后传送到目标寄存器 (Rd)(Rd) 。因为其具有取。因为其具有取反功能,所以可以加载范围更广的立即数。反功能,所以可以加载范围更广的立即数。指令格式如下:指令格式如下:MVN{cond}{S} RdMVN{cond}{S} Rd ,, operand2operand2指令举例如下:指令举例如下:MVN R1MVN R1 ,, #0xFF #0xFF ;; R1R1== 0xFFFFFF000xFFFFFF00MVN R1MVN R1 ,, R2 R2 ;将;将 R2R2 取反取反 ,, 结果存到结果存到 RR

ll

Page 45: 2.3 ARM/THUMB 指令系统

(2) (2) 算术逻辑运算指令算术逻辑运算指令① ① ADD——ADD—— 加法运算指令 加法运算指令 ADDADD 指令将指令将 operand2operand2 的数据与的数据与 RnRn 的值的值相加相加 ,, 结果保存到结果保存到 RdRd 寄存器寄存器 ..指令格式如下:指令格式如下:ADD{cond}{S} RdADD{cond}{S} Rd ,, RnRn ,, operand2operand2指令举例如下:指令举例如下:ADDS R1ADDS R1 ,, R1R1 ,, #1 #1 ;; R1R1== R1+1R1+1ADDS R3ADDS R3 ,, R1R1 ,, R2R2 ,, LSL #2 LSL #2 ;;R3R3== R1+R2<<2 R1+R2<<2

Page 46: 2.3 ARM/THUMB 指令系统

② ② SUB——SUB—— 减法运算指令减法运算指令SUBSUB 指令用寄存器指令用寄存器 RnRn 减去减去 operand2operand2 ,结,结果保存到果保存到 RdRd 中。 中。 指令格式如下:指令格式如下:SUB{cond}{S} RdSUB{cond}{S} Rd ,, RnRn ,, operand2operand2

指令举例如下:指令举例如下:SUBS R0SUBS R0 ,, R0R0 ,, #l #l ;; R0R0== R0-1R0-1SUB R6SUB R6 ,, R7R7 ,, #0x10 #0x10 ;; R6R6== R7-0xR7-0x

1010

Page 47: 2.3 ARM/THUMB 指令系统

③ ③ RSB——RSB——逆向减法指令逆向减法指令RSBRSB 指令用寄存器指令用寄存器 operand2operand2 减去减去 Rn,Rn, 结果结果保存到保存到 RdRd 中。中。指令格式如下:指令格式如下:RSB{cond}{S} RdRSB{cond}{S} Rd ,, RnRn ,, operand2operand2

指令举例如下:指令举例如下:RSB R3RSB R3 ,, R1R1 ,, #0xFF00 ;R3#0xFF00 ;R3 == 0xFF0xFF

00-R100-R1RSBS R1RSBS R1 ,, R2R2 ,, R2R2 ,, LSL #2LSL #2 ;; R1R1== R2<<2- R2R2<<2- R2 == R2×3R2×3

Page 48: 2.3 ARM/THUMB 指令系统

④ ④ ADC——ADC—— 带进位加法指令带进位加法指令ADCADC 指令将指令将 operand2operand2 的数据与的数据与 RnRn 的值相加的值相加 ,, 再加上再加上

CPSRCPSR 中的中的 CC 条件标志位条件标志位 ,, 结果保存到结果保存到 RdRd 寄存器。寄存器。指令格式如下:指令格式如下:ADC{cond}{S} RdADC{cond}{S} Rd ,, RnRn ,, operand2operand2

指令举例如下: 指令举例如下: ADDS R0,R0,R2 ; ADDS R0,R0,R2 ; 使用使用 ADCADC 实现实现 6464 位加法,位加法,ADC R1,R1,R3 ;(R1ADC R1,R1,R3 ;(R1 、、 R0)R0)== (R1(R1 、、 R0)+(R3R0)+(R3 、、 R2)R2)

Page 49: 2.3 ARM/THUMB 指令系统

⑤ ⑤ SBC——SBC—— 带进位减法指令带进位减法指令SBCSBC 指令用寄存器指令用寄存器 RnRn 减去减去 operand2operand2 ,再,再减去减去 CPSRCPSR 中的中的 CC 条件标志位的“非”条件标志位的“非” (( 即若即若 CC标志清零,则结果减去标志清零,则结果减去 1)1) ,结果保存到,结果保存到 RdRd 中。中。指令格式如下:指令格式如下:SBC{cond}{S} RdSBC{cond}{S} Rd ,, RnRn ,, operand2operand2指令举例如下:指令举例如下:SUBS R0,R0,R2 SUBS R0,R0,R2 ;使用;使用 SBCSBC 实现实现 6464位减法,位减法,SBC R1,R1,R3 SBC R1,R1,R3 ;; (R1(R1 、、 R0)R0) == (R1(R1 、、

R0)-(R3R0)-(R3 、、 R2)R2)

Page 50: 2.3 ARM/THUMB 指令系统

⑥ ⑥ RSC——RSC—— 带进位逆向减法指令 带进位逆向减法指令 RSC RSC 指令用寄存器指令用寄存器 operand2operand2 减去减去 Rn,Rn, 再减再减去去 CPSRCPSR 中的中的 CC 条件标志位条件标志位 ,, 结果保存到结果保存到 RdRd 中。中。指令格式如下:指令格式如下:RSC{cond}{S} RdRSC{cond}{S} Rd ,, RnRn ,, operand2operand2指令举例如下:指令举例如下:RSBS R2RSBS R2 ,, R0R0 ,, #0#0RSC R3RSC R3 ,, R1R1 ,, #0 #0 ;使用;使用 RSCRSC 指令指令实现求实现求 6464 位数值的负数 位数值的负数

Page 51: 2.3 ARM/THUMB 指令系统

⑦ ⑦ AND——AND—— 逻辑“与”操作指逻辑“与”操作指令 令 ANDAND 指令将指令将 operand2operand2 的值与寄存器的值与寄存器 RnRn 的的值按位逻辑“与”操作值按位逻辑“与”操作 ,, 结果保存到结果保存到 RdRd 中。中。指令格式如下指令格式如下 ::AND{cond}{S} RdAND{cond}{S} Rd ,, RnRn ,, operand2operand2

指令举例如下:指令举例如下:ANDS R0ANDS R0 ,, R0R0 ,, #0x01 #0x01 ;; R0R0== R0R0

&0x01&0x01 ,取出最低位数据,取出最低位数据AND R2AND R2 ,, R1R1 ,, R3 R3 ;; R2R2== R1&R3 R1&R3

Page 52: 2.3 ARM/THUMB 指令系统

⑧ ⑧ ORR——ORR—— 逻辑“或”操作指逻辑“或”操作指令 令 ORRORR 指令将指令将 operand2operand2 的值与寄存器的值与寄存器 RnRn 的值的值按位逻辑“或”操作,结果保存到按位逻辑“或”操作,结果保存到 RdRd 中。中。指令格式如下: 指令格式如下: ORR{cond}{S} RdORR{cond}{S} Rd ,, RnRn ,, operand2operand2

指令举例如下: 指令举例如下: ORR R0ORR R0 ,, R0R0 ,, #0x0F #0x0F ;将;将 R0R0 的低的低 44 位位置置 11

Page 53: 2.3 ARM/THUMB 指令系统

EOR——EOR—— 逻辑“异或”操作指逻辑“异或”操作指令令EOREOR 指令将指令将 operand2operand2 的值与寄存器的值与寄存器 RnRn 的的值按位逻辑“异或”操作值按位逻辑“异或”操作 ,, 结果保存到结果保存到 RdRd 中。中。指令格式如下指令格式如下 ::EOR{cond}{S} RdEOR{cond}{S} Rd ,, RnRn ,, operand2operand2

指令举例如下:指令举例如下:EOR R1,R1,#0x0F EOR R1,R1,#0x0F ;将;将 RlRl 的低的低 44 位取反位取反EORS R0,R5,#0x01 EORS R0,R5,#0x01 ;将;将 R0=R5^0x01,R0=R5^0x01,并影响标志位 并影响标志位

Page 54: 2.3 ARM/THUMB 指令系统

⑩ ⑩ BIC——BIC—— 位清除指令位清除指令BICBIC 指令将寄存器指令将寄存器 RnRn 的值与的值与 operand2operand2 的值的值的反码按位逻辑“与”操作的反码按位逻辑“与”操作 ,, 结果保存到结果保存到 RdRd 中。中。指令格式如下指令格式如下 ::BIC{cond}{S} Rd,Rn,operand2BIC{cond}{S} Rd,Rn,operand2

指令举例如下:指令举例如下:BIC R1BIC R1 ,, R1R1 ,, #0x0F #0x0F ;将;将 R1R1 的低的低 44 位位清零,其它位不变 清零,其它位不变

Page 55: 2.3 ARM/THUMB 指令系统

(3) (3) 比较指令比较指令① ① CMP——CMP—— 比较指令比较指令CMPCMP 指令将寄存器指令将寄存器 RnRn 的值减去的值减去 operand2operand2的值,根据操作的结果更新的值,根据操作的结果更新 CPSRCPSR 中的相应中的相应条件标志位,以便后面的指令根据相应的条条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。件标志来判断是否执行。指令格式指令格式如下:如下:CMP{cond} RnCMP{cond} Rn ,, operand2operand2指令举例如下:指令举例如下:CMP R1CMP R1 ,, #10 #10 ;; R1R1 与与 1010比较,设置比较,设置相关标志位 相关标志位

Page 56: 2.3 ARM/THUMB 指令系统

CMN——CMN——负数比较指令 负数比较指令 CMNCMN 指令将寄存器指令将寄存器 RnRn 的值加上的值加上 operand2operand2 的值,的值,根据操作的结果更新根据操作的结果更新 CPSRCPSR 中的相应条件标志位,以便中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。后面的指令根据相应的条件标志来判断是否执行。指令格式如下:指令格式如下:CMN{cond} RnCMN{cond} Rn ,, operand2operand2指令举例如下:指令举例如下:CMN R0CMN R0 ,, #1 #1 ;; R0+1R0+1 ,判断,判断 R0R0 是否为是否为 11 的的补码。若是,则补码。若是,则 ZZ 位置位置 11 。。CMNCMN 指令与指令与 ADDSADDS 指令的指令的区别区别在于在于 CMNCMN 指令不指令不保存运算结果。保存运算结果。 CMNCMN 指令可用于负数比较,比如“指令可用于负数比较,比如“ CC

MN R0MN R0 ,, #1”#1” 指令则表示指令则表示 R0R0 与与 -1-1 比较。若比较。若 R0R0 为为 -1-1(( 即即 11 的补码的补码 )) ,则,则 ZZ 置位;否则置位;否则 ZZ复位 复位

Page 57: 2.3 ARM/THUMB 指令系统

③ ③ TST——TST—— 位测试指令位测试指令TSTTST 指令将寄存器指令将寄存器 RnRn 的值与的值与 operand2operand2 的值按位逻辑的值按位逻辑“与”操作,根据操作的结果更新“与”操作,根据操作的结果更新 CPSRCPSR 中的相应条件标中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下:指令格式如下:TST{cond} RnTST{cond} Rn ,, operand2operand2指令举例如下:指令举例如下:TST R0TST R0 ,, #0x01 #0x01 ;判断;判断 R0R0 的最低位是否为的最低位是否为 00TST RlTST Rl ,, #0x0F #0x0F ;判断;判断 R1R1 的低的低 44 位是否为位是否为 00TSTTST 指令与指令与 ANDSANDS 指令的区别在于指令的区别在于 TSTTST 指令不保存运指令不保存运算结果。算结果。 TSTTST 指令通常与指令通常与 EQEQ 、、 NENE 条件码配合使用。当所条件码配合使用。当所有测试位均为有测试位均为 00 时,时, EQEQ 有效。而只要有一个测试位不为有效。而只要有一个测试位不为 00 ,,则则 NENE 有效。 有效。

Page 58: 2.3 ARM/THUMB 指令系统

④ ④ TEQ——TEQ—— 相等测试指令相等测试指令TEQTEQ 指令将寄存器指令将寄存器 RnRn 的值与的值与 operand2operand2 的值按位的值按位逻辑“异或”操作,根据操作的结果更新逻辑“异或”操作,根据操作的结果更新 CPSRCPSR 中的中的相应条件标志位,以便后面的指令根据相应的条件标志相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。来判断是否执行。指令格式如下:指令格式如下:TEQ{cond} RnTEQ{cond} Rn ,, operand2operand2指令举例如下:指令举例如下:TEQ R0TEQ R0 ,, R1 R1 ;比较;比较 R0R0 与与 R1R1 是否相等是否相等 ((不不影响影响 VV 位和位和 CC 位位 ))TEQTEQ 指令与指令与 EORSEORS 指令的区别在于指令的区别在于 TEQTEQ 指令不保指令不保存运算结果。使用存运算结果。使用 TEQTEQ 进行相等测试时,常与进行相等测试时,常与 EQEQ 、、

NENE 条件码配合使用。当两个数据相等时条件码配合使用。当两个数据相等时 ,EQ,EQ 有效;否有效;否则则 NENE 有效。有效。

Page 59: 2.3 ARM/THUMB 指令系统

5. 5. 乘法指令乘法指令ARM7TDMI(-S)ARM7TDMI(-S) 具有具有 32×3232×32乘法指令、乘法指令、 32×3232×32 乘加指令,乘加指令, 33

2×322×32 结果为结果为 6464 位的乘/乘加指位的乘/乘加指令。令。ARMARM 乘法指令乘法指令如表如表3-93-9所列所列

Page 60: 2.3 ARM/THUMB 指令系统

(1) MUL——32(1) MUL——32 位乘法指令位乘法指令MULMUL 指令将指令将 RmRm 和和 RsRs 中的值相乘,结中的值相乘,结果的低果的低 3232 位保存到位保存到 RdRd 中。中。指令格式如下:指令格式如下:MUL{cond}{S} RdMUL{cond}{S} Rd ,, RmRm ,, RsRs

指令举例如下:指令举例如下:MUL R1MUL R1 ,, R2R2 ,, R3R3 ;; R1=R2×R3R1=R2×R3MULS R0MULS R0 ,, R3R3 ,, R7 R7 ;; R0=R3×R0=R3×

R7R7 ,同时设置,同时设置 CPSRCPSR 中的中的 NN 位和位和 ZZ 位 位

Page 61: 2.3 ARM/THUMB 指令系统

(2) MLA——32(2) MLA——32 位乘加指令位乘加指令MLAMLA 指令将指令将 RmRm 和和 RsRs 中的值相乘,再将中的值相乘,再将乘积加上第乘积加上第 33 个操作数,结果的低个操作数,结果的低 3232 位保存位保存到到 RdRd 中。中。指令格式如下: 指令格式如下: MLA{cond}{S} RdMLA{cond}{S} Rd ,, RmRm ,, RsRs ,, RnRn

指令举例如下: 指令举例如下: MLA R1MLA R1 ,, R2R2 ,, R3R3 ,, R0 R0 ;; R1=RR1=R

2×R3+R02×R3+R0

Page 62: 2.3 ARM/THUMB 指令系统

(3) UMULL—64(3) UMULL—64 位无符号乘法指令位无符号乘法指令UMULLUMULL 指令将指令将 RmRm 和和 RsRs 中的值作无符号中的值作无符号数相乘,结果的低数相乘,结果的低 3232 位保存到位保存到 RdLoRdLo 中,而高中,而高

3232 位保存到位保存到 RdHiRdHi 中。中。指令格式如下:指令格式如下: UMULL{cond}{S} RdLoUMULL{cond}{S} RdLo ,, RdHiRdHi ,, RmRm ,,

RsRs

指令举例如下:指令举例如下: UMULL R0UMULL R0 ,, R1R1 ,, R5R5 ,, R8 R8 ;; (R1(R1 、、

R0)R0) == R5×R8R5×R8

Page 63: 2.3 ARM/THUMB 指令系统

(4) UMLAL—64(4) UMLAL—64 位无符号乘加指令位无符号乘加指令UMLALUMLAL 指令将指令将 RmRm 和和 RsRs 中的值作无符号数中的值作无符号数相乘,相乘, 6464 位乘积与位乘积与 RdHiRdHi 、、 RdLoRdLo 相加,结果的低相加,结果的低

3232 位保存到位保存到 RdLoRdLo 中,而高中,而高 3232 位保存到位保存到 RdHiRdHi 中。中。指令格式如下:指令格式如下:UMLAL{cond}{S} RdLoUMLAL{cond}{S} RdLo ,, RdHiRdHi ,, RmRm ,,

RsRs指令举例如下:指令举例如下:UMLAL R0UMLAL R0 ,, R1R1 ,, R5R5 ,, R8 R8 ;; (R1(R1 、、 RR

0)0)== R5×R8+(R1R5×R8+(R1 、、 R0)R0)

Page 64: 2.3 ARM/THUMB 指令系统

(5) SMULL—64(5) SMULL—64 位有符号乘法指令位有符号乘法指令SMULLSMULL 指令将指令将 RmRm 和和 RsRs 中的值作有符号数相乘,中的值作有符号数相乘,结果的低结果的低 3232 位保存到位保存到 RdLoRdLo 中,而高中,而高 3232 位保存位保存到到 RdHiRdHi 中。中。指令格式如下:指令格式如下:SMULL{cond}{S} RdLoSMULL{cond}{S} RdLo ,, RdHiRdHi ,, RmRm ,, RsRs

指令举例如下:指令举例如下:SMULL R2SMULL R2 ,, R3R3 ,, R7R7 ,, R6 R6 ;; (R3(R3 、、 R2)R2)== R7×R6R7×R6

Page 65: 2.3 ARM/THUMB 指令系统

(6) SMLAL—64(6) SMLAL—64 位有符号乘加指令位有符号乘加指令SMLALSMLAL 指令将指令将 RmRm 和和 RsRs 中的值作有符号数中的值作有符号数相乘,相乘, 6464 位乘积与位乘积与 RdHiRdHi 、、 RdLoRdLo 相加,结果的相加,结果的低低 3232 位保存到位保存到 RdLoRdLo 中,而高中,而高 3232 位保存到位保存到 RdHiRdHi中。中。指令格式如下:指令格式如下:SMLAL{cond}{S} RdLo,RdHi,Rm,RsSMLAL{cond}{S} RdLo,RdHi,Rm,Rs

指令举例如下:指令举例如下:SMLAL R2SMLAL R2 ,, R3R3 ,, R7R7 ,, R6 R6 ;;(R3(R3 、、 R2)R2)== R7×R6+(R3R7×R6+(R3 、、 R2) R2)

Page 66: 2.3 ARM/THUMB 指令系统

6. ARM6. ARM 分支指令分支指令在在 ARMARM 中有两种方式可以实现程中有两种方式可以实现程序的序的跳转跳转:一种是使用分支指令直接跳:一种是使用分支指令直接跳转,另一种则是直接向转,另一种则是直接向 PCPC 寄存器赋值寄存器赋值来实现跳转。来实现跳转。分支指令有分支指令分支指令有分支指令 BB 、带连接、带连接的分支指令的分支指令 BLBL 、带状态切换的分支指、带状态切换的分支指令令 BXBX 。。ARMARM分支指令见表分支指令见表3-103-10

Page 67: 2.3 ARM/THUMB 指令系统

(1) B——(1) B—— 分支指令分支指令BB 指令跳转到指定的地址执行程序。指令跳转到指定的地址执行程序。指令格式如下:指令格式如下:B{cond} labelB{cond} label

指令举例如下:指令举例如下:B WAITA B WAITA ;跳转到;跳转到 WAITAWAITA 标号处标号处B 0x1234 B 0x1234 ;跳转到绝对地址;跳转到绝对地址 0x12340x1234 处处分支指令分支指令 BB限制在当前指令的限制在当前指令的 ±32 MB±32 MB 的范的范围内。围内。

Page 68: 2.3 ARM/THUMB 指令系统

(2) BL——(2) BL—— 带连接的分支指令带连接的分支指令BLBL 指令先将下—条指令的地址拷贝到指令先将下—条指令的地址拷贝到 R14 R14

(( 即即 LR)LR) 连接寄存器中,然后跳转到指定地址运连接寄存器中,然后跳转到指定地址运行程序。行程序。指令格式如下:指令格式如下:BL{cond} labelBL{cond} label

指令举例如下:指令举例如下:BL DELAYBL DELAY分支指令分支指令 BLBL 限制在当前指令的限制在当前指令的 ±32 MB±32 MB 的的范围内。范围内。 BLBL 指令用于子程序调用。指令用于子程序调用。

Page 69: 2.3 ARM/THUMB 指令系统

(3) BX——(3) BX—— 带状态切换的分支指令带状态切换的分支指令BXBX 指令跳转到指令跳转到 RmRm 指定的地址执行程序。指定的地址执行程序。若若 RmRm 的位的位 [0][0] 为为 11 ,则跳转时自动将,则跳转时自动将 CPSRCPSR 中的中的标志标志 TT 置位,即把目标地址的代码解释为置位,即把目标地址的代码解释为 ThumbThumb代码;代码;若若 RmRm 的位的位 [0][0] 为为 00 ,则跳转时自动将,则跳转时自动将 CPSRCPSR 中的标志中的标志

TT复位,即把目标地址的代码解释为复位,即把目标地址的代码解释为 ARMARM代码。代码。指令格式如下:指令格式如下:BX{cond} RmBX{cond} Rm

指令举例如下:指令举例如下:ADRL R0ADRL R0 ,, ThumbFun+1ThumbFun+1BX R0 BX R0 ;跳转到;跳转到 R0R0 指定的地址,并根据指定的地址,并根据 R0R0的最低位来切换处理器状态的最低位来切换处理器状态

Page 70: 2.3 ARM/THUMB 指令系统

7. ARM7. ARM 协处理器指令协处理器指令ARMARM支持协处理器操作。支持协处理器操作。协处理器的控制要通过协处理协处理器的控制要通过协处理器命令器命令 ((见表见表3-11)3-11)实现。实现。

Page 71: 2.3 ARM/THUMB 指令系统

(1) CDP——(1) CDP—— 协处理器数据操作指令协处理器数据操作指令ARMARM 处理器通过处理器通过 CDPCDP 指令通知指令通知 ARMARM 协处协处理器执行特定的操作。理器执行特定的操作。该操作由协处理器完成该操作由协处理器完成 ,, 即对命令参数的解即对命令参数的解释与协处理器有关释与协处理器有关 ,, 指令的使用取决于协处理器。指令的使用取决于协处理器。若协处理器不能成功地执行该操作若协处理器不能成功地执行该操作 ,, 将产生将产生未定义指令异常中断。 未定义指令异常中断。

Page 72: 2.3 ARM/THUMB 指令系统

指令格式如下:指令格式如下:CDP{cond} coproc,opcode1,CRd,CRn,CRm{,opcode2}CDP{cond} coproc,opcode1,CRd,CRn,CRm{,opcode2}其中:其中:Coproc Coproc 指令操作的协处理器名指令操作的协处理器名 .. 标准名为标准名为 pn,npn,n 为为

00 ~~ 1515 。。Opcode1Opcode1 协处理器的特定操作码。协处理器的特定操作码。CRdCRd 作为目标寄存的协处理器寄存器。作为目标寄存的协处理器寄存器。CRnCRn 存放第存放第 11 个操作数的协处理器寄存器。个操作数的协处理器寄存器。CRmCRm 存放第存放第 22 个操作数的协处理器寄存器。个操作数的协处理器寄存器。opcode2 opcode2 可选的协处理器特定操作码。可选的协处理器特定操作码。指令举例如下:指令举例如下:CDP p7,0,c0,c2,c3,0 CDP p7,0,c0,c2,c3,0 协处理器协处理器 77 操作操作 ,, 操作码操作码为为 0,0, 可选操作码为可选操作码为 00CDP p6,1,c3,c4,c5 CDP p6,1,c3,c4,c5 协处理器协处理器 66 操作操作 ,, 操作码操作码为为 1 1

Page 73: 2.3 ARM/THUMB 指令系统

(2) LDC——(2) LDC—— 协处理器数据读取指令 协处理器数据读取指令 LDCLDC 指令从某一连续的内存单元将数据读取到协处理器的寄存指令从某一连续的内存单元将数据读取到协处理器的寄存器中器中 .. 进行协处理器数据的数据传送进行协处理器数据的数据传送 ,, 由协处理器来控制传送的字数由协处理器来控制传送的字数 ..若协处理器不能成功地执行该操作若协处理器不能成功地执行该操作 ,, 将产生未定义指令异常中断将产生未定义指令异常中断 ..

指令格式如下:指令格式如下:LDC{cond}{L} coprocLDC{cond}{L} coproc ,, CRdCRd ,, << 地址地址 >>其中:其中:L L 可选后缀,指明是长整数传送。可选后缀,指明是长整数传送。coproc coproc 指令操作的协处理器名。标准名为指令操作的协处理器名。标准名为 pnpn ,, nn 为为 0~150~15 。。CRdCRd 作为目标寄存的协处理器寄存器。作为目标寄存的协处理器寄存器。<< 地址地址 > > 指定的内存地址。指定的内存地址。指令举例如下:: LDC p5LDC p5 ,, c2c2 ,, [R2[R2 ,, #4] #4] ;读取;读取 R2+4R2+4 指向的内存单指向的内存单元的数据,传送到协处理器元的数据,传送到协处理器 p5p5 的的 c2c2 寄存器中寄存器中 LDC p6LDC p6 ,, c2c2 ,, [R1] [R1] ;读取;读取 R1R1 指向的内存单元的指向的内存单元的数据,传送到协处理器数据,传送到协处理器 p6p6 的的 c2c2 寄存器中 寄存器中

Page 74: 2.3 ARM/THUMB 指令系统

(3) STC——(3) STC——协处理器数据写入指令协处理器数据写入指令STCSTC 指令将协处理器的寄存器数据写入到某一连续指令将协处理器的寄存器数据写入到某一连续的内存单元中。的内存单元中。进行协处理器数据的数据传送,由协处理器来控制进行协处理器数据的数据传送,由协处理器来控制传送的字数。传送的字数。若协处理器不能成功地执行该操作,将产生未定义若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令异常中断。指令格式如下:指令格式如下:STC{cond}{L} coprocSTC{cond}{L} coproc ,, CRdCRd ,, << 地址地址 >>其中格式说明同 其中格式说明同 LDC LDC 指令。指令。指令举例如下:指令举例如下:STC p5STC p5 ,, c1c1 ,, [R0][R0]STC p5STC p5 ,, clcl ,, [R0[R0 ,, #-0x04]#-0x04]

Page 75: 2.3 ARM/THUMB 指令系统

(4) MCR ——ARM(4) MCR ——ARM 寄存器到协处理寄存器到协处理器寄存器的数据传送指令器寄存器的数据传送指令MCRMCR 指令将指令将 ARMARM 处理器的寄存器中的数据传送处理器的寄存器中的数据传送到协处理器的寄存器中。若协处理器不能成功地执行到协处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。该操作,将产生未定义指令异常中断。指令格式如下:指令格式如下:MCR{cond} coprocMCR{cond} coproc ,, opcode1opcode1 ,, RdRd ,, CRCR

nn ,, CRm{CRm{ ,, opcode2}opcode2}其中格式说明同 其中格式说明同 CDP CDP 指令。指令。指令举例如下:指令举例如下:MCR p6MCR p6 ,, 22 ,, R7R7 ,, clcl ,, c2c2MCR p7MCR p7 ,, 00 ,, R1R1 ,, c3c3 ,, c2c2 ,, 1 1

Page 76: 2.3 ARM/THUMB 指令系统

(( 55 )) MRC——MRC——协处理器寄存器到协处理器寄存器到ARMARM 寄存器的数据传送指令寄存器的数据传送指令

MRCMRC 指令将协处理器寄存器中的数据传送到指令将协处理器寄存器中的数据传送到 AARMRM 处理器的寄存器中。若协处理器不能成功地执处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。行该操作,将产生未定义指令异常中断。指令格式如下: 指令格式如下:

MRC{cond} coprocMRC{cond} coproc ,, opcode1opcode1 ,, RdRd ,, CCRnRn ,, CRm{CRm{ ,, opcode2}opcode2}其中格式说明同 其中格式说明同 CDP CDP 指令。指令。

指令举例如下:指令举例如下:MRC p5MRC p5 ,, 22 ,, R2R2 ,, c3c3 ,, c2c2MRC p7MRC p7 ,, 00 ,, R0R0 ,, c1c1 ,, c2c2 ,, 11

Page 77: 2.3 ARM/THUMB 指令系统

88 .. ARMARM 杂项指令杂项指令ARMARM杂项指令如表杂项指令如表 3-123-12 所列。所列。表 表 3-12 ARM3-12 ARM杂项指令杂项指令助记符 说明 操作 条件码位置

SWI immed_24 软中断指令 产生软中断,处理器进入管理模式 SWI{cond}MRS Rd,psr 读状态寄存器指令 Rd←psr,psr为 CPSR或 SPSR MRS{cond}MSR psr_fields,Rd #immend_8r

写状态寄存器指令 Psr_fields←Rd/#immed_8r,psr为 CPSR或 SPSR MSR{cond}

Page 78: 2.3 ARM/THUMB 指令系统

(1) SWI——(1) SWI—— 软中断指令软中断指令SWISWI 指令用于产生软中断,从而实现从用户模式指令用于产生软中断,从而实现从用户模式变换到管理模式,变换到管理模式, CPSRCPSR 保存到管理模式的保存到管理模式的 SPSRSPSR 中,中,执行转移到执行转移到 SWISWI 向量。在其它模式下也可使用向量。在其它模式下也可使用 SWISWI 指指令,处理器同样地切换到管理模式。令,处理器同样地切换到管理模式。指令格式如下:指令格式如下:SWI{cond} immed_24SWI{cond} immed_24其中: 其中: immed_24 24immed_24 24 位立即数,值为位立即数,值为 0~16 770~16 77

7 2157 215 之间的整数。之间的整数。指令举例如下:指令举例如下:SWI 0 SWI 0 ;软中断,中断立即数为;软中断,中断立即数为 00SWI 0xl23456 SWI 0xl23456 ;软中断,中断立即数为;软中断,中断立即数为 0xl2340xl234

56 56

Page 79: 2.3 ARM/THUMB 指令系统

使用使用 SWISWI 指令时,通常使用以下两种方法指令时,通常使用以下两种方法进行传递参数,进行传递参数, SWISWI异常中断处理程序就可以异常中断处理程序就可以提供相关的服务。提供相关的服务。这两种方法均由用户软件协定。这两种方法均由用户软件协定。SWISWI异常中断处理程序要通过读取引起软异常中断处理程序要通过读取引起软中断的中断的 SWISWI 指令,以取得指令,以取得 2424 位立即数。位立即数。① ① 指令中的指令中的 2424 位立即数指定了用户请求位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。的服务类型,参数通过通用寄存器传递。MOV R0MOV R0 ,, #34 #34 ;设置子功能号为;设置子功能号为 33

44SWI 12 SWI 12 ;调用;调用 1212 号软中断号软中断

Page 80: 2.3 ARM/THUMB 指令系统

② ② 指令中的指令中的 2424 位立即数被忽略,用户请求的服务位立即数被忽略,用户请求的服务类型由寄存器类型由寄存器 R0R0 的值决定,参数通过其它通用寄的值决定,参数通过其它通用寄存器传递。存器传递。MOV R0MOV R0 ,, #12 #12 ;调用;调用 1212 号软中断号软中断MOV R1MOV R1 ,, #34 #34 ;设置子功能号为;设置子功能号为 3434SWI 0SWI 0在在 SWISWI异常中断处理程序中,取出异常中断处理程序中,取出 SWISWI 立即立即数的步骤为:数的步骤为:首先确定引起软中断的首先确定引起软中断的 SWISWI 指令是指令是 ARMARM 指指令还是令还是 ThumbThumb 指令,这可通过对指令,这可通过对 SPSRSPSR访问得到;访问得到;然后取得该然后取得该 SWISWI 指令的地址,这可通过访问指令的地址,这可通过访问

LRLR 寄存器得到;寄存器得到;接着读出指令,分解出立即数。 接着读出指令,分解出立即数。

Page 81: 2.3 ARM/THUMB 指令系统

(( 22 )) MRS——MRS—— 读状态寄存器指令读状态寄存器指令在在 ARMARM 处理器中,只有处理器中,只有 MRSMRS 指令可以将状态指令可以将状态寄存器寄存器 CPSRCPSR 或或 SPSRSPSR 读出到通用寄存器中。读出到通用寄存器中。指令格式如下:指令格式如下:MRS{cond} RdMRS{cond} Rd ,, psrpsr其中: 其中: Rd Rd 目标寄存器。目标寄存器。 RdRd不允许为不允许为 R15R15 。。psr CPSRpsr CPSR 或或 SPSRSPSR 。。指令举例如下:指令举例如下:MRS R1,CPSR MRS R1,CPSR ;将;将 CPSRCPSR状态寄存器读取状态寄存器读取 ,,保存到保存到 R1R1 中中MRS R2,SPSR MRS R2,SPSR ;将;将 SPSRSPSR状态寄存器读取状态寄存器读取 ,,保存到保存到 R2R2 中 中

Page 82: 2.3 ARM/THUMB 指令系统

MRSMRS 指令读取指令读取 CPSRCPSR ,可用来判断,可用来判断 ALUALU 的的状态标志,或状态标志,或 IRQIRQ 、、 FIQFIQ 中断是否允许等。中断是否允许等。在异常处理程序中,读在异常处理程序中,读 SPSRSPSR 可知道进可知道进行异常前的处理器状态等。行异常前的处理器状态等。MRSMRS 与与 MSRMSR 配合使用,实现配合使用,实现 CPSRCPSR 或或 SPSSPSRR 寄存器的读一修改一写操作,可用来进行寄存器的读一修改一写操作,可用来进行处理器模式切换、允许/禁止处理器模式切换、允许/禁止 IRQ/FIQIRQ/FIQ 中断中断等设置。等设置。另外,当进程切换或允许异常中断嵌套时,另外,当进程切换或允许异常中断嵌套时,也需要使用也需要使用 MRSMRS 指令来读取指令来读取 SPSRSPSR 状态值,状态值,并保存起来。并保存起来。

Page 83: 2.3 ARM/THUMB 指令系统

(( 33 )) MSR——MSR—— 写状态寄存器指令 写状态寄存器指令 在在 ARMARM 处理器中,只有处理器中,只有 MSRMSR 指令可以直接设置状态寄存器指令可以直接设置状态寄存器

CPSRCPSR 或或 SPSRSPSR 。。指令格式如下:指令格式如下:MSR{cond} psr_fieldsMSR{cond} psr_fields ,, #immed_8r#immed_8rMSR{cond} psr_fieldsMSR{cond} psr_fields ,, RmRm其中:其中:psr CPSRpsr CPSR 或或 SPSRSPSR 。。fields fields 指定传送的区域。指定传送的区域。 fieldsfields 可以是以下的一种或多种可以是以下的一种或多种

(( 字母必须为小写字母必须为小写 )) ::c c 控制域屏蔽字节控制域屏蔽字节 (psr[7…0])(psr[7…0]) ;;x x 扩展域屏蔽字节扩展域屏蔽字节 (psr[15…8])(psr[15…8]) ;;s s 状态域屏蔽字节状态域屏蔽字节 (psr[23…16])(psr[23…16]) ;;f f 标志域屏蔽字节标志域屏蔽字节 (psr[31…24])(psr[31…24]) 。。immed_8r immed_8r 要传送到状态寄存器指定域的立即数,要传送到状态寄存器指定域的立即数, 88 位。位。Rm Rm 要传送到状态寄存器指定域的数据的源寄存器。 要传送到状态寄存器指定域的数据的源寄存器。

Page 84: 2.3 ARM/THUMB 指令系统

指令举例如下:指令举例如下:MSR CPSR—cMSR CPSR—c ,, #0xD3 #0xD3 ;; CPSR…0]CPSR…0]==

0xD30xD3 ,即切换到管理模式,即切换到管理模式MSR CPSR—cxsfMSR CPSR—cxsf ,, R3 R3 ;; CPSR=R3CPSR=R3只有在特权模式下才能修改状态寄存器。只有在特权模式下才能修改状态寄存器。程序中不能通过程序中不能通过 MSRMSR 指令直接修改指令直接修改 CPSRCPSR 中中的的 TT控制位来实现控制位来实现 ARMARM状态/状态/ ThumbThumb状态的切换,状态的切换,必须使用必须使用 BXBX 指令完成处理器状态的切换指令完成处理器状态的切换 ((因为因为 BXBX指令属分支指令,它会打断流水线状态,实现处理指令属分支指令,它会打断流水线状态,实现处理器状态切换器状态切换 )) 。。MRSMRS 与与 MSRMSR配合使用,实现配合使用,实现 CPSRCPSR 或或 SPSRSPSR寄存器的读—修改—写操作,可用来进行处理器模寄存器的读—修改—写操作,可用来进行处理器模式切换、允许/禁止式切换、允许/禁止 IRQ/FIQIRQ/FIQ 中断等设置中断等设置 . .

Page 85: 2.3 ARM/THUMB 指令系统

99 .. ARMARM 伪指令伪指令ARMARM伪指令不是伪指令不是 ARMARM 指令集中指令集中的指令,只是为了编程方便编译器定的指令,只是为了编程方便编译器定义了伪指令。可以像其它义了伪指令。可以像其它 ARMARM 指令一指令一样使用伪指令,但在编译时这些指令样使用伪指令,但在编译时这些指令将被等效的将被等效的 ARMARM 指令代替。指令代替。ARMARM伪指令有伪指令有 44 条,分别为条,分别为 ADRADR伪指令、伪指令、 ADRLADRL伪指令、伪指令、 LDRLDR伪指令伪指令和和 NOPNOP伪指令。伪指令。

Page 86: 2.3 ARM/THUMB 指令系统

(( 11 )) ADR—ADR— 小范围地址读取伪指小范围地址读取伪指令 令 ADRADR 指令将基于指令将基于 PCPC 相对偏移的地相对偏移的地址值或基于寄存器相对偏移的地址值读取址值或基于寄存器相对偏移的地址值读取到寄存器中。到寄存器中。在汇编编译源程序时在汇编编译源程序时 ,ADR,ADR 伪指令被伪指令被编译器替换成一条合适的指令。编译器替换成一条合适的指令。通常通常 ,, 编译器用一条编译器用一条 ADDADD 指令或指令或 SUSU

BB 指令来实现该指令来实现该 ADRADR 伪指令的功能。若伪指令的功能。若不能用一条指令实现不能用一条指令实现 ,, 则产生错误则产生错误 ,, 编译编译失败。 失败。

Page 87: 2.3 ARM/THUMB 指令系统

伪指令格式如下:伪指令格式如下:ADR{cond} registerADR{cond} register ,, exprexpr其中: 其中: register register 加载的目标寄存器。 加载的目标寄存器。 expr expr 地址表达式。当地址值是非字对齐时,取地址表达式。当地址值是非字对齐时,取值范围在值范围在 -255~255-255~255 字节之间;当地址值是字对齐时,字节之间;当地址值是字对齐时,取值范围在取值范围在 -1 020-1 020 ~~ 1 0201 020 字节之间。字节之间。对于基于对于基于 PCPC 相对偏移的地址值时,给定范围是相相对偏移的地址值时,给定范围是相对当前指令地址后两个字处对当前指令地址后两个字处 ((因为因为 ARM7TDMIARM7TDMI 为三级流为三级流水线水线 )) 。。伪指令举例如下:伪指令举例如下:LOOP MOV R1LOOP MOV R1 ,, #0xF0#0xF0ADR R2ADR R2 ,, LOOP LOOP ;将;将 LOOPLOOP 的地址放人的地址放人 R2R2ADR R3ADR R3 ,, LOOP + 4LOOP + 4可以用可以用 ADRADR 加载地址实现查表, 加载地址实现查表,

Page 88: 2.3 ARM/THUMB 指令系统

(( 22 )) ADRL——ADRL—— 中等范围的地址中等范围的地址读取伪指令读取伪指令ADRLADRL 指令将基于指令将基于 PCPC 相对偏移的相对偏移的地址值或基于寄存器相对偏移的地址值地址值或基于寄存器相对偏移的地址值读取到寄存器中。读取到寄存器中。ADRLADRL比比 ADRADR 伪指令可以读取更伪指令可以读取更大范围的地址。大范围的地址。在汇编编译源程序时,在汇编编译源程序时, ADRLADRL伪指伪指令被编译器替换成两条合适的指令。若令被编译器替换成两条合适的指令。若不能用两条指令实现不能用两条指令实现 ADRLADRL伪指令功能,伪指令功能,则产生错误,编译失败。则产生错误,编译失败。

Page 89: 2.3 ARM/THUMB 指令系统

伪指令格式如下:伪指令格式如下:ADRL{cond} registerADRL{cond} register ,, exprexpr其中: 其中: register register 加载的目标寄存器。 、加载的目标寄存器。 、expr expr 地址表达式。当地址值是非字对齐时,取值地址表达式。当地址值是非字对齐时,取值范围在范围在 -64KB-64KB ~~ 64 KB64 KB 之间;当地址值是字对齐时,取之间;当地址值是字对齐时,取值范围在值范围在 -256KB~256 KB-256KB~256 KB 之间。之间。伪指令举例如下:伪指令举例如下: ADRL R0ADRL R0 ,, DATA—BUFDATA—BUF ADRL R1ADRL R1 ,, DATA—BUF+80DATA—BUF+80 DATA—BUFDATA—BUF SPACE 100 SPACE 100 ;定义;定义 100100 字节缓冲区字节缓冲区可以用可以用 ADRLADRL 加载地址,实现程序跳转加载地址,实现程序跳转

Page 90: 2.3 ARM/THUMB 指令系统

(( 33 )) LDR—LDR— 大范围地址读取伪指大范围地址读取伪指令令LDRLDR 伪指令用于加载伪指令用于加载 3232 位的立即数或一个位的立即数或一个地址值到指定寄存器。地址值到指定寄存器。在汇编编译源程序时,在汇编编译源程序时, LDRLDR 伪指令被编译伪指令被编译器替换成一条合适的指令。器替换成一条合适的指令。若加载的常数未超出若加载的常数未超出 MOVMOV 或或 MVNMVN 的范围,的范围,则使用则使用 MOVMOV 或或 MVNMVN 指令代替该指令代替该 LDRLDR 伪指令;伪指令;否则汇编器将常量放入文字池,并使用一条程否则汇编器将常量放入文字池,并使用一条程序相对偏移的序相对偏移的 LDRLDR 指令从文字池读出常量。 指令从文字池读出常量。

Page 91: 2.3 ARM/THUMB 指令系统

伪指令格式如下:伪指令格式如下:LDR{cond} registerLDR{cond} register ,, =expr/label—expr=expr/label—expr

其中: 其中: register register 加载的目标寄存器。加载的目标寄存器。expr 32expr 32 位立即数。位立即数。Label—expr Label—expr 基于基于 PCPC 的地址表达式或外部的地址表达式或外部表达式。 表达式。

Page 92: 2.3 ARM/THUMB 指令系统

伪指令举例如下:伪指令举例如下:LDR R0LDR R0 ,, =0x12345678 =0x12345678 ;加载;加载 3232 位位立即数立即数 0x123456780x12345678LDR R0LDR R0 ,, =DATA_BUF+60 =DATA_BUF+60 ;加载;加载 DADATA_BUFTA_BUF 地址地址 +60+60……LTORG LTORG ;声明文字池;声明文字池……伪指令伪指令 LDRLDR 常用于加载芯片外围功能部件的寄常用于加载芯片外围功能部件的寄存器地址存器地址 (32(32 位立即数位立即数 )) ,以实现各种控制操作。,以实现各种控制操作。从从 PCPC 到文字池的偏移量必须小于到文字池的偏移量必须小于 4 KB4 KB 。。与与 ARMARM 指令的指令的 LDRLDR 相比,伪指令的相比,伪指令的 LDRLDR 的参的参数有“=”符号。数有“=”符号。

Page 93: 2.3 ARM/THUMB 指令系统

(4)NOP——(4)NOP—— 空操作伪指令空操作伪指令NOPNOP 伪指令在汇编时将会被替代成伪指令在汇编时将会被替代成 ARMARM中的空操作中的空操作 ,, 比如可能为“比如可能为“ MOV R0,R0”MOV R0,R0” 指令指令等。等。伪指令格式如下:伪指令格式如下: NOPNOP

Page 94: 2.3 ARM/THUMB 指令系统

2.3.3 Thumb 2.3.3 Thumb 指令集介绍 指令集介绍 ThumbThumb 指令集可以看作是指令集可以看作是 ARMARM 指令压缩形指令压缩形式的式的子集子集,是针对代码密度的问题而提出的,它,是针对代码密度的问题而提出的,它具有具有 1616 位位的的代码密度代码密度。。ThumbThumb 不是一个完整的体系结构不是一个完整的体系结构 ,, 不能期望不能期望处理器只执行处理器只执行 ThumbThumb 指令而不支持指令而不支持 ARMARM 指令集。指令集。因此,因此, ThumbThumb 指令只需要支持通用功能,必指令只需要支持通用功能,必要时可以借助于完善的要时可以借助于完善的 ARMARM 指令集,比如,所有指令集,比如,所有异常自动进入异常自动进入 ARMARM 状态。状态。

Page 95: 2.3 ARM/THUMB 指令系统

在编写在编写 ThumbThumb 指令时,先要使用伪指令指令时,先要使用伪指令 CCODEl6ODEl6 声明,而且在声明,而且在 ARMARM 指令中要使用指令中要使用 BXBX 指指令跳转到令跳转到 ThumbThumb 指令,以切换处理器状态。指令,以切换处理器状态。编写编写 ARMARM 指令时,则可使用伪指令指令时,则可使用伪指令 CODECODE3232声明。声明。

ThumbThumb 指令集没有协处理器指令、信号量指令集没有协处理器指令、信号量指令以及访问指令以及访问 CPSRCPSR 或或 SPSRSPSR 的指令,没有乘的指令,没有乘加指令及加指令及 6464 位乘法指令等,且指令的第二操作位乘法指令等,且指令的第二操作数受到限制;除了分支指令数受到限制;除了分支指令 BB 有条件执行功能外,有条件执行功能外,其它指令均为无条件执行;大多数其它指令均为无条件执行;大多数 ThumbThumb 数据数据处理指令采用处理指令采用 22 地址格式。地址格式。ThumbThumb 指令集与指令集与 ARMARM 指令集的区别一般有指令集的区别一般有如下几点:如下几点:

Page 96: 2.3 ARM/THUMB 指令系统

1. 1. 分支指令分支指令程序相对转移,特别是条件程序相对转移,特别是条件跳转与跳转与 ARMARM 代码下的跳转相比,代码下的跳转相比,在范围上有更多的限制,转向子在范围上有更多的限制,转向子程序是无条件的转移。程序是无条件的转移。

Page 97: 2.3 ARM/THUMB 指令系统

2. 2. 数据处理指令数据处理指令1.1. 数据处理指令是对通用寄存器进行操作。数据处理指令是对通用寄存器进行操作。在大多数情况下,操作的结果须放人其中在大多数情况下,操作的结果须放人其中一个操作数寄存器中,而不是第一个操作数寄存器中,而不是第 33 个寄存个寄存器中。器中。2.2. 数据处理操作比数据处理操作比 ARMARM 状态的更少。状态的更少。3.3. 访问寄存器访问寄存器 R8~R15R8~R15受到一定限制。受到一定限制。4.4. 除除 MOVMOV 和和 ADDADD 指令访问器指令访问器 R8R8 ~~ R15R15 外,外,其它数据处理指令总是更新其它数据处理指令总是更新 CPSRCPSR 中的中的 AA

LULU状态标志。状态标志。5.5. 访问寄存器访问寄存器 R8~R15R8~R15 的的 ThumbThumb 数据处理数据处理指令不能更新指令不能更新 CPSRCPSR 中的中的 ALUALU 状态标志。状态标志。

Page 98: 2.3 ARM/THUMB 指令系统

3. 3. 单寄存器加载和存储指令单寄存器加载和存储指令在在 ThumbThumb状态下,单寄存器加载和存储指令状态下,单寄存器加载和存储指令只能访问寄存器只能访问寄存器 R0~R7R0~R7 。。4. 4. 多寄存器加载和存储指令多寄存器加载和存储指令LDMLDM 和和 STMSTM 指令可以将任何范围为指令可以将任何范围为 R0~R7R0~R7的寄存器子集加载或存储,多寄存器加载和存储的寄存器子集加载或存储,多寄存器加载和存储指令只有指令只有 LDMIALDMIA 和和 STMIASTMIA 指令。指令。PUSHPUSH 和和 POPPOP 指令使用堆栈指令指令使用堆栈指令 R13R13 作为基作为基址实现满递减堆栈。址实现满递减堆栈。除除 R0~R7R0~R7外外 ,PUSH,PUSH 指令还可以存储连接寄指令还可以存储连接寄存器存器 R14,R14, 并且并且 POPPOP 指令可以加载程序指令指令可以加载程序指令 PCPC 。。