一直以来对这几个东西都比较模糊,今天把它总结了下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当作存储器就是了,记住{}内是寄存器就得了