ZHCUCH3A November 2024 – March 2025 F29H850TU , F29H859TU-Q1
可按以下示例所示分配和取消分配栈空间:
分配 32 个字节(必须是 8 字节的倍数):
ADD.U16 A15,A15,#32 ; SP = SP + 32
取消分配 32 个字节(必须是 8 字节的倍数):
SUB.U16 A15,A15,#32 ; SP = SP - 32
编译器自动分配和取消分配栈空间,并强制对齐到 64 位字边界。
如果需要且栈大小小于 256 字节,还可以使用 *(A15++#u8imm) 寻址模式推送栈上的某些内容,并且还可以分配额外的栈空间。例如:
ST.64 *(A15++#32),XD0 ; Push 64-bit XD0 value on stack, then allocate
; 32 bytes on stack (SP = SP + 32)
同样,可以使用 *(A15 -= #n8imm) 寻址模式取消栈分配并从栈中弹出内容。例如:
LD.64 XD0,*(A15-=#32) ; De-allocate 32-bytes from stack (SP = SP - 32),
; and pop 64-bit value from stack into XD0
如果需要访问栈上距离大于 8192 字节的值,则需要使用寻址指针来访问该值。例如:要访问距离栈顶 8216 字节的 32 位值,请执行以下操作:
SUB.U16 A0,A15,#8216 ; A0 = SP - #8216
LD.32 D0,*A0 ; D0 = contents of stack at SP-8216
通常,对于大型栈,编译器会分配其中一个 Ax 寻址模式寄存器作为帧指针,并可以使用可用的指针寻址模式来索引到栈中。
上述方法还可用于在需要频繁访问栈上的局部变量或需要对数据使用指针递增/递减运算的情况下初始化栈内的指针。
请注意,无论使用何种寻址模式,任何栈存储器访问都必须与访问的字大小对齐,并且任何非对齐访问都会产生故障。编译器负责对栈空间上的任何数据进行对齐。