nullARM及Thumb指令集ARM及Thumb指令集课程安排课程安排ARM指令集
Thumb指令集
v5TE体系结构扩展
ARM指令编码格式ARM指令编码格式
说明
Cond
指令执行的条件编码
Opcode
指令操作符编码
S
决定指令的操作是否影响CPSR的值
Rd
操作目标寄存器编码
Rn
包含第一操作数的寄存器编码
Shifter_operand
表示第二操作数 31 28 27 25 24 21 20 19 16 15 12 11 8 7 0条件执行及标志位条件执行及标志位ARM指令可以通过添加适当的条件码后缀来达到条件执行的目的。
这样可以提高代码密度,减少分支跳转指令数目,提高性能。
CMP r3,#0 CMP r3,#0 BEQ skip ADDNE r0,r1,r2 ADD r0,r1,r2 skip
默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。 CMP不需要增加 “S”就可改变相应的标志位。
loop … SUBS r1,r1,#1 BNE loop
Condition Codes Condition Codes
下表为所有可能的条件码:
注意:AL为默认状态,不需要单独指出条件执行示例条件执行示例一系列的指令都使用条件指令
if (a==0) func(1);
CMP r0,#0 MOVEQ r0,#1 BLEQ func
置标志位,再使用不同的条件码
if (a==0) x=0; if (a>0) x=1;
CMP r0,#0 MOVEQ r1,#0 MOVGT r1,#1
使用条件比较指令
if (a==4 || a==10) x=0;
CMP r0,#4 CMPNE r0,#10 MOVEQ r1,#0分支指令分支指令Branch : B{
} label
Branch with Link : BL{} subroutine_label
处理器把偏移量左移两位,进行符号扩展后再与PC相加
跳转范围:± 32 Mbyte
如何执行长跳转?2831240 Cond 1 0 1 L 偏移量 条件码区域Link bit 0 = Branch
1 = Branch with link232527数据处理指令数据处理指令包括:
算术指令: ADD ADC SUB SBC RSB RSC
逻辑指令: AND ORR EOR BIC
比较指令: CMP CMN TST TEQ
数据搬移: MOV MVN
上述指令只能对寄存器操作,不能针对存储器。
语法:
<操作>{}{S} Rd, Rn, Operand2
只有比较指令影响标志位 -不指定Rd
数据搬移不指定Rn
第二个操作数通过桶型移位器送到ALU中。桶型移位器桶型移位器DestinationCF0DestinationCFLSL : Logical Left ShiftASR: Arithmetic Right Shift(无符号数)乘2除2,并保留符号位DestinationCF...0DestinationCFLSR : Logical Shift RightROR: Rotate Right(无符号数)除2位循环 DestinationRRX: Rotate Right Extended位轮换,从 CF到MSB都参与操作CF桶型移位器:
第二个操作数桶型移位器:
第二个操作数 寄存器, 可选择是否增加移位操作.
移位值可以是:
5 bit 无符号整数
放在另一个寄存器的低字节
用于常数乘法
立即数
8 bit ,大小范围0-255。
右移偶数位
允许直接加载32-bit 常数到寄存器中。
结果立即数 (1)立即数 (1)没有任何一条ARM 指令可包括一个32 bit的立即数
所有的ARM指令都是32 bits固定长度
数据处理指令格式中,第二个操作数有12位
4 bit 移位值 (0-15)乘于2,得到一个范围在0-30,步长为 2的移位值。
记住一条准则: “最后8位一定要移动偶数位”.07118immed_8Shifter RORrotx2Quick Quiz: 0xe3a004ff MOV r0, #???立即数 (2)立即数 (2)Examples:
下列命令中,汇编器把立即数转换为移位操作:
MOV r0,#4096 ; uses 0x40 ror 26
ADD r1,r2,#0xFF0000 ; uses 0xFF ror 16
也可使用 MVN来进行位反转:
MOV r0, #0xFFFFFFFF ; assembles to MVN r0,#0
使用无法用上述
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
生成的数据,将产生错误 。031ror #0 range 0-0xff000000 step 0x01000000 ror #8 range 0-0x000000ff step 0x00000001 range 0-0x000003fc step 0x00000004 ror #30 000000000000000000000000000000000000000000000000000000000000000000000000装载32 bit常数装载32 bit常数为允许装载大常数,汇编器提供了一条伪指令:
LDR rd, =const
它可能汇编成下列指令:
MOV or MVN。
或
LDR 指令,从数据池(Literal pools)读取常数。
For example
LDR r0,=0xFF => MOV r0,#0xFF
LDR r0,=0x55555555 => LDR r0,[PC,#Imm12] … … DCD 0x55555555
推荐使用这种方法把常数装入寄存器 。Quiz #1Quiz #11. 写一条 ARM 指令,分别完成下列操作:
a) r0 = 16
b) r0 = r1 / 16 (带符号的数字)
c) r1 = r2 * 3
d) r0 = -r0
2. 下面哪些立即数是数据处理指令中有效的数据?
a) 0x00AB0000 b) 0x0000FFFF c) 0xF000000F
d) 0x08000012 e) 0x00001f80 f) 0xFFFFFFFF
3. BIC指令做什么用?
4. 为什么ARM 处理器增加了一条RSB 指令?Quiz #2 - GCDQuiz #2 - GCD新建一个 ‘ARM Executable Image’ 项目
新建一个 text文件
另存为 “gcd.s”
加入到项目中
Build 并执行StartStopr0 = r1 ?r0 > r1 ?r0 = r0 - r1r1 = r1 - r0Yes No Yes No 你只需要使用CMP、SUB和B指令。
充分使用条件执行!
大家可以尝试计算 2109 和 4161 的GCD AREA myarea, CODE
ENTRY
MOV r0, #9
MOV r1, #15
start
; your code here
stop
B stop
END乘法乘法语法:
MUL{}{S} Rd, Rm, Rs Rd = Rm * Rs
MLA{}{S} Rd,Rm,Rs,Rn Rd = (Rm * Rs) + Rn
[U|S]MULL{}{S} RdLo, RdHi, Rm, Rs RdHi,RdLo := Rm*Rs
[U|S]MLAL{}{S} RdLo, RdHi, Rm, Rs RdHi,RdLo := (Rm*Rs)+RdHi,RdLo
占用的周期数
基本 MUL 指令
ARM7TDMI 上为2-5 周期
StrongARM/XScale上为1-3 周期
ARM9E/ARM102xE上为2 周期
ARM9TDMI 比 ARM7TDMI多1 周期
累加再多1 周期 (不针对9E,尽管结果延迟多于1周期)
对于“long”型数据,多1 周期
以上均为一般规则,确切细节查看相应手册。单寄存器数据传送单寄存器数据传送 LDR STR Word
LDRB STRB Byte
LDRH STRH Halfword
LDRSB 带符号的byte load
LDRSH 带符号的halfword load
存储器系统必须支持所有访问宽度
语法:
LDR{}{} Rd,
STR{}{} Rd,
e.g. LDREQB 地址访问 地址访问LDR/STR访问的地址由基址寄存器加上偏移量来产生。
针对word和无符号byte 的访问, 偏移量可以是:
一个无符号12-bit立即数 (如 0 - 4095 bytes). LDR r0,[r1,#8]
一个寄存器,或再加上移位(由立即数指定) LDR r0,[r1,r2] LDR r0,[r1,r2,LSL#2]
可以是从基址寄存器上加或减去偏移量: LDR r0,[r1,#-8] LDR r0,[r1,-r2] LDR r0,[r1,-r2,LSL#2]
对于halfword和带符号的halfword / byte, 偏移量可以是:
一个无符号8 bit 立即数 (如 0-255 bytes).
一个寄存器 (不能偏移)。
可选择采用pre-indexed或post-indexed方式寻址Pre or Post Indexed 寻址?Pre or Post Indexed 寻址? Pre-indexed: STR r0,[r1,#12]0x50x5r10x200基址 寄存器0x200r00x5源寄存器 for STR偏移量120x20cr10x200原基址 寄存器0x200r00x5源寄存器 for STR偏移量120x20cr10x20c更新 基址寄存器通过 STR r0,[r1,#12]!来自动更新基址寄存器 Post-indexed: STR r0,[r1],#12Quiz #3 - Total of arrayQuiz #3 - Total of array编写一个ARM汇编程序,累加一个队列中的所有元素,碰上0时停止。结果放入 r4。
在源文件末尾按如下方式声明队列:
myarray DCD 0x11 DCD 0x22 DCD 0
用r0指向队列的入口
ADR r0,myarray
使用LDR r1,[r0],#4从队列中装载数据
累加并放入r4
循环,直到r1为0
停止,进入死循环0x2200x11r0地址增加块数据传送块数据传送LDM / STM指令允许一次传送1到16个寄存器到/从存储器中。
寄存器传送顺序不能被指定
最小数字的寄存器总是被传送到/从存储器的最低地址上。
LDMIA r10,{r0,r1,r4}
基址寄存器指定存储器访问开始的地址
快传送指令针对下列情况很有效:
从存储器中搬运一块数据
保存或恢复堆栈中的
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
如果是慢速存储器,会影响中断响应时间r1r4r0r10地址增加LDM / STM 操作LDM / STM 操作语法:
{} Rb{!}, <寄存器 list>
4 中寻址操作:
LDMIA / STMIA Increment After(先操作,后增加)
LDMIB / STMIB Increment Before(先增加,后操作)
LDMDA / STMDA Decrement After (先操作,后递减)
LDMDB / STMDB Decrement Before (先递减,后操作)IAr1地址
增加r4r0r1r4r0r1r4r0r1r4r0r10IBDADBLDMxx r10, {r0,r1,r4}
STMxx r10, {r0,r1,r4}基址寄存器 (Rb)存储器块拷贝存储器块拷贝可选项“ ! ”将导致LDM / STM 指令去自动更新基址寄存器
后缀为IA, IB时,加上4 乘以 用于传送的寄存器的数目的值
后缀为DA, DB时,减去4乘以用于传送的寄存器的数目的值
示例:
; r12指向源数据起始地址
; r14指向源数据尾地址
; r13指向目的数据起始地址
loop LDMIA r12!, {r0-r11} ; 装载48 bytes
STMIA r13!, {r0-r11} ;和存储them
CMP r12, r14 ; check for the end
BNE loop ;和loop until done
此循环传送 48 bytes占用了31周期
时钟为33 MHz时传输速率超过50 Mbytes/sec存储器增加r13r14r12堆栈堆栈ARM堆栈操作通过块传送指令来完成:
STMFD (Push) 块存储- Full Descending stack [STMDB]
LDMFD (Pop) 块装载- Full Descending stack [LDMIA]100FF1234A0BE8034STMFD sp!,{r4-r7,lr}SWPSWP在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。
语法:
SWP{}{B} Rd, Rm, [Rn]
可用作信号量
不能由armcc编译产生,必须使用汇编器。RmRdtemp存储器Rn软件中断 (SWI)软件中断 (SWI)产生一个异常陷阱,跳转到SWI 硬件向量。
SWI 处理程序可以检测SWI号,从而决定采取何种操作。
通过SWI机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。
语法:
SWI{} 283124270 Cond 1 1 1 1SWI number (ignored by processor)23条件域PSR 传送指令PSR 传送指令MRS和MSR允许传送CPSR / SPSR中的内容到/从一个通用寄存器中。
语法:
MRS{} Rd, ; Rd =
MSR{} ,Rm ; = Rm
在这里:
= CPSR or SPSR
[_fields] = ‘fsxc’的任意组合
也允许送一个立即数到 psr_fields
MSR{} ,#Immediate
用户模式下,所有位均可以被读取,但只有条件标志位 (_f)可被写。协处理器指令协处理器指令ARM体系支持16个协处理器
针对每个协处理器的指令占用 ARM指令集中的固定部分
如果相应的协处理器不存在, 将发生一个未定义指令异常。
这有三种协处理器指令
协处理器数据处理指令
CDP:初始化协处理器数据处理操作
协处理器寄存器传送指令
MRC: 从 ARM 寄存器移到协处理器寄存器
MCR:从协处理器寄存器移到ARM 寄存器
协处理器存储器传送指令
LDC:从存储器装载到协处理器寄存器
STC:从协处理器寄存器存储到存储器Quiz #4Quiz #41. 写几条ARM 指令,使能IRQ中断
2. 下列 ARM 指令将做什么?
a) LDRH r0,[r1,#6]
b) LDR r0, =0x999
3.在装载或存储指令中, “!”表示什么?
4. 当 执行SWI 指令时,会发生什么?
5. SWP 指令的优势是什么?AgendaAgenda ARM 指令集
Thumb 指令集
v5TE体系结构扩展
ThumbThumbThumb 是16-bit 指令集
代码密度优化 (总代码大小约为ARM指令的65%)
使用窄总线存储器时可以大大提高性能。
是 ARM 指令集的一个子集。
核存在一个执行状态 – Thumb状态
ARM和Thumb之间切换使用BX 指令015310ADDS r2,r2,#1ADD r2,#132-bit ARM 指令16-bit Thumb 指令对于由编译器产生的大部分指令:
没有条件执行
源、目的寄存器必须相同
仅能使用低寄存器
常数大小有限制
不能使用在线移位器ARM / Thumb InterworkingARM / Thumb Interworking使用Branch Exchange 指令来完成 Interworking
BX Rn ; Thumb 状态下的Bx指令
BX Rn ; ARM状态下的Bx指令
也可以只是执行一个绝对跳转,无须状态更换。RnBX跳转的地址31013101ARM / Thumb 选择
0 - ARM 状态
1 - Thumb 状态0写 Thumb汇编程序写 Thumb汇编程序Thumb不是一个“好” 指令集!
最好用编译器来产生
约束并不一致
手动编码使用ARM指令集比较好
更多细节,参看:
ARM “Architecture Reference Manual”
Chapters A6和A7
AgendaAgenda ARM 指令集
Thumb 指令集
v5TE体系结构扩展
v5TE结构v5TE结构v5TE体系包括全部的 v4T ARM和Thumb 指令集,还有:
增强的interworking
同时支持ARM / Thumb状态
Breakpoint 指令 (ARM和Thumb)
CLZ(Count Leading Zeros)指令
扩展协处理器指令 - MCR2等等
支持饱和处理
封装的带符号的半字乘法指令
双字装载/ 存储指令
Cache预装载指令
双字协处理器 传送指令 - MCRR/MRRC你采用的处理器是哪种结构?你采用的处理器是哪种结构?处理器核 结构体系
7TDMI & 9TDMI v4T
9E-S rev1 v5TE
926EJ-S/1026EJ-S v5TEJ
1020E v5TE
StrongARM v4
XScale Microarchitecture v5TECount Leading ZerosCount Leading ZerosCLZ{cond} Rd, Rm
计算寄存器中的前导0(第一个1以前的0)
源寄存器从最高位开始计算。
1个周期完成
(ARM9E-S/ARM102x)
如果没有任何一位被置位,结果是32;如果 bit 31被置位,结果为0。
Rm 左移 Rd位即可
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
化Rm
带符号的标准化需要额外的 1个周期0000 0010 1110 1101...0R0 =CLZ R1, R00x6R1 =1011 1011 0100 0000...0Rm =MOV R0, R0 LSL R1EOR R1, R0, R0, LSL#1
CLZ R1, R1
MOV R0, R0, LSL R1扩展协处理器指令扩展协处理器指令CDP2, LDC2, STC2, MCR2, MRC2
新格式的标准协处理器指令为协处理器
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
人员提供了附加的操作码空间。
同样是无条件执行的参考
材料
关于××同志的政审材料调查表环保先进个人材料国家普通话测试材料农民专业合作社注销四查四问剖析材料
参考材料ARM “Architecture Reference Manual” - 2nd edition edited by David Seal
ARM DDI 0100E is latest, covering v5TE DSP extensions
ISBN 0-201-737191 (Addison-Wesley)
PDF on ADS和‘Technical Documentation’ CDs
Steve Furber “ARM 系统-on-chip architecture” - 2nd edition
ISBN 0-201-67519-6 (Addison-Wesley)
Quick Reference Card
ARM QRC 0001E comes with ADS 1.2
ADS 1.2 Assembler Guide
refers to ADS Examples directorynull