arm指令编码格式和语法格式及其寻址方式

http://blog.csdn.net/starshinning975/article/details/48580925

arm指令一般编码格式和一般语法格式

1、编码格式: 
这里写图片描述 
2、语法格式: 
这里写图片描述 
3、解释: 
3.1、<>内的项是必须的,{}内的项是可选的 
3.2、opcode:指令助记符;cond:执行条件;S:是否影响CPSR寄存器的值;Rd:目标寄存器;Rn:第1个操作数的寄存器;operand2:第2个操作数; 
3.3、大多数时候可以根据CPSR的条件标志位觉得是否该执行指令。当条件满足时才执行,否则不执行。 
3.4、arm指令的16个条件码,如下: 
这里写图片描述 
3.5、示例代码说明使用条件码以实现高效的逻辑操作:

C代码:
if(a> b)
    a++;
else
    b++;
对应的汇编代码:
CMP R0,R1        ;R0(a)与R1(b)比较
ADDHI R0,R0,#1   ;若R0>R1,则R0=R0+1
ADDLS R1,R1,#1   ;若R0≤1,则R1=R1+1
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

arm指令寻址方式

1、寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。 
2、数据处理指令的操作数寻址方式归纳如下: 
指令格式: 
这里写图片描述

2.1、立即数方式,必须遵循规则:每一个立即数由一个8位的常数循环右移偶数位得到。公式表达为:立即数 =8位常数循环右移2*4位二进制数 即immediate=const_8 ROR 2*bin_4。 
比如,0x104为合法的立即数,而0x101 不是合法的立即数。是不允许在指令中使用的。 
2.2、寄存器方式,操作数即为寄存器里的数值 
2.3、寄存器移位方式,操作数是寄存器里的数值移位而得到,有如下移位操作:ASR,LSR,LSL,ROR,RRX等。

3、字及无符号字节的load/store指令寻址方式 
3.1、load指令从内存读取数据放入寄存器,store指令用于将寄存器中的数据保存到内存。 
3.2、以LDR指令为例说明: 
LDR指令的编码格式如下: 
这里写图片描述

LDR指令的语法格式如下: 
这里写图片描述

注释:cond是指令执行的条件码,Rd是目的寄存器的编码,Rn和Address_mode一起构成了第二个操作数的内存地址。

