Если вы хотите получить адрес функции в том же модуле компиляции, вам следует использовать относительную адресацию ПК.Вы можете использовать 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