这是我编译空主函数时得到的代码:
main:
movw _.frame,2,-sp
sts _.frame
ldd #0
movw 2,sp+,_.frame
rts
(使用-m68hc12标志编译;没有该标志的输出类似)。其他基本函数(不一定是主函数,也不一定是空函数)也遵循相同的模式。
我不明白是什么帧是。根据端口的源代码,它应该是一个硬寄存器。hc11/hc12上只有5个硬寄存器:D、X、Y、SP和PC。那么汇编程序如何处理虚拟帧指针寄存器呢?
问题的第二部分是帧指针本身的外观。该端口似乎实现了消除帧指针所需的宏和函数,那么为什么不将其替换为对堆栈指针的引用呢?
编辑:
我已经找到了问题的答案。m68hc11端口通过将符号寄存器名称分配给预定义的内存位置来模拟一些硬寄存器(包括帧指针)。这是在larith.asm文件中完成的,该文件显然不仅仅是一个算术库。
没有检查确切的gcc源,但我认为这里的_.frame只是一种软寄存器,内部使用一些全局数据。
以下链接可能部分证明了这一点:
http://tech.groups.yahoo.com/group/gnu-m68hc11/message/3621