ARM中常用的汇编指令集

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

1、跳转指令

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

1)使用专门的跳转指令

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


b 跳转指令

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

bx 带切换状态的跳转指令

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


b 目标地址

举例:

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

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


cmp r1,#0 ;r1和0作比较

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


bl 目标地址

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


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

举例:

adrl r0,ThumbFun+1

bx r0

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


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




2、数据处理指令

(1)数据传送指令

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

举例:

mov      r1,#0x10 ;r1=0x10

mov      r0,r1 ;r0=r1

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

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


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

举例:

mvn r1,#0xff

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


(2)算数逻辑运算指令

add:加法运算指令。

举例:

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

add r1,r1,r2 ;r1=r1+r2

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


sub:减法指令。

举例:

subs r0,r0,#1 ;r0=r0-1

subs r2,r1,r2 ;r2=r1-r2

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


rsb:逆向减法指令。

举例:

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

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

rsb r0,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


















































你可能感兴趣的:(ARM,基础知识)