批量Load/Store指令理解(关于内存地址变化方式)

来源:互联网 发布:201淘宝开店成功经验 编辑:程序博客网 时间:2024/06/05 05:38

在ARM的批量Load/Store指令中,地址变化方式有四种:事前递增,事前递减,事后递增,事后递减。这四种地址变化方式和存取方向加起来一共有8种操作方式;同时,每一种操作方式都有两条不同指令进行表示,分为堆栈方式和其它方式,如下表:

pre-increment load
LDMED
LDMIB

post-increment load
LDMFD
LDMIA

pre-decrement load
LDMEA
LDMDB

post-decrement load
LDMFA
LDMDA

pre-increment store
STMFA
STMIB

post-increment store
STMEA
STMIA

pre-decrement store
STMFD
STMDB

post-decrement store
STMED
STMDA



对于任何一种指令,内存和寄存器的映射关系是一致的,即:高地址内存和高位寄存器相对应。例如指令stmfd   sp!,{r0,r1,r2,r3},r0存放在低地址的内存中,指令ldmed   sp!,{r0,r1,r2,r3},r0存放低地址内存储存的内容。

对于堆栈方式的指令,后面两个字母指明了堆栈的使用方式。E和F表示堆栈指针变化是事前还是事后,A和D表示了堆栈的地址是递增还是递减。对于F(full)方式,表示堆栈指针SP所指的内存地址会存放数据,如果有数据需要入堆栈的话,需要事先把指针进行计算后进行存储,如果有数据需要出堆栈的话,直接先内存中读取数据,之后再进行指针计算。对于E(empty)方式,表示堆栈指针SP所指的内存地址不会存放数据,如果有数据需要入堆栈的话,先进行存储之后再把指针进行计算,如果有数据需要出堆栈的话,需要事先对指针进行计算后进行读取。对于A(ascending)方式,表示有数据入栈的时候SP指针是增加的,如果有数据需要入堆栈的话,堆栈指针需要递增,如果有数据需要出堆栈的话,堆栈指针需要递减。对于D(descending)方式,表示有数据入栈的时候SP指针是递减的,如果有数据需要入堆栈的话,堆栈指针需要递减,如果有数据需要出堆栈的话,堆栈指针需要递增。例如,堆栈方式为FA,那如果进行STM操作的话应该是事前递增,进行LDM操作的话就是事后递减。

对于其它方式的指令,后面两个字母直接指明了进行批量Load/Store操作的时候,指针的操作方式。四种组合为Increment After, Increment Before, Decrement After, Decrement Before。例如,进行LDM操作,如果是
IA方式,把SP指向的内容读取到寄存后再进行递增操作,如果是DB方式,先对指针SP进行递减操作后再读取操作。