2010-10-22 1 views

ответ

2

нажмите его в стек, а затем позвоните по номеру.

+0

Вы имеете в виду сделать что-то вроде этого: pshA jsr cdc_putc где cdc_putc является функцией C void cdc_putc (char c) Итак, C получит значение аккумулятора? – Punit

+0

ну, это не решило проблему, я получаю «НЕЗАКОННОЕ ВР» на отладчике. – Punit

5

Что вы хотите - это ABI, или Application Binary Interface для вашей платформы. Это объяснит, например, как передать аргументы функциям (регистры, стек, микс), которые регистрируют, являются сбережениями вызывающего абонента и которые сохраняются, специальные цели для определенных регистров и т. Д. Следуя общему ABI, вы можете связывать библиотеки, созданные разными компиляторами, смешивать языки высокого уровня и т. Д.

Для «больших» платформ обычно легко найти документ с указанием ABI. Для других вам, возможно, придется полагаться на разборку функции C и на то, что она делает. Обратите внимание на то, какие регистры он сохраняет в своем прологе и какие из них могут разбить. Также обратите внимание, как пролог сохраняет указатель стека (или указатель кадра) на запись, потому что вам придется подражать этому, если вы хотите, чтобы отладчики работали.

Похоже, что соглашение о вызове для HCS08 задокументировано Freescale в an appnote.

+0

+1 для обоих, где искать соглашение о вызове, и как разобраться в этом, если документация не может быть найдена. – Sparky

0

Ну, я нашел решение.

В файле сборки объявить переменную как:

XREF varaible1 

и использовать его в качестве ячейки памяти

В файле C объявить переменную как глобальные.

extern char variable1; 
0

Запишите версию c (возможно, это просто заглушка, передающая только аргументы) для вашей функции и проанализируйте код. Выполняйте свою функцию одинаково. Метод вызова для конкретной функции (в большинстве случаев) однозначно определяется его набором аргументов.

Общим способом является то, что сначала некоторые аргументы, если они являются целыми числами или указателями, передаваемыми в регистры, а остальные помещаются в стек. Но также обратите внимание, что varargs часто передаются по-разному, чем не-varargs.

Специально для 6808, у которых есть несколько регистров, все параметры, вероятно, передаются через стек.

Смежные вопросы