ARM中常用的汇编指令集

来源:互联网 发布:开淘宝店要花钱吗 编辑:程序博客网 时间:2024/05/14 07:07

所有指令末尾加s表示影响标志位!

1、跳转指令

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

1)使用专门的跳转指令

2)直接向程序计数器(PC)写入跳转地址的值,通过程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中任意跳转,在跳转之前结合使用:mov、lr、pc等类型指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。


b跳转指令

bl带返回的跳转指令(带链接的跳转指令。指令将下一条指令的地址拷贝到r14(即lr)链接寄存器中,然后跳转到指定地址运行程序)

bx带切换状态的跳转指令

blx带返回和切换状态的跳转指令


b 目标地址

举例:

blabel ;程序无条件跳转到标号label处执行

b0x1234 ;跳转到绝对地址0x1234处


cmpr1,#0 ;r1和0作比较

beqlabel ;如果相等就跳转,不相等就不跳转,这里的eq就是条件,当cpsr寄存器中的Z条件码为1时,程序跳转到标号label处执行


bl 目标地址

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


bx:带状态切换的跳转指令。跳转到Rm指定的地址执行程序,若Rm的位为1,则跳转时自动将cpsr中的标志T置位,即把目标地址的代码解释为Thumb代码;若Rm的位为0,则跳转时自动将cpsr中的标志T复位,即把目标地址的代码解释为ARM代码。

举例:

adrlr0,ThumbFun+1

bxr0

;跳转到r0指定的地址,并根据r0的最低位来切换处理器状态


blx:跳转,改变状态及保存PC值




2、数据处理指令

(1)数据传送指令

mov:数据传送指令。将8位立即数或寄存器传送到目标寄存器,可用于移位运算等操作。

举例:

mov     r1,#0x10 ;r1=0x10

mov     r0,r1 ;r0=r1

movs   r3,r1,lsl    #2 ;r3=r1《2,并影响标志位

mov     pc,lr ;pc=lr,子程序返回


mvn:数据非传送指令。将8位立即数或寄存器按位取反后传送到目标寄存器,因为其有取反功能,所以可以装载范围更广的立即数。

举例:

mvnr1,#0xff

mvn r1,r2 ;将r2取反,结果存到r1


(2)算数逻辑运算指令

add:加法运算指令。

举例:

adds r1,r1,#1 ;r1=r1+1

addr1,r1,r2 ;r1=r1+r2

addsr3,r1,r2,lsl #2;r3=r1+r2《2


sub:减法指令。

举例:

subsr0,r0,#1 ;r0=r0-1

subsr2,r1,r2 ;r2=r1-r2

subr6,r7,#0x10 ;r6=r7-0x10


rsb:逆向减法指令。

举例:

rsbr3,r1,#0xff00 ;r3=0xff00-r1

rsbsr1,r2,r2,lsl #2;r1=r2《2-r2

rsbr0,r1,#0 ;r0=-r1


adc:带进位的加法指令。

sbc:带进位的减法指令。

rsc:带进位逆向减法指令。


and:逻辑与操作。

orr:逻辑或操作指令。

eor:逻辑异或操作指令。

bic:位清除指令。将寄存器Rn的值与operand2的值的反码按位作逻辑与操作,结果保存在Rd中。指令格式:bic    Rd,Rn,operand2

举例:bic     r1,#0x0f ;将r1的低4位清零,其它位不变

bic  r1,r2,r3 ;将r3的反码和r2相逻辑与,结果保存到r1



(3)比较指令

cmp:比较指令。指令使用寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下:

cmp     Rn,operand2

cmn:负数比较指令。指令使用寄存器Rn的值加上operand2的值,根据操作结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行,指令格式如下:

cmn     Rn,operand2

tst:位测试指令。指令将寄存器Rn的值鱼operand2的值按位作逻辑与操作,根据操作的结果更新CPSR中相应的条件标志位(当结果为0时,EQ位被设置),以便后面指令根据相应的条件标志来判断是否执行。指令格式如下:

tst     Rn,operand2

teq:相等测试指令。指令寄存器Rn的值与operand2的值按位作逻辑异或操作,根据操作的结果更新CPSR中相应的条件标志位,以便后面指令根据相应的条件标志来判断是否执行。指令格式如下:

teq    Rn,operand2

举例:

teq    r0,r1;比较r0和r1是否相等(不影响V位和C位)



(4)乘法指令

mul:32位乘法指令。指令将Rm和Rs中的值相乘,结果的低32位保存到Rd中

举例:

muls     r0,r3,r7 ;r0=r3xr7,同时设置cpsr中的N位和Z位


mla:32位乘加指令。指令将Rm和Rs中的值相乘,再将乘积加上第三个操作数,结果的低32位保存到Rd中,指令格式如下:mla    Rd,Rm,Rs,Rn


umull:64位无符号乘法指令。指令将Rm和Rs中的值作为无符号数相乘,结果的低32位保存在RdLo中,而高32位保存到RdHi中。指令格式如下:

umlal    RdLo,RdHi,Rm,Rs

smull:64位有符号乘法指令。指令将Rm和Rs中的值作为有符号数相乘,结果的低32位保存在RdLo中,而高32位保存到RdHi中。指令格式如下:

umlal    RdLo,RdHi,Rm,Rs

smlal:64位有符号乘加指令。指令将Rm和Rs中的值作为有符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存在RdLo中,而高32位保存到RdHi中。指令格式如下:

smlal    RdLo,RdHi,Rm,Rs


















































0 0
原创粉丝点击