4、索引后缀(IA,IB,DA,DB)和堆栈后缀(FD,FA,ED,EA)

 一直以来对这几个东西都比较模糊,今天把它总结了下

1.索引后缀(IA,IB,DA,DB)----用于数据块的传送,地址基址不能用SP(R13)寄存器
   先说明字母代表含义,方便记忆  
I--Icrement   A---After   B--Before  D--Decrement
这样就清楚含义了    IA---事后递增,即每次传递后基址加4,指向下一个字,递增方式
                    IB---事先递增,即每次传递前基址加4,指向本次传送的字,递增方式
                    DA---事后递减,即每次传递后地址减4,指向下一个字,递减方式
                    DB---事前递减,即每次传递前地址减4,指向本次传送的字,递减方式
概念就这么多,拿出实例来验证下
      LDMIA R6,{R0,R4,R7} ; [R6]-->R0,[R6+4]-->R4, [R6+8]-->R7
有时候在寄存器列表后面加个^玩意,知道啥东西不,承接上面例子GO ON
      LDMIA R6,{R0,R4,R7}^ ; ^的作用可大了:处理器同时把SPSR拷贝到CPSR中,并强制处理器回到用户模式(注意了:只在数据块传递中使用,切忌在用户模式中)
要是还不清楚再举个例子   LDMFD SP! {R12,R15}; 加载R15,同时CPSR不变
                         LDMFD SP! {R12,R15}^;加载R15,同时SPSR传送到CPSR
2.堆栈后缀(FD,FA,ED,EA)----地址基址必须使用SP(R13),堆栈堆栈嘛肯定是使用堆栈区了
    同样先了解字母含义
 F---Full  D---Descending(减)   E--Empty  A---Ascending(增)
    然后谈谈满栈和空栈
满栈(full stack)----栈指针指向栈顶元素(即最后一个入栈的数据元素)
空栈(empty stack)----栈指针指向与栈顶元素相邻的一个可用数据单元,也就是说栈指针指向第一个没用使用的地址或者空位置
  PS:之前我误解满栈就是堆满了,空栈就是空了没了到 ,希望不要再有人有这种白痴的理解
例子:   中断后保护现场  STMFD SP!,{R0-R5,LR};把R0-R5和LR保存到堆栈中
         中断返回        LDMFD SP!,{R0-R5,PC};把数据出栈到R0-R5和PC中

一点废话:如 LDMIA R6,{R0,R4,R7} ;有时候不记得是哪是寄存器哪是存储器了,LDM是数据块加载,肯定是从内存加载到寄存器嘛,就把{}内的当作寄存器,前面的R6当作存储器就是了,记住{}内是寄存器就得了


版权声明:本文为mianyy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。