Сообщение от
PPC
Интересно поглядеть на то, как выглядит фрейм стека при вызове функции.
Не стОит ожидать здесь чуда. Всё-таки Си есть Си: косвенная адресация, прицел на рекурсию со всеми вытекающими.
Я вот придумал для нереэнтерабельных функций такой механизм передачи параметров:
Код:
#define Func(a, b, c) par1 = a; par2 = b; par3 = c; Func_Impl();
где par1-par3 глобальные переменные, доступ к которым осуществляется эффективнее (прямая адресация), чем к стековым (косвенная адресация; для Z80 чаще всего через (IX+n) или (IY+n) ). А реализация функции Func_Impl() достаёт параметры из этих глобальных переменных и сама может вообще не иметь фрейма (на практике она его всё равно имеет - для работы с локальными переменными. Правда, в SDCC можно выключить фрейм для функции модификатором __naked).
Это несколько громоздко записывается, но даёт неплохой код, что особенно важно для проца 8080.
- - - Добавлено - - -
P.S. В SDCC для асмовых функций есть возможность записывать такие переменные-параметры прямо в машкод функции. Пример описания такой переменной (Pt3Player_mode) можно посмотреть здесь: