您的位置:首页 > 其它

arm的寄存器以及基本指令介绍

2016-09-06 13:04 316 查看
ARM一共有37个寄存器

31个通用寄存器

6个状态寄存器

未备份寄存器 r0-r7

备份寄存器 r8-r14

程序计数器r15  也叫做PC寄存器。和X86的eip一样

R13一般也叫做SP  堆栈指针。和X86的esp一样

R14一般也叫做LR 链接寄存器。 相当于返回地址。调用BL BX的时候会将返回地址赋值给LR。在子程序里面 执行完毕以后。会调用MOV PC,LR 这样PC=LR。相当于EIP=retaddr

所以就立马执行 LR了

状态寄存器

CPSR  和 x86里面的flag一样

LDR MOV STR   (特别注意还有一个ldr伪指令 和ldr指令是不同的)

如果想要将内存地址中的数值移动到 CPU寄存器当中。只能使用LDR 

LDR Rd address 指的是将 addres里面的值存储到Rd寄存器中

STR Rd address 指的是将 Rd这个值存放到address地址里面去 

mov和ldr最大的区别是。 MOV只能在寄存器和寄存器之间移动数据。或者将立即数移动到寄存器当中

比如 (假设地址为123456,而地址里里面存储的值是aabbcc)

ldr r0 ,r2        将r2地址里面的值移动到r0. 此时r0=aabbcc

mov r0 ,#123456   将123456这个数据移动到r0。此时r0=123456

ldr r0,=123456    将123456这个数据移动到r0.此时r0=123456 这个是ldr的伪指令。数据前面多了一个等号

也就是如果在后面的数字后加上了一个=号。就表示将这个数据移动到r0.而不是他里面的值。这个叫ldr伪指令

STMFD 指令           特别注意。 SP和PC一定不能放在list里面

LDMFS指令          特别注意SP 不能出现在list当中。如果pc在list里面,那么lr一定不能在list里面。并且要么这一条语句在一个函数的末尾要么在函数外面。

                             因为pop了pc立马就会去执行PC。

了解这两个栈处理命令之前。

先了解。

如果SP指向最后一个入栈的变量的位置。这个叫满堆栈

如果SP指向最后一个入栈的变量的下一个位置(空位置) 这个叫空堆栈。

如果堆栈生长的位置由低到高。叫做递增堆栈。

如果生长位置由高到低为递减堆栈。

2*2一共有四中命名的堆栈方式。 满递增。满递减。空递增。空递减

对于STMFD和LDMFS

都是满递减的形式

STMFD 和 LDMFS 都是从左到右push或者pop的。

附带判断指令如下图



另外还有ARM协处理器。

CP15寄存器包括了c0 c1~c16等等32bit长的寄存器。这些寄存器各有用处。

有些是用来控制mmu 。页表等等的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: