ARM指令集问题:满递减与空递减

来源:百度知道 编辑:UC知道 时间:2024/06/21 18:42:43
ARM指令的多数据传输(STM、LDM)中,提到:多寄存器的Load和Store指令分为2组:一组用于数据的存储与读取,对应于IA、IB、DA、DB,一组用于堆栈操作,对应于FD、ED、FA、EA,两组中对应的指令含义相同。
即:
STMIB(地址先增而后完成操作)、STMFA(满递增堆栈);
STMIA(完成操作而后地址递增)、STMEA(空递增堆栈);
STMDB(地址先减而后完成操作)、STMFD(满递减堆栈);
STMDA(完成操作而后地址递减)、STMED(空递减堆栈)。
上述各组2个指令含义相同只是适用场合不同,同理有:
LDMIB、LDMED;
LDMIA、LDMFD;
LDMDB、LDMEA;
LDMDA、LDMFA。
我的问题是:
对于STM指令很好理解,但是对于LDM指令,举例说:
LDMIA(完成操作而后地址递增)、LDMFD(满递减堆栈):
若有这样的指令:LDMIA R0!,{R2-R9}
先将基址寄存器R0所指数据存入R2,RO递增,
再将基址寄存器R0所指数据存入R3,RO递增,
……
最后将基址寄存器R0所指数据存入R9,RO递增至后一位置。
而满递减堆栈的定义是:堆栈随着存储器地址的减小而向下增长,基址寄存器指向存储有效数据的最低地址或者指向第一个要读出的数据位置。
其中“基址寄存器指向存储有效数据的最低地址或者指向第一个要读出的数据位置”与先前LDMIA指令完成的结果矛盾,因为此指令完成后基址寄存器指向的并不是与R9对应的数据的位置,请问如何解释?
请问如何解释?

不错,其实你自己已经解释清楚了,呵呵
为什么呢?
首先你要理解“基址寄存器指向存储有效数据的最低地址或者指向第一个要读出的数据位置”的概念
比如我的FD堆栈里面有如下数据
地址 数据
0x100 9
0xfc 8
0xf8 7
0xf4 6
0xf0 5
0xec 4
0xe8 3
0xe4 2
0xe0 1
这时候R13,即栈的指针应该是0xe0
比如你运行了
LDMIA R13!,{R2-R9}
取出了8个数字
分别是1-8,这时候R13指向的是哪里?
当然是0x100,因为最后读出来的是8,在读出来以后,R13增加4(32bit数据是+4地址的偏移量),这时候R13就是0x100
0x100这个地址对吗?
当然是对的,因为这时候9就是栈的底部了,R13指向9的地址0x100不对吗?
所以你要理解这个最低有效数据的概念,1-8都出栈了,9就是第一个有效数据
你下一次出栈就是从9开始

所以是没有错的,而且你自己已经诠释了