目录
指令及其含义:
指令:LDR(load)
指令:LDR(伪指令)
指令:STR(Srote)
指令:ldm
指令:stm
指令:B
指令:BL
指令:MOV(move)
指令:MOV(move)
指令:sub
指令:add
指令:cmp
指令:bne
指令:MRS
指令:MSR
指令:bic
①
含义:读内存命令
例子:
指令:LDR R0 ,[R1] --假设R1的值为x
命令解析:读取地址x上的数据(4个字节)保存到R0中。
②
含义:伪指令(并不存在的指令,最终被解析成真正的汇编指令)
例子:
LDR R0,=0x12345678
命令解析:把0x12345678的值赋值给R0
补充:伪指令的含义
一条ARM指令为 32 位 ,其中肯定是由某些字节来表示MOV本身,某一位用来指定使用的寄存器(比如R0),剩下的位就不足32位了,如果我们需要使用命令:MOV R0 ,#0x12345678 ,此时MOV指令剩下的位已经不足32为了,所以这条指令就会出错,所以MOV指令不能写任意值,只能写简单的值(被称为立即数)。
③
含义:写内存命令
例子:
指令:LDR R0 ,[R1] --假设R1的值为x
命令解析:
例子:
指令:STR R0 ,[R1] --假设R1的值为x
命令解析:把R0的值(4字节)写到地址x中去。
④
含义:读内存读取数据,然后把读取的数据写入多个寄存器
命令解析:
例子:
ldmia sp, {fp, sp, pc}
假设:sp=4080
例子:ia的含义是过后增加(Increment After),就是先读取后增加,而且的顺序的依据是:高编号的寄存器存储在高地址
fp,sp, pc 这三个的寄存器编号分别如下所示(ARM编程手册查看)
pc->R15,sp->R13,fp->R11.所以存取的顺序是:fp-sp-pc(与指令顺序无关)
附录:
其他形式简单的描述指令的行为,意思分别是过后增加(Increment After)、预先增加(Increment Before)、过后减少(Decrement After)、预先减少(Decrement Before)。
⑤
含义:把多个寄存器的值写入内存
例子:
指令:stmdb sp!, {fp, ip, lr, pc}
解析:假设sp=4096,db是预先减少(Decrement Before)的意思,就是先减少后存入sp开始的地址,而且存取的顺序的依据是:高编号的寄存器存储在高地址。fp, ip, lr, pc 这四个的寄存器编号分别如下所示(ARM编程手册查看)
pc->R15,lr->R14,ip->R12,fp->R11.所以存取的顺序是:pc-lr-ip-fp(与顺序无关)
存储的大体如下,先减后存入:
提示:sp!的含义代表的是,sp会等于执行完此条语句后的值,比如存入四个寄存器,那么得减掉4次,那么sp=4096-16=4080。
感叹后表示执行完语句后sp的值会被改变.
附录:
其他形式简单的描述指令的行为,意思分别是过后增加(Increment After)、预先增加(Increment Before)、过后减少(Decrement After)、预先减少(Decrement Before)。
⑥
含义:跳转指令
⑦
含义:跳转到指定指令,把返回地址(下一条指令的地址)保存在lr寄存里边
例子:
BL xx
aa
解析:命令跳转到xx处执行,且lr寄存器保存aa的地址,以便继续运行
⑧
含义:赋值指令
例子1:
MOV R0,R1
命令解析:把R1的值赋值给R0
(即为:R0=R1)
例子2:
MOV R0,#0x100
命令解析:把0x100赋值给R0
⑨
含义:赋值指令
例子1:
MOV R0,R1
命令解析:把R1的值赋值给R0
(即为:R0=R1)
例子2:
MOV R0,#0x100
命令解析:把0x100赋值给R0
⑩
含义:减法指令
例子1:
指令:sub ro ,r1,#5
解析:其含义是:r0 = r1 -5;
例子2:
指令:sub ro ,r1,r2
解析:其含义是:r0 = r1 -r2
⑪
含义:加法指令
例子1:
指令:add ro ,r1,#5
解析:其含义是:r0 = r1 + 5;
指令:add ro ,r1,r2
解析:其含义是:r0 = r1 + r2;
⑫
含义: cmp(compare)指令进行比较两个操作数的大小
例子:例:cmp oprd1,oprd2
其含义为第一个操作减去第二个操作数,但不影响第两个操作数的值,它影响flag的CF,ZF,OF,AF,PF.
若执行指令后:ZF=1,则说明两个数相等,因为zero为1说明结果为0.
当无符号时:
若CF=1,则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1
CF=0,则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2.
当有符号时:
若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2;
若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1
若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1
若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2;
最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出
⑬
含义: 是个条件跳转,即:是“不相等(或不为0)跳转指令”。如果不为0就跳转到后面指定的地址,继续执行
例子:
cmp r3, #4 ; 0x4
bne a0
ldr r2, [fp, #-20]
当着两句连用时,代表r3-4,如果结果为0,则继续执行下面的语句ldr,如果结果不为0,则跳转到
含义:MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。
格式:MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR)
例子:
MRS R0,CPSR @传送CPSR的内容到R0
MRS R0,SPSR @传送SPSR的内容到R0
注意事项:
MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情冴:
Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
Ⅱ.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
含义:MSR指令用亍将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。
格式:MSR{条件} 程序状态寄存器(CPSR或SPSR)_<域>,操作数
例子:
MSR CPSR,R0 @传送R0的内容到CPSR
MSR SPSR,R0 @传送R0的内容到SPSR
MSR CPSR_c,R0 @传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域
注意事项:
<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:
位[31:24]为条件标志位域,用f表示;
位[23:16]为状态位域,用s表示;
位[15:8]为扩展位域,用x表示;
位[7:0]为控制位域,用c表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。
含义:BIC指令用于清除(操作数1)的某些位,并把结果放置到目的寄存器中。(操作数1)应是一个寄存器,(操作数2)可以是一个寄存器,被移位的寄存器,或一个立即数。(操作数2)为32位的掩码,如果在掩码中设置了某一位,则清除返一位。未设置的掩码位保持不变。
格式:BIC{条件}{S} 目的寄存器,操作数1,操作数2
例子:
bic r0,r0,#0x1f
0x1f=0xb11111
其含义:清除r0的bit[4:0]位。