第3章 基于ARM的嵌入式软件开发基础 北京航空航天出版社

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3、比较和测试指令CMP\CMN,TEQ,TST TEQ:测试Rn和第二操作数是否相等 TST用于测试某些位 比较和测试指令在执行时不保存比较结果,只是刷新程序标志位
Opcode[Cond] Rn,Rm或Operand2 4、逻辑与AND、逻辑或ORR、异或EOR、位清除指令BIC
Opcode [Cond] Rd ,Rn, Rm或Operand2 例:BIC R0,R2,#2_0011; 清除R2中的位[1:0] 例:EOR R5,R5,#0x0FF000000; R5的最高字节求非 例:EOR R5,R5,#0x00FF0000; R5的次最高字节求非
(4)带符号字节和半字加载指令LDRSB和LDRSH 只有加载指令,没有存储指令
(5)数据块传送指令LDM和STM 格式:LDM/STM [Cond] Mode Rn,{寄存器列表}[^]
格式:LDM/STM [Cond] Mode Rn,{寄存器列表}[^]
说明:
①Rn是基址寄存器(包括堆栈),不可以使用任何形式的偏移
第3章 基于ARM的嵌入式软件开 发基础 北京航空航天出版社
3.1 ARM指令集 一、ARM指令集概述
1、ARM指令集编码 统一采用32位编码。
2、条件执行
最高4位[31~28]是条件码域。满足条件则执 行,否则不执行。
例:ADDEQ R5,R7,R3,LSL#2
条件后缀紧跟在指令助记符的后面 被测试条件位有Z 、 C 、 N 、 V 常用后缀有:EQ NE GE LE 3、指令格式 <opcode> {cond}{S} <Rd>,<Rn>{,operand2} 说明:{ }表示可选项
第一行和第二行是前索引,第二行是后索引。
(2)字节传送和字传送 B表示字节,H表示半字
如果要存储其它字节,可以采用移位的方法将要存储的 字节移到最低字节[7~0]。
存储器
Adress+3 X?
A
Adress+2 X?
A
A
Adress+1 X?
A
X? Adress
寄存器
D
D 24
C
C 16 B
A
B8
存储器。
加载
模块或芯片
寄存器R0~R15
存储器
ARM处理器
存储
1 数据传送中的几个问题
(1)地址的偏移和索引
例:LDR R5,[Rn,#0x04] ;R5 [Rn+4],偏移量为4 LDR R6,[Rn,#-0x08] :R6 [Rn-8],偏移量-8 LDR R3,[Rn],#-0x0C ;R3 [Rn],Rn Rn-0x0c
5 MSR:通用寄存器到CPSR或SPSR MRS: CPSR或SPSR到通用寄存器
②!后缀不能用在R15后 ③!后缀当使用在单个寄存器后时,必须确信此寄 存器有隐性的偏移量。
如STMDB R1!,{R3,R5,R7} ; 基址寄存器R1的隐性偏移量为4
例:判断下列程序是否正确 LDR R3,[R4]! ADD R6,R5,#4! LDMIA R6,{R3~R7}! LDMFD R13!,{R2,R4}
意义
逻辑位与 逻辑位异或

反向减

带进位加
带进位减 反向带进位减
测试
测试相等
比较 负数比较
逻辑位或
传送
位清零 求反
Rd = Rn AND Op2
效果
Rd = Rn EOR Op2
Rd = Rn - Op2
Rd = Op2 – Rn
Rd = Rn + Op2
Rd = Rn + Op2 + C
Rd = Rn - Op2 + C -1
第2操作数 第1操作寄存器 目标寄存器 指令助记符
1、数据传送指令MOV和MVN 传送数据用MOV,传送数据的 非 用MVN。 MOV/MVN [Cond] Rd,Rm或者Operand2
2、加法指令ADD、减法指令SUB、反减法指令RSB、带 进位加法ADC、带借位减SBC、带借位反减RSC
Opcode [Cond] Rd ,Rn, Rm或Operand2
解:第一行是,第二行不是。
2、寄存器寻址 :利用寄存器中的数值作为操作数
如下指令: ADD R0,R1,R2
;R0←R1+R2
第二操作数为寄存器 注(1)第二操作数为寄存器时可以进行移位; 例: ADD R3,R2,R1,LSR #2 ;R3 R2 + R1/4
(2)移位方式 LSL:逻辑左移,空出的最低有效位用0填充。
格式:LDM/STM [Cond] Mode Rn,{寄存器列表}[^] ③寄存器列表:
使用{ },寄存器按从小到大顺序排,R0~R15 使用连续的寄存器时,使用’-’表示省略 ④[^]是可选后缀,但在用户模式下不可以使用。 ⑤当存储R15时,存储的值是正在执行的PC加12,R15不可 作为基址寄存器。
只有最后一句正确,基址R13的隐性偏移量为4
3)B后缀 所涉及的数据是一个字节。
例:LDR R3,[R0,#20] ;R3 [R0+#20] 传送一个字,即4个字节
LDRB R3,[R0,#20] ;R3 [R0+#20 ]传送一个字节
二、 ARM寻址方式
1、 立即寻址 :操作数在指令中直接给出
三、数据处理指令
• 数据处理指令的二进制编码如下:
操作码[24:21]
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
助记符
AND EOR SUB RSB ADD ADC SBC RSC TST TEQ CMP CMN ORR MOV BIC MVN
3、寄存器间接寻址
以寄存器中的值作为操作数的地址,而操作数 本身放在存储器中。
• LDR R0,[R1] • STR R0,[R1]
;R0←[R1] ;[R1]←R0
4、基址加偏址寻址
基址寄存器的内容与指令中给出的地址偏移量相加, 从而得到一个操作数的有效地址。
(1)前变址模式:
• LDR R0,[R1,#4]
LDMFD LDMFD STMIA STMIA
SP, {R12,R15} SP!, {R12,R15} R0,{R0-R5} R1,{R0-R5}
第4条错误,为什么?
第4条:使用STM且基址寄存器在列表中时,基址寄存器必须 是列表中最小的。
(6)数据字交换指令SWP和字节交换指令SWPB SWP/SWPB[Cond] Rd,Rm,[Rn]
LSR:逻辑右移,空出的最高有效位用0填充。
ASL:算术左移,左移空出的有效位用0填充,因 此 它与LSL同义。
ASR:算术右移,空出的位用符号位补充
ROR:循环右移,移出的最低有效位依次填 入空 出的最高有效位。
RRX:带扩展的循环右移。将寄存器的内容循环右移 1位,空位用原来C标志位填充。
(3)移位位数可以是一个5位的立即数或寄存器 例:ADD R3,R2,R1,LSR R4 ;R3 <—R2 + R1÷2R4
பைடு நூலகம்Rd = Op2 - Rn + C -1
根据Rn AND Op2设置条件码
根据Rn EOR Op2设置条件
根据Rn - Op2设置条件码 根据Rn + Op2设置条件码
Rd = Rn OR Op2
Rd = Op2
Rd = Rn AND NOT Op2 Rd = NOT Op2
ADD R3,R7,#0x0FF SUB R0,R3,R5,LSL#0x02
① 满堆栈 :指针指向最后压入的数据 ② 空堆栈 :指针指向最后压入的数据的上或
下一个数据
(3)四种类型的堆栈工作方式 满递增堆栈 FA(full aggrandizement) 满递减堆栈 FD(full decrement) 空递增堆栈 EA(empty aggrandizement) 空递减堆栈 ED(empty decrement)
ADD R0,R0,#1 ;R0←R0+1 ADD R0,R0,#0x3f
注(1)不是每个32位数都可以作为立即数。 (2)立即数是由8位常数循环右移偶数位而得。 有效立即数判断方法: 最远的2个1之间相距的二进制数不超过6位。
例:判断下列立即数是否正确
0x0000F200 0x00110000 0x00012800 0x00001010 0x00802000 0xFF100000
A0 存储的字节
A存于哪个地址不定,由存储器结构决定。
从存储器读出数据时,ARM将所选择的传送字节放在最低 字节[7~0],其余字节用0补齐。
存储器
Adress+3 D
D
Adress+2 C
C
字节地址
Adress+1
B
B A
A Adress
寄存器
00
00 24
00
00 16 00
B
00 8
B0
2 数据传送指令代码详述 (1)字传送指令LDR和STR
格式 LDR/STR[Cond] Rd,[Rn, ±偏移表达式] 前索引方式 LDR/STR[Cond] Rd,[Rn] ±偏移表达式 后索引方式
(2)无符号字节传送指令LDRB和STRB
格式 LDRB/STRB[Cond] Rd,[Rn, ±偏移表达式] 前索引方式 LDRB/STRB[Cond] Rd,[Rn] ±偏移表达式 后索引方式
4、常用后缀 1)S后缀
指令执行后CPSR的条件标志位将刷新。
例:ADDS R3,R5,R8 ;R3 R5+R8,执行后条件标志位刷新
2)!后缀 指令执行后基址寄存器中的地址将发生变化。
例:LDMIA R3,[R0,#04]! ;R3 [R0+#4],执行后R0=R0+#04
注意: ①!后缀必须紧跟在表达地址的表达式后面,表达 式中必须要有明确的地址偏移量。
LDMIA R0 ,{R2,R9}
7、相对寻址
以PC为基地址,指令中的地址标号作为偏移量。
BL SUBR
SUBR … … MOV PC,LR
3.1.3 ARM指令详细介绍 一、数据传送指令
在ARM为核的单片机中,所有外围模块(片
内)都和存储单元一样,是ARM的不同的地址单
元,不管是片内还是片外,ARM都将之视为外部
R0
R9
R3
R1
STMIB R0!,{R1,R3,R9} 已知R0=0x100C
R9 R3 R1
R0
编号低的寄存器 与较低地址相对应。
STMDA R0!,{R1,R3,R9} 已知R0=0x100C
R9
R3
R0
R1
STMDB R0!,{R1,R3,R9} 已知R0=0x100C
LDMIA R0! ,{R2,R9} 区别在哪?
Rn指向的存储器中的数据加载到Rd,Rm的数据 存到Rn指向的地址中。
复习
LDMIA LDMIA LDMED LDMFD STMIA
R0, {R1-R5} R0!, {R1-R5} SP!, {R1-R5} SP!, {R1-R5} R1,{R0-R5}
第5条错误,为什么?
第5条:使用STM且基址寄存器在列表中时,基址寄存器必须 是列表中最小的。
②Cond 是可选后缀,而Mode是必选后缀,包括下面几种
索 IA后缀:每次传输后基址加4,指向下一个字,递增 引 IB后缀:每次传输前基址加4,指向本次传输的字,递增 后 DA后缀:每次传输后基址减4,指向下一个字,递减 缀 DB后缀:每次传输前基址减4,指向本次传输的字,递减
堆 FD后缀:满堆栈,递减 栈 FA后缀:满堆栈,递增 后 DA后缀:空堆栈,递减 缀 EA后缀:空堆栈,递增
6、块拷贝寻址
块拷贝寻址是多寄存器传送指令 LDM/STM的寻址方式。
LDM/STM指令常用后缀名:
IA(increment after)
DA(decrement after)
IB(increment before)
DB(decrement before)
R0 R9 R3 R1
STMIA R0!,{R1,R3,R9} 已知R0=0x100C
;R0←[R1+4]
(2)后变址模式:
• LDR R0,[R1] ,#4
• ;R0←[R1]、R1←R1+4
(3)自动变址模式:
• LDR R0,[R1,#4]!
• ;R0←[R1+4]、R1←R1+4
5、堆栈寻址
(1)堆栈的特点 ① 一块用于保存数据的连续内存; ② 数据先进后出。
(2)常用概念
说明:与字传送相似。
说出下列程序的含义
LDR R0,[R5,R3,LSL #1]! STR R5,[SP,R3] LDRBEQ R7,START
(3)无符号半字传送指令LDRH和STRH
格式 LDRH/STRH[Cond] Rd,[Rn, ±偏移表达式] 前索引方式 LDRH/STRH[Cond] Rd,[Rn] ±偏移表达式 后索引方式
相关文档
最新文档