Добрый день.
Поясняю.
Решил написать бузагрузчик с максимальным использованием Си.
Для этого выбрал следующий путь для себя:
1. Удобнее всего объявить прерывания в Си и все в одном файле, тогда всегда легко можно обработчик найти (спустя время) и подкорректировать.
2. Для того что бы прерывания передавались внешней прошивке зафиксировал в битовой области флаг состояния бутзагрузчика (внешняя/бут) и это определение также дал коду внешней прошивки (что бы она его не меняла).
3. В обработчике прерывания, всех прерываний проца, (который на си объявлен) хотел поставить простую конструкцию
Код
if (IN_BOOT)
{
процедура бутзагрузчика, если она есть
}
else
{
#pragma asm
JMP OFFSET_EXT_PROGRAM+"адрес вектора прерывания"
#endasm
}
Что получилось.
Компилятор на пустое объявление прерывания тут же вставляет PUSH ACC и POP ACC
На объявление прерывания с using еще и PSW
На мою конструкцию вставляет полный набор всех регистров и DPTR (даже в случае отсутствия процедуры обработки прерывания в бутзагрузчике (ну просто if и else с asmовой вставкой).
Решил пока переписать все объявления прерываний на ассемблере в стартапе и там на каждый обработчик поставил свой макрос
Код
Interrupt MACRO COUNTER,VECTOR_BOOT_INT
JNB BOOT_in_boot_f,$+4
LCALL VECTOR_BOOT_INT
RETI
LJMP BASE_ADR_EXT_PROG+COUNTER
COUNTER SET COUNTER+8
ENDM
Ни и пришлось описать заранее названия всех обработчик прерываний на Си (которые теперь в Си стали просто процедурами) и в стартап файл их EXTRN"ить

Но это мне не нравится, потому как идея была изначально делать на асме все по минимуму ибо видимо лень мне нажимать на клавиатуру
(хотелось больше сделать все средствами компилятора).
Я правильно понимаю что нет (пока я не нашел об этом информации) возможности в Keil x51 для прерываний (и видимо для функций) запретить автоматическое сохранение регистров в стек (понятно что это рукоблудство может развалить всю прогу, но я надеялся что можно настройкой или прагмой для определенной области это сделать).
Удачи.