一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  //表示p指向的地址位置(也就是p变量的值) *p                //表示p指向的地址里面的内容 所以 * 的作用:  p变量的值作为地址,去访问这个地址的内容 二级指针 int **pp       //表示定义一个int *型的指针pp &pp            //表示pp…
R14也称作子程序连接寄存器(Subroutine Link Register)或连接寄存器LR.当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份. 其他情况下,R14用作通用寄存器.与之类似,当发生中断或异常时,对应的分组寄存器R14_svc.R14_irq.R14_fiq.R14_abt和R14_und用来保存R15的返回值. 寄存器R14常用在如下的情况: 在每一种运行模式下,都可用R14保存子程序的返回地址(也就是 R15  PC ),当用BL或BLX指令调用子程序…
引子 打算写几篇稍近底层或者说是基础的博文,浅要介绍或者说是回顾一些基础知识, 自然,还是得从最基础的开始,那就从汇编语言开刀吧, 从汇编语言开刀的话,我们必须还先要了解一些其他东西, 像  CPU ,内存这些知识点还是理解深刻一点的比较好, 所以这一篇博文就绕着 80x86  CPU 中寄存器的基础部分下手,至于其他的一些将会在后续的博文中介绍 . 同时在这里说明一下,本篇博文介绍的算是比较详细的了,而且介绍的知识点也是比较多的,所以造成博文长度过长, 如果有兴趣想了解这一块的话,还请自行斟酌…
1.       汇编 1.1.    通用寄存器 通用寄存器 37个寄存器,31个通用寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的低8位,也就是控制位 CPSR有4个8位区域:标志域(F).状态域(S).扩展域(X).控制域(C)MSR - Load specified fields of the CPSR or SPSR with an immediate constant, orfrom the contents of a…
PC(program counter)是CPU中用于存放下一条指令地址的寄存器,SP为堆栈指针.下面将介绍函数调用过程中CPU对PC和SP这两个寄存器的操作. 假设有如下函数Fun Fun() { ………………… Sub-fun(a, b): ………………… } 当函数Fun调用其子函数sub-fun时,CPU内部执行情况如下: 1. 执行CPU指令push,将参数a.b入栈,即根据CPU SP寄存器的值,把a.b的值存入SP指向的地址,并把SP减1(栈通常从高地址向低地址生长). 2. 执行C…
堆栈指针(SP,Stack Pointer),专门用于指出堆栈顶部数据的地址. 那么51单片机的堆栈在什么地方呢?由于单片机中存放数据的区域有限,我们不能够专门分配一块地方做堆栈,所以就在内存(RAM)中开辟一块地方,用于堆栈,但是用内存的哪一块呢?还是不好定,因为51是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题?分不好干脆就不分了,把分的权利给用户(编程开发者),根据自已的需要去定吧,所以51单片机中堆栈的位置是…
R13:堆栈指针寄存器 SP R14:链接寄存器 LR R15:程序计数器 PC指针 CPSR:当前程序状态寄存器 SPSR:备份程序状态寄存器…
[双堆栈指针(MSP&PSP)] Cortex-M3内核中有两个堆栈指针(MSP & PSP),但任何时刻只能使用到其中一个. 复位后处于线程模式特权级,默认使用MSP. 通过SP访问到的是正在使用的那个指针,可以通过MSR/MRS指令访问指定的堆栈指针. 通过设置CONTROL寄存器的bit[1]选择使用哪个堆栈指针.CONTROL[1]=0选择主堆栈指针:CONTROL[1]=1选择进程堆栈指针. Handler模式下,只允许使用主堆栈指针MSP. [双堆栈指针在OS中的应用]典型的O…
一共有37个寄存器 1. 31个通用寄存器 2. 6个状态寄存器 R13作为堆栈指针 R14链接寄存器 1.保存函数返回地址 2. 异常返回地址 R15程序计数器(PC指针) 程序状态寄存器 只有在异常时才有程序状态寄存器   为什么有两个CPSR SPSR当异常发生时保存CPSR的地址 当异常结束时SPSR将之前保存的地址给CPSR 程序状态寄存器的数据格式 N    Is set to bit 31 of the result of the instruction. If this resu…
Keil C是非常优秀的C51编译器,可能是最好的C51编译器,提供各种优化模式,对变量的优化和地址安排做得非常好.这是用C语言写代码的好处之一,如果用汇编写,得费一大番功夫给各个变量安排内存物理地址,还得时刻记住哪些地址的内存单元是已经分配了,新增加的变量就不能占用那些已经分配了的单元,以免产生内存交叠冲突和溢出.我一直非常信赖Keil C51的编译结果,在我的印象里,它对内存的分配是完美的,只要代码用它编译时没有报告任何warning和error,代码运行时不可能内存冲突或溢出的现象. 但,…