Assembly 关于ARM组件中“ldmdb”的混淆
Assembly 关于ARM组件中“ldmdb”的混淆,assembly,arm,cortex-m,Assembly,Arm,Cortex M,ldmdb指令的顺序似乎自相矛盾 在addr_mode的描述下,文档说明DB地址对应于“每次访问前的递减地址” 在操作部分,文档进一步说明“用于访问的内存地址的间隔为4字节,从Rn到Rn-4*(n-1) 我对这两条语句如何不直接冲突感到困惑:如果地址(存储在Rn中)在每次访问之前递减,那么第一个(最高)访问的地址不是Rn-4 根据我在运行一些代码时观察到的行为,似乎每次访问后地址都会减少(与第二种行为一致) 我解释错了吗?在DB寻址模式下,ldm/stm的实际行为是什么 LDMDB/LDMEA)
ldmdb
指令的顺序似乎自相矛盾
addr_mode
的描述下,文档说明DB地址对应于“每次访问前的递减地址”Rn
到Rn-4*(n-1)
Rn
中)在每次访问之前递减,那么第一个(最高)访问的地址不是Rn-4
根据我在运行一些代码时观察到的行为,似乎每次访问后地址都会减少(与第二种行为一致)
我解释错了吗?在DB寻址模式下,
ldm
/stm
的实际行为是什么
LDMDB/LDMEA)
address = R[n] - 4*BitCount(registers);
for i = 0 to 14
if registers<i> == '1' then
R[i] = MemA[address,4]; address = address + 4;
if registers<15> == '1' then
LoadWritePC(MemA[address,4]);
if wback && registers<n> == '0' then R[n] = R[n] - 4*BitCount(registers);
最终结果是:
r2 = mem[0x0FFC]
r1 = mem[0x0FF8]
来自伪代码
address = 0x1000 - (2*4) = 0x0FF8, then for each register flag in the list
mem[address] = r1, address += 4
mem[address] = r2, address += 4
address = 0x1000
for each register flag enabled
r1 = mem[address] address += 4
r2 = mem[address] address += 4
我认为DB意味着不会向起始地址写入任何内容(本例中为0x1000)
如果r5=0x1000
ldmdb r5,{r2,r1}
ldmia r5,{r1,r2}
最终结果是
r1 = mem[0x1000]
r2 = mem[0x1004]
来自伪代码
address = 0x1000 - (2*4) = 0x0FF8, then for each register flag in the list
mem[address] = r1, address += 4
mem[address] = r2, address += 4
address = 0x1000
for each register flag enabled
r1 = mem[address] address += 4
r2 = mem[address] address += 4
我认为递增之后意味着开始使用那个地址,然后递增。递减之前,从前面的(字)地址开始,然后继续向下运行寄存器
或者,您可以简单地在处理器或模拟器上尝试该指令,并检查内存
如果没有意义,请查找替代/兼容的ARM体系结构参考手册之一,并阅读该说明。ARM会不时重新编写其说明
文档中很可能有错误
编辑。是此文本看起来完全错误: 对于LDMDB、LDMEA、STMDB和STMFD,用于访问的内存地址的间隔为4字节,范围从Rn到Rn-4*(n-1),其中n是reglist中的寄存器数。访问按寄存器数递减的顺序进行,编号最高的寄存器使用最高的内存地址,编号最低的寄存器使用最低的内存地址。如果指定了写回后缀,则将Rn-4*(n-1)的值写回Rn 应为rn-4到rn-(4*n)和rn-(4*n)
请注意,体系结构参考手册和技术参考手册都很好。最近他们制作了其他手册的版本。在本案例《用户指南》中,有一些程序员手册。似乎这些都不好,在人们对它们产生类似的困惑后,我不再看它们了。这让我感到困惑看到它有多糟糕,我再也不打扰了。感谢您的详细回复,我怀疑这可能是手册中的错误,但我对此表示怀疑,因为我查看的至少两个其他来源也说了同样的话。我承诺今后只使用官方ARM体系结构参考手册:)