У тебя набор слов, как у студента, который сдает зачет и "плавает"
в теме. Непонятно только, кто препод, и для кого строятся эти
словесные нагромождения. Поэтому начнем с конца.
Причина глюка заключена в том, что нескольким локальным переменным с одновременном временем жизни дали один и тот-же адрес ОЗУ.
И возникла данная ситуация из-за того, что дерево вызовов, построенное компилятором не соответствует реальному дереву.
Компилятору неизвестны функции, которые ты вызываешь через указатель и он не включил их в построение дерева вызовов.
Прерывания здесь совсем не причем.
Выхода из данной ситуации два:
1. Вручную отредактировать дерево вызовов. Это делается директивами линкера. Я за давностью лет позабыл подробности, но помню, что там все просто. Еще помню, что дерево вызовов формируется в каком-то файле в текстовом виде и его можно посмотреть.
2. Вызывать через указатель реентрантные функции. Но это как удаление гланд через Ж. Слишком высока цена реентрантности в 51-й архитектуре. Если функции небольшие, то наверное можно и так.