几个月来,我一直在尝试为Ti-89构建家用的B交叉编译器,终于到了我想要生成计算器可以执行的程序集的时候。语言是“ B”,因为只有一种类型是整数/指针。我不明白如何在此平台上实现函数指针。我正在考虑通过以下方式实现函数指针:
第一种方法肯定行不通,因为Ti-89上的汇编程序在执行前已被复制到RAM中。我将无法在编译时知道函数的位置。另外,根据第24页的《 Ti-89 / Ti-92 Plus开发人员指南》,“ ASM程序可能会在堆垃圾回收期间移动。覆盖系统代码的指针将变得无效。”这将暗示第二种方法也不一定有效,因为有可能在计算出第一条指令的地址之后进行堆垃圾回收。假设有关程序移动的说明正确,则可能导致整个功能移动。第三种方法将在特定情况下起作用,但问题是我不一定知道在汇编程序中将在何处调用该函数。因此,对于可以调用该函数的每个位置,我将需要一个不同的偏移量,而据我所知,我无法计算该偏移量。
TIGCC允许使用函数指针,那么它们如何实现它们呢?有什么我想念的吗?
链接:
答案 0 :(得分:3)
如果要在同一编译单元中获取函数的地址,则应使用PC相对寻址。您可以使用lea
(加载有效地址)将地址存储在任何地址寄存器(a0
-a6
中。从技术上讲,a7
也可以工作,但不能a6
通常也保留为帧指针):
lea myfunc(PC),a2
这可以使用jsr (a2)
(跳转到子例程)来调用,或者在某些情况下仅使用jmp (a2)
(如果堆栈上的参数已与myfunc
。
或者,您可以使用pea
(推送有效地址)将地址压入堆栈:
pea myfunc(PC)
这可以是一个函数参数,或者如果它位于堆栈的顶部,您将使用下一个rts
跳转到该地址。例如,如果您有一个函数会像这样结束:
lea myfunc(PC),a2
; some other code (not changing a2, not messing with the stack)
bsr foo ; local subroutine
jsr (a2)
rts
您也可以写:
pea myfunc(PC)
; some other code (not messing with the stack)
bra foo ; tail call to local subroutine foo
; on return this will jump to myfunc
; when myfunc ends, it returns to the caller of this function