Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 关于ARM组件中“ldmdb”的混淆_Assembly_Arm_Cortex M - Fatal编程技术网

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地址对应于“每次访问前的递减地址”

  • 在操作部分,文档进一步说明“用于访问的内存地址的间隔为4字节,从
    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体系结构参考手册:)