Ti-89

时间:2019-02-23 20:13:51

标签: assembly compiler-construction 68000 b

几个月来,我一直在尝试为Ti-89构建家用的B交叉编译器,终于到了我想要生成计算器可以执行的程序集的时候。语言是“ B”,因为只有一种类型是整数/指针。我不明白如何在此平台上实现函数指针。我正在考虑通过以下方式实现函数指针:

  • 使用立即数存储第一条指令的地址
  • 使用程序计数器和偏移量得出第一条指令的地址
  • 仅存储偏移量,并在进行跳转时计算第一条指令的地址。

第一种方法肯定行不通,因为Ti-89上的汇编程序在执行前已被复制到RAM中。我将无法在编译时知道函数的位置。另外,根据第24页的《 Ti-89 / Ti-92 Plus开发人员指南》,“ ASM程序可能会在堆垃圾回收期间移动。覆盖系统代码的指针将变得无效。”这将暗示第二种方法也不一定有效,因为有可能在计算出第一条指令的地址之后进行堆垃圾回收。假设有关程序移动的说明正确,则可能导致整个功能移动。第三种方法将在特定情况下起作用,但问题是我不一定知道在汇编程序中将在何处调用该函数。因此,对于可以调用该函数的每个位置,我将需要一个不同的偏移量,而据我所知,我无法计算该偏移量。

TIGCC允许使用函数指针,那么它们如何实现它们呢?有什么我想念的吗?

链接:

1 个答案:

答案 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