7种模式, 32个寄存器 r0 - ?r7 : ? ?7种模式都是一样的 r8- r12 : ? 普通模式、 ?FIQ 下特有的 ?r8 - r12? r13 - r14 : ? 每种下都有 ?, 每种模式都不一样 sp : ?每种模式下都有自己的栈, ?所以r13 每种模式下都有? lr: ?比如从user 模式切换到fiq 模式,把user模式返回地址存的lr中, fiq执行完毕以后就可以直接回到user模式? pc : 程序寄存器, 当前程序执行在哪里, 所以只有一个,一个国家只有一个皇帝 , pc 指向那条指令, cpu执行哪条 , ? 程序跑飞了, pc寄存器内容不对了? cpsr: ?程序状态寄存器,存储cpu的状态 spsr: ?保存cpsr ?比如User模式下有cspr, ?在fiq下把user模式下的cpsr保存到fiq下的spsr ,返回的恢复User模式下状态
栈的集中概念;? * 空栈: ? sp 指向空位 ,每次存入的时可以直接存入然后栈 指针移动一格 ; 取出的时需要首先移动一格才能取出 ? empty? ?* 满栈: ? sp 指向栈中最后一格数据, 每次存入需要移动栈指针一格在存入 ?取出的时候直接取出,在移动栈指针 ? full ? 增栈: ? ?指针移动时向地址增加方向移动 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? incrase? ? 减栈: ? ?指针移动时向地址减少方向移动 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? declare? ?? ? 三面4中模式可以组合, ? ? arm是 减栈 、 空栈 ?, ?空减栈 , ?ed?
分析几条汇编指令:?
add ?r0,r1,#4 ? ?r0=r1+4? sub ?r0,r1,r2 ? ?r0=r1-r2 bl : ?跳转到某一条指令,并且把返回地址保存 到 lr中,返回地址就是吓一跳指令的地址 ldm : ?从内存读取数据到 寄存器, m读内存,写入多个寄存器 stm : 把多个寄存器的值写入内存 ldmia : ?ia 就是个上面 的 increase after ?分配过后增加
例子: stmdb sp!,{fb,ip,lr,pc} ? ? db : declare before ?减少在分配之前, 首先减后存?
假设: sp = 4096? ? - 首先减后存 ? ? ?4096-4 = 4092 ?4095-4092存储pc的值 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4091-4088存储ip的值 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4087-4084存储lr的值 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4083-4080存储fp的值 ! 表示 sp = 4080 等于最终被修改的值。?
内存模型图:?
? 存储规则: 高编号寄存器,存储在高地址 ? pc ?r15 ? lr ?r14 ? ip ?r12 ? fp ?r11
参考
|