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 。页表等等的。
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 。页表等等的。
相关文章推荐
- Ant 介绍以及基本使用指南
- 对javascript基本对象的属性以及方法的实例介绍
- Ant介绍以及基本使用指南
- Xcode4.2、iOS各版本以及ARMv6、ARMv7编译架构介绍
- 嵌入式开发八:ARM cortex A8/9 - Android NDK - NEON介绍以及优化
- 汇编寄存器基本指令
- Ant介绍以及基本使用指南
- 关于硬盘突破大容量==64位CPU==32位寄存器吗?==读大容量硬盘寄存器中断寄存器也在大空间吗?==基本指令有效吗?==扩展指令有点累!
- Ant介绍以及基本使用指南
- Ant介绍以及基本使用指南
- Ant介绍以及基本使用指南
- [转]PerformanceCounter 基本介绍以及示例方法
- PerformanceCounter 基本介绍以及示例方法
- linux档案权限介绍以及相关指令
- XML语法提示以及基本的XML语法介绍
- 对javascript基本对象的属性以及方法的实例介绍
- PerformanceCounter 基本介绍以及示例方法
- ARM学习笔记(九)--指令基本格式
- Ant介绍以及基本使用指南
- 硬盘分区工具分区魔术师的功能介绍以及基本命令