第三章ARM指令集 ·条件执行 ·指令分类说明 一存储器访问指令 一数据处理指令 一分支指令 一协处理器指令 一杂项指令 -ARM伪指令
第三章 ARM指令集 • 条件执行 • 指令分类说明 – 存储器访问指令 – 数据处理指令 – 分支指令 – 协处理器指令 – 杂项指令 – ARM伪指令
ARM指令集概要 ·ARM指令的一般编码格式 ARM指令字长为固定的32位。一条典型的ARM指令编码 格式为: 31 28272524 2120 19 1615 1211 0 cond 001 opcode S Rn Rd Shifter_Operand 其中: opcode:指令操作符代码。 cond:指令执行的条件编码。 S:决定指令的操作是否影响CPSR的值。 Rd:目标寄存器编码。 Rn:包含第1个操作数的目标寄存器编码。 shift operand:表示第2个操作数
• ARM指令的一般编码格式 ARM指令字长为固定的32位。一条典型的ARM指令编码 格式为: 其中: opcode:指令操作符代码。 cond:指令执行的条件编码。 S:决定指令的操作是否影响CPSR的值。 Rd:目标寄存器编码。 Rn:包含第1个操作数的目标寄存器编码。 shift_operand:表示第2个操作数。 ARM指令集概要 cond 001 opcode S Rn Rd Shifter_Operand 31 28 27 25 24 21 20 19 16 15 12 11 0
ARM指令集概要 ·一条典型的ARM指令语法格式如下: {}{S},, 其中: 是指令助记符,如ADD,Mov等。 {}表示指令执行的条件。 S}决定指令的操作是否影响CPSR的值。 表示目标寄存器 表示包含第1个操作数的寄存器。 表示第2个操作数。 例如:ADDEQS R1,R2,#5
• 一条典型的ARM指令语法格式如下: {} {S} ,, 其中: 是指令助记符,如ADD,Mov等。 {}表示指令执行的条件。 {S}决定指令的操作是否影响CPSR的值。 表示目标寄存器 表示包含第1个操作数的寄存器。 表示第2个操作数。 例如:ADDEQS R1,R2,#5 ARM指令集概要
条件执行 ·几乎所有的ARM指令均可包含一个可选的 条件码,只有在CPSR中的条件码满足指定 的条件时,带条件码的指令才能执行。 ·几乎所有的ARM数据处理指令均可根据执 行结果来选择是否更新条件码标志。如果 要更新条件标志,需要在指令后面加“S”. 一些指令eg:CMP,CMN,TST,TEQ不需要加 “S”。它们唯一的功能就是更新条件码标 志,且始终更新条件码标志
条件执行 • 几乎所有的ARM指令均可包含一个可选的 条件码,只有在CPSR中的条件码满足指定 的条件时,带条件码的指令才能执行。 • 几乎所有的ARM数据处理指令均可根据执 行结果来选择是否更新条件码标志。如果 要更新条件标志,需要在指令后面加“S”. • 一些指令eg:CMP,CMN,TST,TEQ不需要加 “S”。它们唯一的功能就是更新条件码标 志,且始终更新条件码标志
ARM条件码 操作码[31:28] 助记符后缀 标志 含义 0000 EQ Z置位 相等 0001 NE Z清零 不等 0010 CS/HS C置位· 大于或等于(无符号>=) 0011 CC/LO· C清零 小于(无符号) 1001 LS C清零或Z置位 小于或等于(无符号= 1011 LT N和V不同 带符号 1110. LE Z置位或N和V不同 带符号<= 1111 AL 任何 总是(通常省略)
ARM条件码
ARM存储器访问指令 1.LDR和STR一字和无符号字节 LDR:加载寄存器 STR:存储寄存器 字节加载用0扩展到32位。 句法: 1.op {cond){B}{T}Rd,[Rn] ;零偏移 2.op{cond{B}Rd,[Rn,Flexoffset];前索引偏移 3.op {cond){B)Rd,label ;程序相对偏移 4.op{cond{B}{T}Rd,[Rn],Flexoffset;后索引偏移 T:即使在特权模式下,存储系统也将访问看成是处理器是在用户模式下。 Label::程序相对偏移表达式。必须是在当前指令的士4KB范围内。 !:若Rn是R15,则不能使用后缀“!
ARM存储器访问指令 1. LDR和STR——字和无符号字节 • LDR:加载寄存器 • STR:存储寄存器 • 字节加载用0扩展到32位。 • 句法: 1. op {cond} {B} {T} Rd,[Rn] ;零偏移 2. op {cond} {B} Rd,[Rn,Flexoffset] {!} ;前索引偏移 3. op {cond} {B} Rd,label ;程序相对偏移 4. op {cond} {B} {T} Rd,[Rn],Flexoffset;后索引偏移 T:即使在特权模式下,存储系统也将访问看成是处理器是在用户模式下。 Label:程序相对偏移表达式。必须是在当前指令的±4KB范围内。 !:若Rn是R15,则不能使用后缀“!
LDR和STR一字和无符号字节 ·Flexoffset句法: 前索引和后索引可以是以下2种形式之一: ·#eXpr ·{-}Rm{,shift) 其中: -:可选的负号。若带负号,则从R中减去偏移量。 expr:表达式,取值范围:-4096+4096,经常取常量。 Rm:内含偏移量的寄存器。Rm不允许为R15。 shit:Rm的可选移位方法。可以是移位寻址的6种方法之一 大多数情况下,必须保证用于32位传送的地址是32位对准 的。将指定的地址取成4的倍数。 ·通常应尽量避免从R15中存储
• Flexoffset句法: 前索引和后索引可以是以下2种形式之一: • #expr • {-} Rm {,shift} 其中: -:可选的负号。若带负号,则从Rn中减去偏移量。 expr:表达式,取值范围:-4096~+4096,经常取常量。 Rm:内含偏移量的寄存器。Rm不允许为R15。 shift:Rm的可选移位方法。可以是移位寻址的6种方法之一 • 大多数情况下,必须保证用于32位传送的地址是32位对准 的。将指定的地址取成4的倍数。 • 通常应尽量避免从R15中存储。 LDR和STR——字和无符号字节
LDR和STR一字和无符号字节 ·例子: LDR R8,[R10] >LDRNE R2,[R5,#960]! >STR R2,[R9,#consta-struc] >STRB R0,[R3,-R8,ASR#2] >STR R5,[R7],#-8 >LDR RO,localdata
• 例子: ¾ LDR R8,[R10] ¾ LDRNE R2,[R5,#960]! ¾ STR R2,[R9,#consta-struc] ¾ STRB R0,[R3,-R8,ASR #2] ¾ STR R5,[R7],#-8 ¾ LDR R0,localdata LDR和STR——字和无符号字节
2.LDR和STR一半字和带符号字节 加载寄存器、带符号的8位字节、带符号和无符号的 16位半字。存储寄存器、16位半字。 带符号的加载是指带符号扩展到32位。无符号的半字 加载是指零扩展到32位。 句法: 1.op {cond}type Rd,[Rn] 2.op {cond}type Rd,[Rn,offset]{ 3.op {cond}type Rd,label 4.op {cond)type Rd,[Rn],offset type:必须是以下所列之一: SH:对带符号半字(仅LDR) H:对无符号半字 SB:对带符号字节(仅LDR) label:程序相对偏移表达式。必须在当前指令的士255字节内。 offset:加在Rn上的偏移量
2. LDR和STR——半字和带符号字节 • 加载寄存器、带符号的8位字节、带符号和无符号的 16位半字。存储寄存器、16位半字。 • 带符号的加载是指带符号扩展到32位。无符号的半字 加载是指零扩展到32位。 • 句法: 1. op {cond} type Rd,[Rn] 2. op {cond} type Rd,[Rn,offset] {!} 3. op {cond} type Rd,label 4. op {cond} type Rd,[Rn],offset type:必须是以下所列之一: SH:对带符号半字(仅LDR) H:对无符号半字 SB:对带符号字节(仅LDR) label:程序相对偏移表达式。必须在当前指令的±255字节内。 offset:加在Rn上的偏移量
LDR和STR一半字和带符号字节 offset句法: 前索引和后索引可以是以下2种形式之一: ·#eXpr ·{-}Rm expr是表达式,其值在±255范围内的整数,经常是数字常量。 ·半字节传送的地址必须是偶数。 ·不能将半字或字节加载到R15。 ·例子: LDREQSH R11,[R6] LDRH R1,[R0,#22] STRH R4,[R0,R1]! LDRSB R6,constf LDRSB R1,[R6],R3,LSL#4;X
• offset句法: 前索引和后索引可以是以下2种形式之一: • #expr • {-} Rm expr是表达式,其值在±255范围内的整数,经常是数字常量。 • 半字节传送的地址必须是偶数。 • 不能将半字或字节加载到R15。 • 例子: LDREQSH R11,[R6] LDRH R1,[R0,#22] STRH R4,[R0,R1]! LDRSB R6,constf LDRSB R1,[R6],R3,LSL #4;× LDR和STR——半字和带符号字节