将64位数据加载到32位寄存器中

时间:2019-04-30 20:43:53

标签: assembly arm keil arm7

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

   src    DCQ    0x0200200AD00236DD
          DCQ    0x00003401AAC4D097
          DCQ    0X0001FC219AC931BE

假设我知道“ src”(名为srcAdr)的地址,可以通过以下方式将src元素的低32位内容在某个索引处加载到名为srcLo的寄存器中:

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

为了获得该元素的更高的32位内容,我知道我可以这样做:

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

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

1 个答案:

答案 0 :(得分:0)

在我的评论之后:如果您出于某种原因必须像使用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,等等。

相关问题