Достаточно одного фиксированного адреса, по нему делается вызов, который возвращает указатель на массив указателей на все функции BIOS, если состав функций может быть разным, можно предусмотреть какой-либо заголовок с дескрипторами из которого клиентское приложение может достать всю информацию для работы с BIOS.
Дальше эти указатели можно присвоить некой структуре и пользовать вызовы например типа BIOS.UartInit();
Запрос и присвоение структуры можно вынести в отдельную функцию типа BIOS_Init(Struct TBIOS* BIOS), т.е. прикладной программист включает эту функцию в свой код, а дальше работает с вызовами из структуры.
Тут пример написания обработчика SWI
http://www.microchip.su/showthread.php?t=4860Программное прерывание SWI - тоже фиксированная точка входа. При этом еще происходит повышение уровня с пользовательского до системного.