arm 指令格式

 指令基本格式:
  •      <opcode>{<cond>}{S} <Rd>,<Rn>{,<operand2>}

    1、<>内的项是必须的,{}内的项是可选的,cond若不附指令后使用默认条件AL(无条件执行)。

    2、opcode:指令助记符,如LDR,STR等;

    3、cond:执行条件,如EQ,NE等;

    4、S:是否影响CPSR寄存器的值;

    5、Rd:目标寄存器;

    6、Rn:第一个操作数的寄存器;

    7、operand2:第二个操作数;ARM指令中,灵活使用第二个操作数可提高代码效率,第二个操作数的形式有:

         #immed_8r   ——常数表达式;

         Rm                ——寄存器方式;

         Rmshift     ——寄存器移位方式;

    其指令编码格式如下:

    31-28

    27-25

    24-21

    20  

    19-16

    15-12

    11-0 12位)

    cond

    001

    opcode

    S

    Rn

    Rd

    shifter_operand

     

    #immed_8r:

        该常数必须对应8位位图(即首尾两个"1"bit间的间距为6bits且该常数通过循环左移偶数位所有bit=1的位必集中在低8bits)。如 0x1FE、511、0xFFFF、0x1010、0xF0000010为非法常量,0x3FC、0、0xF0000000、200、 0xF0000001为合法常量。

    利用这种转换巧妙的实现了:在32bits的ARM指令代码中集成32bits的立即数(常数)。如立即寻址的 数据处理指令的指令代码为:xxxx001a aaaSnnnn ddddrrrr bbbbbbbb,则其第二个操作数op2=#b,ROR #2r,由op2到指令码的转换经编译器完成。

     

    对其中的operand2的常数表达式有这样的规定:该常数必须对应8位位图,即常熟是由一个8位的常熟循环右移偶数位得到的。这句话的意思是说,当用12位第二操作数来表示一个32位立即数时,采用的是将8位数通过移位的方式来实现的,其中12位第二操作数的低八位存放被移位的基本数(取值范围为0255),而高四位存放的是循环右移的位数,因为位四位二进制数,所以取值范围位为015,而对应的移位位数则为030位,也就是说若移位数为0,则表示基本数不变,若移位数位1,则表示将基本数在32位数字空间中循环右移2位,若移位数位5,则表示将基本数在32位数字空间中循环右移10位,若移位数位10,则表示将基本数在32位数字空间中循环右移20位,依次类推。举例表示:

         AND R1,R2,#0xff

         当处理器处理这条指令的第二操作数0xff时,因为0xff为8位二进制数,所以处理器就将其直接放进8位“基本”数中,而4位“移位”数则为0.

         AND R1,R2,#0x104

         当处理器处理这条指令的第二操作数0x104时,因为此时0x104已经超过了8位二进制数,所以处理器就要将其“改造”一下,我们先把0x104转换成二进制0000 0000 0000 0000 0000 0001 0000 0100,我们可以看到,这个数是0000 0000 0000 0000 0000 0000 0100 0001通过循环右移30位得到的,因此改造后的结果是8位“基本”数中存放0100 0001,而“移位”数为15。

         AND R1,R2,#0xff000000

         当处理器处理这条指令的第二操作数0xff000000时,处理器同样要对其“改造”,我们先把0xff000000转换成二进制1111 1111 0000 0000 0000 0000 0000 0000,我们可以看到,这个数是0000 0000 0000 0000 0000 0000 1111 1111通过循环右移8位得到的,因此改造后的结果是8位“基本”数中存放1111 1111,而“移位”数为4。

          我想,通过以上的三个例子,就应该明白了8位位图的原理了。但是,有些数并不符合8位位图的原理,这样的数在进行程序编译时,系统将会提示出错,下面再举几个违反8位位图的例子:比如0x101,转换成二进制后位0000 0000 0000 0000 0000 0001 0000 0001,像这个数,无论向右循环几位,都无法将两个1同时放到低8位中,因此不符合8位位图;再比如0x102,转换成二进制后位0000 0000 0000 0000 0000 0001 0000 0010,如果将两个1同时放到低8位中,即转换成二进制后为0000 0000 0000 0000 0000 0000 1000 0001,需要将此二进制数向右移31位,这也不符合循环右移偶数位的条件,因此0x012也不符合8位位图;再举一个0xff1,转换成二进制后将会有9个1,不可能将其同时放入8位中,因此当然也不符合啦。

          通过正反例的比较,可以总结如下:第一,判断一个数是否符合8位位图的原则,首先看这个数转换成二进制后1的个数是否不超过8个,如果不超过8个,再看这n个1(n<=8)是否能同时放到8个二进制位中,如果可以放进去,再看这八个二进制位是否可以循环右移偶数位得到起初被判断的那个数值,如果可以,则此数值即为符合8位位图原理,否则,不符合。第二,用12位的编码来表示一个任意的32位数是不可能的,只能通过循环右移八位二进制数偶数位来得到一部分32位数,其余的无法表示的32位数,只有通过其它途径获得了,比如0xffffff00,可以通过0x000000ff按位取反得到,因此在以后的编程中,一定要注意用到的第二操作数是否符合8位位图。

     

     

    Rm:

        在寄存器方式下,第二个操作数即寄存器的数值;

    Rm,shift:

        在寄存器移位操作方式下,将寄存器的移位结果作为操作数,但Rm的值保持不变,移位方法有下:

        其中n取值一般在1--31之间。

    8、The ARM instruction set:

    9、指令条件码:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
x86和ARM指令集是两种常见的计算机体系结构的指令集架构。它们都用于指导计算机硬件执行特定的任务和操作。以下是关于x86和ARM指令集的一些简要信息: x86指令集:x86是一种基于CISC(复杂指令集计算)体系结构的指令集。该指令集最初由英特尔开发,并成为主要的个人计算机和服务器体系结构。x86指令集包含丰富的指令,可执行多种操作,包括算术运算、逻辑运算、数据传输和控制流等。它是一种复杂的指令集,并且具有较高的执行能力和灵活性。凭借广泛的软件支持和计算能力,x86成为桌面和服务器领域最流行的体系结构之一。 ARM指令集:ARM是一种基于RISC(精简指令集计算)体系结构的指令集。它最初由英国公司ARM Holdings开发,并成为移动设备(如智能手机和平板电脑)和嵌入式系统的主要体系结构。ARM指令集设计简洁,指令数量较少,每条指令一般只执行一个简单的操作。与x86相比,ARM指令集执行效率更高,并具有更低的功耗和较小的芯片面积。因此,它成为便携式设备和嵌入式系统中的首选体系结构。 x86和ARM的比较:x86指令集适用于大型多任务处理、复杂的图形操作和计算密集型任务。它具有广泛的软件生态系统和令人称赞的性能。然而,由于复杂指令集的特性,x86架构的芯片更复杂、功耗较高,并且相对较贵。 相比之下,ARM指令集在低功耗设备方面表现出色。ARM芯片的功耗较低,性能较高,并且在移动设备和嵌入式系统中能够提供高度集成的解决方案。此外,由于ARM芯片广泛采用,其生态系统和软件支持也非常庞大。 总结而言,x86和ARM指令集都有各自的优势和适用场景。x86适用于高性能和复杂任务的计算机系统,而ARM则适用于低功耗和便携设备的应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值