Серьёзная ошибка в Паскаль-компиляторе
Mar. 23rd, 2024 12:36 pmВ компиляторе Паскаль-монитор была предусмотрена возможность вставлять в программу произвольные машинные команды с помощью встроенной функции BESM(код). Экстракод там какой вызвать, например.
Реализовано это в компиляторе путем тупого копирования указанного кода в создаваемый объектный модуль ("стандартный массив" МС Дубна), но тут есть одна проблема: в формате объектного модуля некоторые диапазоны значений адресной части были зарезервированы под ссылки на таблицу символов, признаки перемещаемости и т. п.
Из-за этого, например, попытка написать команду перехода на абсолютный адрес 76000 - BESM(003076000B) - приводит к краху. В результате получается переход по смещению 36000 относительно начала модуля.
Или даже просто вместо экстракода паузы BESM(0507700B) порождает Э50 с нулевой (в реальности - произвольной) адресной частью.
Такие дела.
Реализовано это в компиляторе путем тупого копирования указанного кода в создаваемый объектный модуль ("стандартный массив" МС Дубна), но тут есть одна проблема: в формате объектного модуля некоторые диапазоны значений адресной части были зарезервированы под ссылки на таблицу символов, признаки перемещаемости и т. п.
Из-за этого, например, попытка написать команду перехода на абсолютный адрес 76000 - BESM(003076000B) - приводит к краху. В результате получается переход по смещению 36000 относительно начала модуля.
Или даже просто вместо экстракода паузы BESM(0507700B) порождает Э50 с нулевой (в реальности - произвольной) адресной частью.
Такие дела.