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

本文详细解析了ARM架构中的LDM指令的工作原理,特别是LDMIA和LDMFD指令的应用场景,并通过实例说明了基址寄存器的变化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(2012-04-12 21:09:10)
标签: 

杂谈

 

ARM指令的多数据传输(STMLDM)中,提到:多寄存器的LoadStore指令分为2组:一组用于数据的存储与读取,对应于IAIBDADB,一组用于堆栈操作,对应于FDEDFAEA,两组中对应的指令含义相同。

即:

STMIB(地址先增而后完成操作)、STMFA(满递增堆栈);

STMIA(完成操作而后地址递增)、STMEA(空递增堆栈);

STMDB(地址先减而后完成操作)、STMFD(满递减堆栈);

STMDA(完成操作而后地址递减)、STMED(空递减堆栈)。

上述各组2个指令含义相同只是适用场合不同,同理有:

LDMIBLDMED

LDMIALDMFD

LDMDBLDMEA

LDMDALDMFA

我的问题是:

对于STM指令很好理解,但是对于LDM指令,举例说:

LDMIA(完成操作而后地址递增)、LDMFD(满递减堆栈):

若有这样的指令:LDMIA     R0!,{R2-R9}

先将基址寄存器R0所指数据存入R2RO递增,

再将基址寄存器R0所指数据存入R3RO递增,

……

最后将基址寄存器R0所指数据存入R9RO递增至后一位置。

而满递减堆栈的定义是:堆栈随着存储器地址的减小而向下增长,基址寄存器指向存储有效数据的最低地址或者指向第一个要读出的数据位置。

其中基址寄存器指向存储有效数据的最低地址或者指向第一个要读出的数据位置与先前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开始

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值