ZHCADC4A September 2011 – March 2014
理论上,所有展开序列都采用以下形式:
步骤 1:恢复 SP
在恢复被调用者保存的寄存器之后,实际的收尾程序才会恢复 SP,但由于堆栈展开是虚拟操作,TDEH 的仿真展开可能会先执行 SP 恢复。这简化了其他被调用者保存的寄存器的恢复操作。
SP 将通过从 FP 复制或递增一个常量来恢复。在后一种情况下, 除了显式递增之外,SP 也会隐式递增,以考虑被调用者保存的区域的大小。如果 SP 从 FP 恢复,则不暗示该额外递增。
第 2 步:恢复 B3
在返回发生之前,返回地址必须位于 B3 中。如果它存储在被调用者保存的寄存器(比如 “R”)中,则需要在步骤 3 恢复 R 本身之前从 R 中恢复 B3。
步骤 3:恢复寄存器
理论上,被调用者保存的寄存器以寄存器安全调试 顺序(节 4.4.2)恢复,从(旧的)SP 指向的位置开始,并移动到较低的地址。除非使用 C6000_push_rts 布局(节 4.4.4),否则 TDEH 会强制执行安全调试排序。
对于使用压缩帧方法(节 4.4.4)创建的堆栈帧,由于优化有利于可压缩指令,已保存的寄存器之间可能存在间隙。展开程序必须知道用于布置寄存器和相应调整寄存器位置的算法。
在大端字节序模式下,为了方便使用 LDDW 和 STDW,如果一对中的两个寄存器占用相同的对齐双字,则交换对的顺序。该值是在使用安全调试顺序确定布局之后计算的,因此不会交换某些寄存器对。
通常,SP (B15) 不是通过显式寄存器恢复来恢复的;当 FP 不可用时,它是针对 DATA_MEM_BANK 布局显式恢复的(节 4.4.3)。
步骤 4:返回
每个展开序列以隐式或显式“RET B3”结束,这表示当前帧的展开已完成。