ZHCUCH3A November 2024 – March 2025 F29H850TU , F29H859TU-Q1
借助“具有 #Immediate 递增/递减的指针寻址”类型,可以使用位于附加指针寄存器中的值应用对 32 位存储器空间中任何位置的间接读取或写入访问,其中指针地址从其中一个寻址寄存器 A0 到 A14,并应用寄存器的前置/后置递增或递减。
此类型中的寻址模式之一“*(Ax+#u7imm)++Ak”允许指针递增/递减以及偏移。这在访问值接近变量索引的代码中非常有用。C 语言和生成的汇编代码提供了这方面的一个示例:
C 代码:
For (i=0; i<N; i++)
{
ArrayY[i] = ArrayX[i] + ArrayX[i+1];
ArrayY[i+1] = ArrayX[i] - ArrayX[i+1];
}
生成的汇编代码:
; Initialize ArrayX and ArrayY Pointers and i:
MV A0,#4 ; A0 = i = 4 = increment step size
MV A2,#ArrayX ; A2 = ArrayX base address
MV A3,#ArrayY ; A3 = ArrayY base address
...
; This code is repeated N times:
LD.32 D0,*(A2 + #0) ; D0 = ArrayX[i]
||LD.32 D1,*(A2 + #1*4)++A0 ; D1 = ArrayX[i+1], A2 = A2 + A0
ADD D2,D1,D0 ; D2 = ArrayX[i] + ArrayX[i+1];
||SUB D3,D1,D0 ; D3 = ArrayX[i] - ArrayX[i+1];
ST.32 *(A3 + #0),D2 ; ArrayY[i] = D2
ST.32 *(A3 + #1*4)++A0 ; ArrayY[i+1] = D3, A3 = A3 + A0
根据 #immediate 值提供的递增偏移大小会使用完整的 32 位无符号加法运算添加到基址寄存器中。如果值溢出,该值将绕回。
这种绕回可用于实现递减索引。例如:
; Starting parameters:
; A2 = arr = 8 = 0x0000 0008 (base address at 8th byte in memory space)
; A0 = i = -1 = 0xFFFF FFFF (index at -1)
*(A2+A0) = 8 + (-1) = 7th byte in memory space