|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
LBSALE[1]LBSALE1、堆/栈
我想这里的很多的兄弟同我一样吧,都没有系统的学习过操作系统的理论,不过也许是我估计错误吧,见笑。
接触微处理,是从简单的8051开始的,那时候的程序写起来同现在有很大的不同。
尤其在堆栈的处理,其实汇编的堆栈同处理器的支持是直接相关,但是在使用C下的堆栈有些东西就需要特殊处理。
通常堆栈只是一个集体的名词,堆应该是存放处理器状态,或者程序运行状态的部分,栈应该是用来进行动态内存分配的内存区域malloc(这是C下的理解)
堆栈通常按照高低地址增长的方向和指针指向的位置划分:
增长:从低地址向高地址
递减:从高地址向的地址
================
指针sp位置,如果指向最后存放数据的地址,称为满堆栈
如果指向空的地址,成为空堆栈
各种处理器会支持者2*2=4中不同类型的堆栈。
2、关于arm的堆栈:
arm是risc的机器没有自己的push pop 指令,通常使用stm LDM指令完成压入弹出操作。arm的使用r13=sp ,r14=lR ,r15=pc
当然在不同的模式下后又不同的影子寄存器,这里的影子是说,他们虽然使用了同样的名称,但是实际的物理地址不是相同的空间,只是认为的做了一些关系的MAP。因为这样可以加速数据的处理。
3、同arm相关的通常是!,S,^这些比较特殊的东西,
尤其对于LDR指令而言,在使用前偏移地时候就有了!,这同后偏移不同
前【Rn,Rm,#**】 这种类型是先进行偏移然后加载数据,更具是否!更新Rn
后【Rn】,Rm,#×× 这是先加载数据,然后进行偏移,一定更新Rn
S通常是一个时候更新标志,有时候如果存在PC(r15)加载的话,会作为更新cpsr的选项,
^这个用到的时候通常不多。这也是同cpsr,spsr相关的东西。
4流水线
这是因为ARM是3级流水线运行,通常运行的指令是Pc-8也就是说运行的指令不是当前的pc指针值。
5、 异常处理部分:
异常处理是同模式相关的一个概念,ARM有多种异常,对应不同的模式,但是他们之间不是一一对应的关系。
返回与否?
有些异常是不需要返回的,reset
其他的异常通常是需要返回到以前的状态 abort,但是不同的异常返回的点是不同的。通常异常的时候会保存下一个指令的地址到R14这样,就需要在返回的时候更具需要进行调整你的PC。
,返回后通常执后的下一条指令这样使用 movs就足够了
abort,就需要返回出现问题的那条指令,也就是【R14】-4 了,所以通常使用subs返回。
一些小的理解,希望交流,如有不对之处,请更正。
|
|