第3章 ARM9汇编指令系统
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章
例如
例如: LDR R8,[R10] ;R8←[R10] LDRNE R2,[R5,#960]! ;( 有 条 件 地 ) R2←[R5+960],R5←R5+960 LDR R0,localdata ;加载一个字到R0寄存 器,该字存 于localdata所指地址处 STR R5,[R7],#-8! ;R5→[R7],R7←R7-8 STRB R0,[R3,-R8 ASR #2] ;R0→[R3-R8/4], 存储R0的最低有效字节,R3和R8不变
其中:type 必须是下面所列的形式之一: SH 带符号半字(仅对LDR); H 无符号半字; SB 带符号字节(仅对LDR)。 label 程序相对偏移表达式。偏移量必须是在 当前指令的上下255字节范围内。 offset 加在Rn上的偏移量。其形式是下列两种 之一: ① #expr 是取值范围为-255~+255的整数, 经常是常量或常量表达式。 ② {-} Rm Rm是内含偏移量的寄存器,它不 能是R15。
第三章
存储器访问指令(续)
(3)LDR和STR ----双字:加载/存储两个相邻 的寄存器,64位双字。其句法有4种:
Op {cond} D Rd,[Rn] 零偏移 Op {cond} D Rd,[Rn,offset] {!} 前索引偏移 Op {cond} D Rd,label 程序相对偏移 Op {cond} D {T} Rd,[Rn],offset 后索引偏移
第三章
存储器访问指令(续)
(1) SWP:在寄存器和存储器之间 进行数据交换,其句法是: SWP {cond} {B} Rd,Rm,[Rn] 其中:B是可选后缀,若有B,则交换字 节,否则交换字。该指令作用是数据从 存储器加裁到Rd中,Rm中的内容存储 到存储器,需交换数据存储单元的首地 址在Rn中。在此,Rd和Rm可以相同, 但Rn必须与Rd、Rm不同。
Op {cond} type Rd,[Rn] 零偏移 op {cond} type Rd,[Rn,offset]{!}前索引偏移 Op {cond} type Rd,label 程序相对偏移 Op {cond} type Rd,[Rn],offset 后索引偏移
第三章
存储器访问指令(续)
第三章
§3.1 存储器访问指令
(1) LDR和STR ----字和无符号字节:32位字或8位无 符号字节加载寄存器(LDR)和存储寄存器(STR)指 令。字节写时是用“0”扩展到32位。 LDR和STR指令都有以下4种句法形式: op {cond} {B} {T} Rd,[Rn] 零偏移 op {cond} {B} Rd,[Rn,Flexoffset] {!} 前索引偏移 op {cond} {B} Rd,label 程序相对偏移 op {cond} {B} {T} Rd,[Rn],Flexoffset 后索引偏移
若有t则即使处理器是在特操作码3128000000010010001101000101011001111000100110101011110011011110助记符后缀标志含义eqnecshscclomiplvsvchilsgeltgtlealz置位z清零c置位c清零n置位n清零v置位v清零c置位且z清零c清零且z置位n和v相同n和v不同z清零且n和v相同z置位或n和v不同任何相等不等大于或等于无符号数小于无符号数负正或零溢出未溢出大于无符号数小于或等于无符号数带符号大于或等于带符号小于带符号大于带符号小于或等于总是通常省略续rn意义相同
第三章
(续)
其中:S 可选的后缀。若指定S,则根据 操作结果更新条件码标志。 Operand2 第二个操作数。后面所用时 意义相同。它有以下两种可能的形式: Rm{,shift} 符号的含义与前面一致。 # immed_8r 取值为数字常量的表达式。 常量必须对应8位位图(pattern)在32 位字中被循环移位偶数位后的值。
第三章
存储器访问指令(续)
Flexoffset 加到Rn上的灵活偏移量。该偏移量 可以是下面两种形式之一: ① #expr 是取值范围为-4095~+4095的整数, 经常是常量或常量表达式。 ② {-} Rm {,shift} Rm是内含偏移量的寄存器, 它不能是R15。shift是Rm的可选移位方法,可 以是下列形式中的一种。 ASR n 算术右移n位(1≤n≤32); LSL n 逻辑左移n位(0≤n≤31); LSR n 逻辑右移n位(1≤n≤32); ROR n 循环右移n位(1≤n≤31); RRX 循环右移1位,带扩展。
第三章
(续)
例如: ADD R3,R7,#1020 ;immed_8r为 1020,是0xFF循环右移30位 SUBS R8,R6,#240 ;R8←R6-240, 运算完成后将根据结果更新标志 RSB R4,R4,#1280 ;R4←1280R4 RSCLES R0,R5,R0,LSL R4 ;有条 件执行,执行完后更新标志
第三章
存储器访问指令(续)
(2) LDR和STR ----半字和带符号字节:带 符号的8位字节以及带符号和无符号的16位 半字加载寄存器(LDR),对于存储寄存器 (STR)指令是针对于16位半字的。对于带 符号加载时是带符号扩展到32位,无符号 加载时是用“0” 扩展到32位。 该组LDR和STR指令也都有以下4种句法形式:
第三章
数据处理指令2
(2)AND,ORR,EOR和BIC指令 逻辑与、或、异或等指令。其句法是: op {cond} {S} Rd,Rn,Operand2 其中所用到的符号意义与上述的相同。 AND,ORR和EOR指令分别完成按位将 Rn和Operand2的值进行“与”、“或” 和“异或”操作,结果存于Rd中。BIC 指令用于将Rn中的各位与Operand2的 相应位的反码进行“与”操作,结果存 于Rd中。
第三章
第三章 ARM9汇编指令系统
32位ARM指令集由13种基本指令类型组成,分成4大类。 · 3种类型的存储器访问指令,用于控制存储器和寄存器 之间的数据传送。第一种类型用于优化的灵活寻址;第 二种类型用于快速上下文切换;第三种类型用于交换数 据。 · 3种类型的数据处理指令,使用片内的累加器(ALU)、 桶形移位器和乘法器,对31个寄存器完成高速数据处理 操作。 · 4种类型的分枝指令,用于控制程序执行流程、指令优 先级、ARM代码和Thumb代码的切换。 · 3种类型的协处理器指令,专用于控制外部协处理器。 这些指令以开放和统一的方式扩展了指令集的片外功能。
第三章
存储器访问指令(续)
reglist 所须加载/存储的寄存器列表,包含在括号中。 多个寄存器间用逗号分开。 ^ 可选后缀。不允许在用户模式或系统模式下使 用。它有以下两个功能: ① 若op是LDM且reglish中包含R15,那么除了正常的 多寄存器传送外,还将SPSR也拷贝到CPSR中。这用 于从异常处理返回,仅在异常模式下使用。 ② 数据传入或传出的是用户模式的寄存器,而不是 当前模式的寄存器。 例如: STMFD R13!,{R0,R4-R7,LR} ;寄存器进栈 LDMFD R13!,{R0,R4-R7,LR} ;寄存器出栈, 从子程序返回
第三章
存储器访问指令(续)
上述句法形式中所用到的符号意义如下: op 操作码,后面所用时意义相同。在此代 表LDR和STR。 cond 可选条件码,条件码必须是表3-1中所列 的一种。后面所用时意义相同 B 可选后缀。若有B,则传送Rd的最低有效 字节,若op是LDR,则Rd的其他字节清零。 T 可选后缀。若有T,则即使处理器是在特 权模式下,存储系统也将访问看成处理器是 在用户模式下。T在用户模式下无效,不能与 前索引偏移一起使用。
第三章
(续)
ADC指令用于将Rn和Operand2的值相 加,再加上进位标志C的值; SBC指令用于从Rn的值中减去Operand2 的值,若进位标志C为0,结果再减1; RSC指令用于从Operand2的值中减去Rn 的值,若进位标志C为0,结果再减1。 以上指令执行的结果均存于Rd中。
第三章
存储器访问指令(续)
其中: Rd 加载/存储寄存器中的一个,另一个是 R(d+1)。Rd必须是偶数寄存器,且不是R14。 Rn 除非指令为零偏移,或不带写回的前索引,否则, Rn不允许与Rd和R(d+1)相同。 label label必须是在当前指令的上下252字节范围内。
例如: LDRD R6,[R11] ;R6←[R11],R7←[R11+4] STRD R4,[R9,#24] ;R4→[R9+24], R5→[R9+28]
第三章
§3.2 数据处理指令1
(1)ADD,SUB,RSB,ADC,SBC和RSC指令 加、减和反减指令,前三个不带进位或借位, 后三个带进位或借位。其句法是: op {cond} {S} Rd,Rn,Operand2 ADD指令用于将Rn和Operand2的值相加; SUB指令用于从Rn的值中减去Operand2的值; RSB指令用于从Operand2的值中减去Rn的值;
第三章
存储器访问指令(续)
label 程序相对偏移表达式。偏移量必须是在 当前指令的上下4KB范围内。 ! 可选后缀。若有“!”,则将包含偏移量 的地址写回到Rn,若Rn是R15,则不能使用 该后缀。后面所用时意义相同。 {} 表示括号内的内容是可选的。后面所用时 意义相同。 在上述指令中,若Rd为R15时,加载操作将会 引起处理器转移到所写内容为地址的单元处, 即使要进行加载操作,也不能使用后缀“B” 或“T”。通常应避免对R15进行存储操作,若 进行,则存储的值是当前指令的地址加一特 定的常量。
操作码[31:28]
0000 0001 0010
助记符后缀
EQ NE CS/HS
标志
Z置位 Z清零 C置位
含义
相等 不等
0011 0100 0101 0110 0111 1000 1001 1010 1011 1100
1101
CC/LO MI PL VS VC HI LS GE LT GT
LE
C清零 N置位 N清零 V置位 V清零 C置位且Z清零 C清零且Z置位 N和V相同 N和V不同 Z清零且N和V相同
第三章
存储器访问指令(续)
(4)LDM和STM:加载/存储多个寄存器,可以传送 R0~R15的任意组合。其句法如下: op {cond} mode Rn{!},reglist{^} 其中:mode是下列情况之一: IA 每次传送后地址加1; IB 每次传送前地址加1; DA 每次传送后地址减1; DB 每次传送前地址减1; FD 满递减堆栈; ED 空递减堆栈; FA 满递增堆栈; EA 空递增堆栈。 Rn不允许是R15。
Z置位或N和V不同
大于或等于(无符号 数) 小于(无符号数) 负 正或零 溢出 未溢出 大于(无符号数)
小于或等于(无符号 数) 带符号大于或等于 带符号小于 带符号大于 带符号小于或等于
1110
AL
任何
总是(通常省略)
第三章
存储器访问指令(续)
Rn 存储器的基址寄存器。后面所用时 意义相同 。若指令是带写回的前索引 (后缀符号为“!”)或后索引,或使 用了后缀T,则不允许Rn和Rd相同。 Rd 用于加载/存储操作的ARM寄存器。 后面所用时意义相同。
第三章
例如
例如: LDRH R1,[R0,#22] ;R1←[R0+22],加载16位 半字,0扩展到32位 LDREQSH R11,[R6] ;(有条件地)R11←[R6], 加载16位半字,带符号扩展到32位 STRH R4,[R0,R1]! ;R4→[R0+R1],存储最 低的有效半字到R0+R1所指的地址开始的两个字节处, 地址写回R0 LDRSB R6,constf ;加载位于标号constf所指 地址中的字节到R6中,带符号扩展
第三章
(续)
在使用这些指令时,应注意: · 若在这些指令后面加上后缀S,那么这些指令 将根据其运算结果更新标志N,Z,C和V。 · 若R15作为Rn使用,则使用的值是当前指令 的地址加8。 · 若R15作为Rd使用,则执行完指令后,程序 将转移到结果对应的地址处。若此时指令还 加有后缀S,则还会将当前模式的SPSR拷贝到 CPSR。可以使用这一点从异常返回。 · 在有寄存器控制移位的任何数据处理指令中, 不能将R15作为Rd或任何操作数来使用。