好东西,说得非常详细的。要做底层的可以看看

ARM指令集详解

发布: 2010-3-19 11:42 |  作者Saiu |   来源: MCU嵌入式领域  

ARM可以用两套指令集:ARM指令集和Thumb指令集。本文介绍ARM指令集。在介绍ARM指令集之前,先介绍指令的格式。



1  指令格式

        1)基本格式

        {}{S} ,{,}

        其中,<>内的项是必须的,{}内的项是可选的,如是指令助记符,是必须的,而{}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)

        opcode  指令助记符,如LDRSTR 

        cond  执行条件,如EQNE 

        S  是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响

        Rd  目标寄存器

        Rn  第一个操作数的寄存器

        operand2  第二个操作数

        指令格式举例如下:

        LDR R0,[R1] ;读取R1 地址上的存储器单元内容,执行条件AL

        BEQ DATAEVEN ;跳转指令,执行条件EQ,即相等跳转到DATAEVEN

        ADDS R1,R1,#1 ;加法指令,R11R1 影响CPSR 寄存器,带有S

        SUBNES R1,R1,#0xD;条件执行减法运算(NE)R1-0xD=>R1,影响CPSR 寄存器,带有S

        2)第2个操作数

        ARM 指令中,灵活的使用第2个操作数能提高代码效率,第2个操作数的形式如下:

        immed_8r

        常数表达式,该常数必须对应位位图,即常数是由一个位的常数循环移位偶数位得到。

        合法常量

        0x3FC00xF00000002000xF0000001等都是合法常量。

        非法常量

        0x1FE5110xFFFF0x10100xF0000010等都是非法常量。

        常数表达式应用举例如下:

        MOV R0,#1 ;R0=1

        AND R1,R2,#0x0F ;R2 0x0F,结果保存在R1

        LDR R0[R1],#-4 ;读取R1 地址上的存储器单元内容,且R1R14

        Rm

        寄存器方式,在寄存器方式下操作数即为寄存器的数值。

        寄存器方式应用举例:

        SUB R1R1R2 R1-R2=R1

        MOV PCR0 PC=R0,程序跳转到指定地址

        LDR R0[R1]-R2 ;读取R1 地址上的存储器单元内容并存入R0,且R1=R1-R2

        Rm shift

        寄存器移位方式。将寄存器的移位结果作为操作数,但RM 值保存不变,移位方法如下:

        ASR #n  算术右移位(1n32

        LSL #n  逻辑左移位(1n31

        LSR #n  逻辑左移位(1n32

        ROR #n  循环右移位(1n31

        RRX  带扩展的循环右移1

        type Rs  其中,type ASRLSL,和ROR 中的一种;Rs 偏移量寄存器,低8位有效,若其值大于或等于32,则第个操作数的结果为0ASRROR例外)。

        寄存器偏移方式应用举例:

        ADD R1R1R1LSL #3 R1=R1*9

        SUB R1R1R2LSR#2 R1=R1-R2*4

        R15 为处理器的程序计数器PC,一般不要对其进行操作,而且有些指令是不允许使用R15,如UMULL 指令。

        3)条件码

        使用指令条件码,可实现高效的逻辑操作,提高代码效率。表A-1给出条件码表。