【问题标题】:Loading a 64-bit data into a 32-bit register将 64 位数据加载到 32 位寄存器中
【发布时间】:2019-04-30 20:43:53
【问题描述】:

假设我有一个 64 位数据的 3 元素数组:

   src    DCQ    0x0200200AD00236DD
          DCQ    0x00003401AAC4D097
          DCQ    0X0001FC219AC931BE

假设我知道“src”的地址(命名为 srcAdr),我可以通过说:

   LDR    srcLo, [srcAdr, index, LSL#3]

为了得到这个元素更高的 32 位内容,我知道我可以:

   ADD    srcAdrHi, srcAdr, #4
   LDR    srcHi, [srcAdrHi, index, LSL#3]

问题是,有没有更优雅的方法来做到这一点?比如说,在一条指令中?

【问题讨论】:

  • 指令集参考说明了什么(例如,如果您查找 LDRD)?
  • 你不能ldr srcHi, [srcAdr, #4]吗?
  • 感谢您的来信。我用的是ARM7TDMI,所以不支持LDRD。
  • 使用 ldm 代替 ldr
  • ldmia r0,{r1,r2} 是一条指令 r0 是地址

标签: assembly arm keil arm7


【解决方案1】:

根据我的评论:如果出于某种原因您必须像使用 uint64_t 数组一样使用索引来处理数据,我认为您不能在此处没有额外的说明。

对于“C”函数:

int foo(unsigned long long *srcT, int index) {
  unsigned int temp=0;
  temp = (unsigned int)(srcT[index]);
  temp += (unsigned int)(srcT[index] >> 32);
  return temp;
}

编译器(ARM gcc 8.2 -O3 -mcpu=arm7tdmi)产生:

foo:
    add     r3, r0, r1, lsl #3
    ldr     r3, [r3, #4]
    ldr     r0, [r0, r1, lsl #3]
    add     r0, r0, r3
    bx      lr

如您所见,它还生成了一条额外指令 (add) 来访问“高半部分”。 当然,确切的指令顺序取决于对阵列执行的操作。如果您循环遍历它,您很可能会得到ldm + add Rx,#8 等。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2011-10-26
    • 2020-11-21
    • 2012-06-28
    相关资源
    最近更新 更多