ARM 指令寻址方式
2012-07-15 16:03
399 查看
1.ARM指令的一般编码格式
comd 001 opcode S Rn Rd shifter_operand
opcode: 指令操作符编码。
cond : 指令执行到条件编码。
S: 决定指令到操作是否影响CPSR的值。
Rd:目标寄存器编码。
Rn: 包含第1个操作数的寄存器编码。
shifter_operand: 标识第二个操作数。
一条典型的ARM 指令语法格式: <opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>
<opcode> 是指令助记符,如ADD表示算术加指令
{<cond>} 表示指令执行到条件
{S} 表示指令操作是否影响CPSR的值
2.数据处理指令的操作数的寻址方式
1.#<immediate>
31 28 27 25 24 21 20 19 16 15 12 11 8 7 0
rotate_imm=0 时,循环进位器到值为CPSR中到C条件标志位;rotate_imm != 0时,循环进位器的进位值为操作数<shifter_operandd>的最高位bit[31].
2.<Rm>
操作数<shifter_operand> 等于寄存器值,循环器的进位值为CPSR中的C条件标志位。
3.<Rm>,LSL #<shift_imm>
指令的操作数<shifter_operand>为寄存器Rm的数值逻辑左移shitf_imm位,移位范围0-31,进行移位后空位添0.shift_imm=0时,循环器进位值为CPSR中的C条件标志位;shitf_imm != 0,循环器进位值为操作数的最高位bit[31].
4.<Rm>,LSL > <Rs>
移位位数由Rs的最低8位bits[7:0]决定,当Rs[7:0] = 0时,指令的操作数<shiter_operand>为寄存器Rm的数值,循环器的进位值为CPSR中的C 标志位;当0<Rs[7:0]<32时,指令操作数<shifter_operand>为寄存器Rm中的值逻辑左移Rs[7:0]位,循环器进位值为Rm最后被移出的位Rm[32-Rs[7:0]]; Rs[7:0] = 32,指令操作数为0,循环器进位值等于Rm[0],Rs[7:0] > 32时,指令操作数为0,循环器进位值也等于0。
5.<Rm>,LSR #<shift_imm>
指令的操作数为Rm的数值逻辑右移shift_imm位,范围为0-31. 当shift_imm = 0,移位位数32,此时,操作数为0,循环器进位值等于R[31],其他情况下,<shifter_operand>等于Rm中的数值逻辑右移shift_imm位,循环器进位值为Rm最后移出的值。
6. <Rm>,LSR <Rs>
移位数值由Rs[7:0]决定,当Rs[7:0] = 0时,<shifter_operand> = Rm,循环器进位值为CPSR中到C标志位; 0<Rs[7:0] <32时,指令操作数等于Rm的数值逻辑右移Rs[7:0]位,循环器进位值等于Rm最后移出的到位Rm[Rs[7:0] -1]; Rs[7:0] = 32,指令操作数为0,循环进位器值为Rm[31];Rs[7:0] > 32,操作数为0,循环器进位值也为0.
7.<Rm>,ASR #<shift_imm>
操作数为寄存器Rm的数值算术右移shift_imm位,shift_imm :1-31. 当shift_imm = 0,移位位数为32,此时若Rm[31] = 0,操作数的值也为0,若Rm[31] = 1,则操作数值为: 0xFFFFFFF,其他情况下,操作数为Rm中的值算术右移shift_imm 位,循环器进位值为最后移出的值。
8.<Rm> ,ASR <Rs>
移位的位数由Rs[7:0] 决定,Rs[7:0] = 0时,操作数<shifter_operand> 等于Rm中的值,当Rs[7:0] >= 32时,将进行32次算术右移操作,若Rm[31] = 0,操作数为0,循环器进位值也为0,若Rm[31] = 1,操作数的值为:0xFFFFFFFF,循环器进位值为1.其他情况,操作数为Rm的值算术右移Rs[7:0]次,循环进位器的值等于Rm[Rs[7:0]].
9. <Rm>,ROR #<shift_imm>
shift_imm: 0-31. 当shift_imm = 0, 执行 <Rm>, RRX : 操作数右移移一位,并用CPSR中的C标志位补全,CPSR中的C条件标志则用移出位代替。,其他情况,操作数<shifter_operand> 循环右移shift_imm位,循环器进位值为最后从寄存器Rm中移出的值。
10.<Rm>,ROR <Rs>
Rs[7:0] = 0,操作数的值等于寄存器Rm的值,循环进位器为CPSR中的C条件标志位;若Rs[4:0] = 0时,操作数的值等于Rm的值,循环器进位值等于Rm[31],Rs[4:0]>0,指令操作数为寄存器Rm的数值循环右移Rs[4:0]位,循环器进位值等于:Rm[Rs[4:0] -1]
11.<Rm>,RRX
指令操作数<shifter_operand> 为寄存器Rm的数值右移一位,并用CPSR中到C条件标志位代替,C条件标志位用移出的位代替。
comd 001 opcode S Rn Rd shifter_operand
opcode: 指令操作符编码。
cond : 指令执行到条件编码。
S: 决定指令到操作是否影响CPSR的值。
Rd:目标寄存器编码。
Rn: 包含第1个操作数的寄存器编码。
shifter_operand: 标识第二个操作数。
一条典型的ARM 指令语法格式: <opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>
<opcode> 是指令助记符,如ADD表示算术加指令
{<cond>} 表示指令执行到条件
{S} 表示指令操作是否影响CPSR的值
2.数据处理指令的操作数的寻址方式
1.#<immediate>
31 28 27 25 24 21 20 19 16 15 12 11 8 7 0
rotate_imm=0 时,循环进位器到值为CPSR中到C条件标志位;rotate_imm != 0时,循环进位器的进位值为操作数<shifter_operandd>的最高位bit[31].
2.<Rm>
操作数<shifter_operand> 等于寄存器值,循环器的进位值为CPSR中的C条件标志位。
3.<Rm>,LSL #<shift_imm>
指令的操作数<shifter_operand>为寄存器Rm的数值逻辑左移shitf_imm位,移位范围0-31,进行移位后空位添0.shift_imm=0时,循环器进位值为CPSR中的C条件标志位;shitf_imm != 0,循环器进位值为操作数的最高位bit[31].
4.<Rm>,LSL > <Rs>
移位位数由Rs的最低8位bits[7:0]决定,当Rs[7:0] = 0时,指令的操作数<shiter_operand>为寄存器Rm的数值,循环器的进位值为CPSR中的C 标志位;当0<Rs[7:0]<32时,指令操作数<shifter_operand>为寄存器Rm中的值逻辑左移Rs[7:0]位,循环器进位值为Rm最后被移出的位Rm[32-Rs[7:0]]; Rs[7:0] = 32,指令操作数为0,循环器进位值等于Rm[0],Rs[7:0] > 32时,指令操作数为0,循环器进位值也等于0。
5.<Rm>,LSR #<shift_imm>
指令的操作数为Rm的数值逻辑右移shift_imm位,范围为0-31. 当shift_imm = 0,移位位数32,此时,操作数为0,循环器进位值等于R[31],其他情况下,<shifter_operand>等于Rm中的数值逻辑右移shift_imm位,循环器进位值为Rm最后移出的值。
6. <Rm>,LSR <Rs>
移位数值由Rs[7:0]决定,当Rs[7:0] = 0时,<shifter_operand> = Rm,循环器进位值为CPSR中到C标志位; 0<Rs[7:0] <32时,指令操作数等于Rm的数值逻辑右移Rs[7:0]位,循环器进位值等于Rm最后移出的到位Rm[Rs[7:0] -1]; Rs[7:0] = 32,指令操作数为0,循环进位器值为Rm[31];Rs[7:0] > 32,操作数为0,循环器进位值也为0.
7.<Rm>,ASR #<shift_imm>
操作数为寄存器Rm的数值算术右移shift_imm位,shift_imm :1-31. 当shift_imm = 0,移位位数为32,此时若Rm[31] = 0,操作数的值也为0,若Rm[31] = 1,则操作数值为: 0xFFFFFFF,其他情况下,操作数为Rm中的值算术右移shift_imm 位,循环器进位值为最后移出的值。
8.<Rm> ,ASR <Rs>
移位的位数由Rs[7:0] 决定,Rs[7:0] = 0时,操作数<shifter_operand> 等于Rm中的值,当Rs[7:0] >= 32时,将进行32次算术右移操作,若Rm[31] = 0,操作数为0,循环器进位值也为0,若Rm[31] = 1,操作数的值为:0xFFFFFFFF,循环器进位值为1.其他情况,操作数为Rm的值算术右移Rs[7:0]次,循环进位器的值等于Rm[Rs[7:0]].
9. <Rm>,ROR #<shift_imm>
shift_imm: 0-31. 当shift_imm = 0, 执行 <Rm>, RRX : 操作数右移移一位,并用CPSR中的C标志位补全,CPSR中的C条件标志则用移出位代替。,其他情况,操作数<shifter_operand> 循环右移shift_imm位,循环器进位值为最后从寄存器Rm中移出的值。
10.<Rm>,ROR <Rs>
Rs[7:0] = 0,操作数的值等于寄存器Rm的值,循环进位器为CPSR中的C条件标志位;若Rs[4:0] = 0时,操作数的值等于Rm的值,循环器进位值等于Rm[31],Rs[4:0]>0,指令操作数为寄存器Rm的数值循环右移Rs[4:0]位,循环器进位值等于:Rm[Rs[4:0] -1]
11.<Rm>,RRX
指令操作数<shifter_operand> 为寄存器Rm的数值右移一位,并用CPSR中到C条件标志位代替,C条件标志位用移出的位代替。
相关文章推荐
- ARM汇编指令学习之寻址方式
- ARM指令寻址方式
- ARM指令的寻址方式
- ARM指令寻址方式之: 数据处理指令的寻址方式
- ARM汇编编程基础(二) -- 基本寻址方式与基本指令
- ARM指令寻址方式之: 内存访问指令寻址
- ARM 指令的寻址方式
- ARM指令的寻址方式
- ARM 汇编指令学习:[1]ARM指令寻址方式
- ARM (二) arm指令分类及其寻址方式
- ARM汇编编程基础之三 —— 基本寻址方式与基本指令
- ARM寻址方式及相关指令汇总
- ARM寻址方式及相关指令汇总
- ARM汇编编程基础之三 —— 基本寻址方式与基本指令
- ARM指令寻址方式
- ARM指令寻址的几种方式
- ARM处理器的三级流水线和ARM指令及寻址方式
- 2: 心法筑基--ARM汇编指令之寻址方式
- ARM汇编编程基础之三 —— 基本寻址方式与基本指令
- ARM汇编编程基础(二) -- 基本寻址方式与基本指令