Функциональные указатели в сборке 68к для Ti-89 - PullRequest
0 голосов
/ 23 февраля 2019

Я уже несколько месяцев пытаюсь создать кросс-компилятор B для своего Ti-89, и теперь я, наконец, хочу создать сборку, которую выполняет мой калькулятор.Язык «B» в том смысле, что существует только 1 тип, который является целым числом / указателем.Я не понимаю, как реализовать указатели функций на этой платформе.Я рассматривал реализацию указателей на функции следующими способами:

  • Сохранение адреса первой инструкции с использованием непосредственного значения
  • Получение адреса первой инструкции с использованием счетчика программы исмещение
  • Сохранение только смещения и вычисление адреса первой инструкции при выполнении перехода.

Первый метод определенно не будет работать, так как программы сборки на Ti-89копируются в оперативную память перед выполнением.У меня не было бы способа узнать во время компиляции, где будет расположена функция.Кроме того, согласно Руководству для разработчиков Ti-89 / Ti-92 Plus на стр. 24, «программы ASM могут перемещаться во время кучи мусора. Указатели на переопределяющий системный код станут недействительными».Это будет означать, что второй метод также не обязательно будет работать, так как возможно, что сбор мусора в куче происходит после вычисления адреса первой инструкции.Предполагая, что то, что он говорит о перемещении программы, является правильным, это может вызвать перемещение всей функции.Третий метод будет работать в определенных случаях, но проблема в том, что я не обязательно знаю, где в программе сборки будет вызываться функция.Таким образом, для каждого места, где может быть вызвана функция, мне понадобится разное смещение, и, насколько я знаю, у меня нет способа рассчитать это смещение.

TIGCC допускает указатели на функции, так как, черт возьми, они реализуютих?Я что-то упускаю?

Ссылки:

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Если вы хотите получить адрес функции в том же модуле компиляции, вам следует использовать относительную адресацию ПК.Вы можете использовать lea (эффективный адрес загрузки) для сохранения адреса в любом регистре адресов (a0 - a6. Технически, a7 также работает, но не делает этого. a6 также частозарезервировано как указатель кадра):

lea   myfunc(PC),a2

Это можно вызвать с помощью jsr (a2) (переход к подпрограмме) или, в некоторых случаях, просто с помощью jmp (a2) (по сути, прыжок в хвост, в случае, если параметры настек уже соответствует параметрам функции, ожидаемым myfunc).

В качестве альтернативы, вы можете использовать pea (push-эффективный адрес), чтобы протолкнуть адрес в стеке:

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
0 голосов
/ 24 февраля 2019

Я последовал предложению @lurker.Сборка, кажется, просто помещает адрес в стек без особой информации.Из тестирования, если моя функция была названа my_func, то сборка выглядит как move.l #my_func,-4(%fp), которая просто нажимает указатель на функцию.Я предполагаю, что ассемблер преобразует его в непосредственное отношение к ПК, а не только к действительному адресу в двоичном файле.Это будет означать, что я неправильно прочитал документацию, на которую ссылался ранее.Я думаю, что он пытался сказать, что вы не можете ссылаться на адреса в двоичном файле в памяти, но вы можете ссылаться на адреса во временной копии, которую они помещают в ОЗУ.Это имело бы больше смысла, так как операционная система не будет работать в фоновом режиме, пока программа сборки все равно работает.Я должен предположить, что сборка мусора может произойти только после выполнения программы.

...