3.3、寻址方式由基址寄存器Rn和地址偏移量address_mode两部分组成,其中地址偏移量有三种格式:立即数,寄存器,寄存器及一个移位常数。 
3.4、寻址方式的地址计算方法有三种:偏移量方法,事先更新方法(即在指令的内存访问完成后进行基址寄存器内容更新的方式),事后更新方法(在指令的内存访问完成计算新地址的方式)。 
3.5、根据寻址方式的地址计算方法和地址偏移量可知第二个操作数的内存地址共有如下9种格式: 
这里写图片描述 
以第一种格式为例说明第二个操作数的内存地址的计算方法: 
[, #+/- ]表示基址寄存器Rn值加或减偏移量,它的指令编码为: 
这里写图片描述

使用偏移量方法计算内存地址,它的伪代码表示为:

if U == 1 then
    address = Rn + offset_12
else /*U = 0*/
    address = Rn - offset_12    
 
 
  • 1
  • 2
  • 3
  • 4

4、杂类Load/Store指令的寻址方式 
4.1、指令的语法格式如下: 
这里写图片描述

4.2、指令中内存单元的寻址方式有以下6种: 
这里写图片描述

4.2、以第三种寻址方式说明内存地址的计算方法 
使用该寻址方式[, #+/-]! 的指令编码格式如下: 
这里写图片描述 
使用事先更新方法计算内存地址,它的伪代码如下:

offset_8 = (immedH << 4) OR immedL
if U == 1 then
    address = Rn + offset_8
else /*U = 0*/
    address = Rn - offset_8
if ConditionPassed(cond) then
    Rn = address
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5、批量Load/Store指令的寻址方式 
5.1、指令功能是实现在一组寄存器和一块连续的内存单元之间传输数据 
5.2、它的语法格式和指令编码格式如下: 
这里写图片描述 
这里写图片描述 
P位表示基址寄存器Rn所指的内存单元是否包含在指令使用的内存块中。 
U位表示地址变化的方向 
W位表示指令执行后,基址寄存器Rn的值是否更新 
L位表示操作的类型 
5.3、address_mode表示地址变化方式,有四种,如下所示: 
这里写图片描述

以(DA)事后递减(U=0)方式 为例说明内存地址的计算方法 
DA指令编码格式如下: 
这里写图片描述 
内存地址的算法,伪代码表示如下:

start_address = Rn-(Number_Of_Set_Bits_In(register_list)*4)+4
end_address =Rn
if ConditionPassed(cond) and W == 1 then
    Rn = Rn - (Number_Of_Set_Bits_In(register_list) * 4)
 
 
  • 1
  • 2
  • 3
  • 4

6、协处理器Load/Store指令的寻址方式 
6.1、指令的功能是在arm处理器和协处理器之间传输批量数据 
6.2、指令的语法格式和编码格式如下: 
这里写图片描述 
这里写图片描述 
对各个标志位含义的解释: 
U位表示基址寄存器Rn的更新方式 
N位一般表示传输数据的字节大小 
W位表示指令执行后,基址寄存器Rn的值是否更新 
L位表示操作的类型

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ARM指令寻址方式有12种,具体如下: 1. 立即数寻址(Immediate Addressing):将一个立即数作为操作数,例如:MOV R1, #10 将10这个立即数赋给寄存器R1。 2. 寄存器寻址(Register Addressing):直接使用寄存器作为操作数,例如:MOV R1, R2 将寄存器R2的值复制到寄存器R1中。 3. 寄存器间接寻址(Register Indirect Addressing):使用寄存器存储的地址作为操作数,例如:LDR R1, [R2] 将R2存储的地址所对应的内存单元中的数据读入R1中。 4. 寄存器相对偏移寻址(Register Offset Addressing):使用寄存器存储的地址加上一个偏移量作为操作数,例如:LDR R1, [R2, #4] 将R2存储的地址加上4所得到的地址对应的内存单元中的数据读入R1中。 5. 寄存器相对变址寻址(Register Pre-indexed Addressing):使用寄存器存储的地址加上一个偏移量作为操作数,并将计算后的地址存储回寄存器,例如:LDR R1, [R2, #4]! 将R2存储的地址加上4所得到的地址对应的内存单元中的数据读入R1中,并将计算后的地址存储回R2中。 6. 寄存器相对变址后调寻址(Register Post-indexed Addressing):使用寄存器存储的地址作为操作数,并将计算后的地址存储回寄存器,例如:LDR R1, [R2], #4 将R2存储的地址所对应的内存单元中的数据读入R1中,并将计算后的地址加上4存储回R2中。 7. 基址变址寻址(Base with Index Addressing):使用两个寄存器存储的地址相加作为操作数,例如:LDR R1, [R2, R3] 将R2存储的地址加上R3存储的地址所得到的地址对应的内存单元中的数据读入R1中。 8. 多寄存器寻址(Multiple Register Addressing):使用多个寄存器存储的地址作为操作数,例如:LDMIA R2!, {R1-R3} 将R2存储的地址所对应的内存单元中的数据读入R1-R3中,并将计算后的地址存储回R2中。 9. 堆栈寻址(Stack Addressing):使用堆栈指针寄存器存储的地址作为操作数,例如:LDR R1, [SP, #4] 将堆栈指针加上4所得到的地址对应的内存单元中的数据读入R1中。 10. 基址变址加寄存器间接寻址(Base with Index and Register Indirect Addressing):使用一个寄存器存储的地址加上另一个寄存器存储的地址所得到的地址作为操作数,例如:LDR R1, [R2, R3, LSL #2] 将R2存储的地址加上R3存储的地址左移2位后所得到的地址所对应的内存单元中的数据读入R1中。 11. 基址变址加立即数寻址(Base with Index and Immediate Addressing):使用一个寄存器存储的地址加上一个立即数所得到的地址作为操作数,例如:LDR R1, [R2, #12] 加上12所得到的地址所对应的内存单元中的数据读入R1中。 12. 基址变址加寄存器相对偏移寻址(Base with Index and Register Offset Addressing):使用一个寄存器存储的地址加上另一个寄存器和一个偏移量所得到的地址作为操作数,例如:LDR R1, [R2, R3, LSL #2]! 将R2存储的地址加上R3存储的地址左移2位后再加上一个偏移量所得到的地址所对应的内存单元中的数据读入R1中,并将计算后的地址存储回R2中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值