ARM汇编指令

发布时间:2024-07-26  

ARM汇编指令集

一、 跳转指令    跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:

Ⅰ.使用专门的跳转指令。

Ⅱ.直接向程序计数器PC写入跳转地址值。

通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用

MOV LR,PC

等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。

    ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:

1、  B指令

B指令的格式为:

B{条件}  目标地址

B指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB的地址空间)。以下指令:

B       Label         ;程序无条件跳转到标号Label处执行

     CMP R1,#0             ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行

BEQ Label      

2、  BL指令

BL指令的格式为:

BL{条件} 目标地址

BL 是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。以下指令:

   BL   Label         ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存

到R14中

3、  BLX指令

BLX指令的格式为:

BLX  目标地址

BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。

4、  BX指令

BX指令的格式为:

BX{条件}  目标地址

BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。

二、数据处理指令数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。

数据传送指令用于在寄存器和存储器之间进行数据的双向传输。

算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。

比较指令不保存运算结果,只更新CPSR中相应的条件标志位。

数据处理指令共以下16条。

1、    MOV指令

MOV指令的格式为:

MOV{条件}{S} 目的寄存器,源操作数

MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

指令示例:

MOV R1,R0                        ;将寄存器R0的值传送到寄存器R1

MOV PC,R14                       ;将寄存器R14的值传送到PC,常用于子程序返回

MOV R1,R0,LSL#3                 ;将寄存器R0的值左移3位后传送到R1

2、  MVN指令

MVN指令的格式为:

MVN{条件}{S} 目的寄存器,源操作数

MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

指令示例:

MVN  R0,#0                       ;将立即数0取反传送到寄存器R0中,完成后R0=-1

3、  CMP指令

CMP指令的格式为:

CMP{条件} 操作数1,操作数2

CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作操作数2,则此后的有GT 后缀的指令将可以执行。

指令示例:

CMP    R1,R0              ;将寄存器R1的值与寄存器R0的值相减,并根据

                              结果设置CPSR的标志位

CMPR1,#100               ;将寄存器R1的值与立即数100相减,并根据结果

                              设置CPSR的标志位

4、  CMN指令

CMN指令的格式为:

CMN{条件} 操作数1,操作数2

CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位。

指令示例:

CMN    R1,R0              ;将寄存器R1的值与寄存器R0的值相加,并根据结果

                                设置CPSR的标志位

   CMNR1,#100               ;将寄存器R1的值与立即数100相加,并根据结果设置

                                CPSR的标志位

5、  TST指令

TST指令的格式为:

TST{条件} 操作数1,操作数2

TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。操作数1是要测试的数据,而操作数2是一个位掩码,该指令一般用来检测是否设置了特定的位。

指令示例:

TST    R1,#%1              ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数)

TSTR1,#0xffe           ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位

6、  TEQ指令

TEQ指令的格式为:

TEQ{条件} 操作数1,操作数2

TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等。

指令示例:

TEQ   R1,R2                   ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位

7、  ADD指令

ADD指令的格式为:

ADD{条件}{S} 目的寄存器,操作数1,操作数2

ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

指令示例:

ADD     R0,R1,R2                ; R0 = R1 + R2

ADD     R0,R1,#256              ; R0 = R1 + 256

ADD     R0,R2,R3,LSL#1         ; R0 = R2 + (R3 << 1)

8、  ADC指令

ADC指令的格式为:

ADC{条件}{S} 目的寄存器,操作数1,操作数2

ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

以下指令序列完成两个128位数的加法,第一个数由高到低存放在寄存器R7~R4,第二个数由高到低存放在寄存器R11~R8,运算结果由高到低存放在寄存器R3~R0:

ADDS     R0,R4,R8          ; 加低端的字

ADCS    R1,R5,R9             ; 加第二个字,带进位

ADCS    R2,R6,R10          ; 加第三个字,带进位

ADC      R3,R7,R11              ; 加第四个字,带进位

9、  SUB指令

SUB指令的格式为:

SUB{条件}{S} 目的寄存器,操作数1,操作数2

SUB指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。

指令示例:

SUB     R0,R1,R2                ; R0 = R1 - R2

SUB     R0,R1,#256              ; R0 = R1 - 256

SUB     R0,R2,R3,LSL#1         ; R0 = R2 - (R3 << 1)

10、~~~~C指令

~~~~C指令的格式为:

~~~~C{条件}{S} 目的寄存器,操作数1,操作数2

~~~~C指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。

指令示例:

SUBS    R0,R1,R2                         ; R0 = R1 - R2 - !C,并根据结果设置

                                                 CPSR的进位标志位

11、R~~~~指令

R~~~~指令的格式为:

R~~~~{条件}{S} 目的寄存器,操作数1,操作数2

R~~~~指令称为逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。

指令示例:

R~~~~     R0,R1,R2                              ; R0 = R2 – R1

R~~~~     R0,R1,#256                            ; R0 = 256 – R1

R~~~~     R0,R2,R3,LSL#1                       ; R0 = (R3 << 1) - R2

12、RSC指令

RSC指令的格式为:

RSC{条件}{S} 目的寄存器,操作数1,操作数2

RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。

指令示例:

RSC     R0,R1,R2                             ; R0 = R2 – R1 - !C

13、AND指令

AND指令的格式为:

AND{条件}{S} 目的寄存器,操作数1,操作数2

AND指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于屏蔽操作数1的某些位。

指令示例:

AND R0,R0,#3                            ; 该指令保持R0的0、1位,其余位清零。

14、ORR指令

ORR指令的格式为:

ORR{条件}{S} 目的寄存器,操作数1,操作数2

ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。

指令示例:

ORR R0,R0,#3         ; 该指令设置R0的0、1位,其余位保持不变。

15、EOR指令

EOR指令的格式为:

EOR{条件}{S} 目的寄存器,操作数1,操作数2

EOR指令用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于反转操作数1的某些位。

指令示例:

EOR R0,R0,#3        ; 该指令反转R0的0、1位,其余位保持不变。

16、BIC指令

BIC指令的格式为:

BIC{条件}{S} 目的寄存器,操作数1,操作数2

BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。操作数2为32位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。

指令示例:

BIC R0,R0,#%1011    ; 该指令清除 R0 中的位 0、1、和 3,其余的位保持不变。

三、法指令与乘加指令ARM微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为64位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1必须是不同的寄存器。

乘法指令与乘加指令共有以下6条:

1、  MUL指令

MUL指令的格式为:

MUL{条件}{S} 目的寄存器,操作数1,操作数2

MUL指令完成将操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数或无符号数。

指令示例:

MUL R0,R1,R2            ;R0 = R1 × R2

MULS R0,R1,R2           ;R0 = R1 × R2,同时设置CPSR中的相关条件标志位

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>