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

本文详细介绍了ARM指令集的编码格式和语法格式,包括条件码、寻址方式等内容,并通过实例展示了如何利用ARM指令实现高效的逻辑操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/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位表示操作的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值