Серьёзная ошибка в Паскаль-компиляторе
Mar. 23rd, 2024 12:36 pmВ компиляторе Паскаль-монитор была предусмотрена возможность вставлять в программу произвольные машинные команды с помощью встроенной функции BESM(код). Экстракод там какой вызвать, например.
Реализовано это в компиляторе путем тупого копирования указанного кода в создаваемый объектный модуль ("стандартный массив" МС Дубна), но тут есть одна проблема: в формате объектного модуля некоторые диапазоны значений адресной части были зарезервированы под ссылки на таблицу символов, признаки перемещаемости и т. п.
Из-за этого, например, попытка написать команду перехода на абсолютный адрес 76000 - BESM(003076000B) - приводит к краху. В результате получается переход по смещению 36000 относительно начала модуля.
Или даже просто вместо экстракода паузы BESM(0507700B) порождает Э50 с нулевой (в реальности - произвольной) адресной частью.
Такие дела.
Реализовано это в компиляторе путем тупого копирования указанного кода в создаваемый объектный модуль ("стандартный массив" МС Дубна), но тут есть одна проблема: в формате объектного модуля некоторые диапазоны значений адресной части были зарезервированы под ссылки на таблицу символов, признаки перемещаемости и т. п.
Из-за этого, например, попытка написать команду перехода на абсолютный адрес 76000 - BESM(003076000B) - приводит к краху. В результате получается переход по смещению 36000 относительно начала модуля.
Или даже просто вместо экстракода паузы BESM(0507700B) порождает Э50 с нулевой (в реальности - произвольной) адресной частью.
Такие дела.
no subject
Date: 2024-03-23 08:13 pm (UTC)no subject
Date: 2024-03-23 08:42 pm (UTC)no subject
Date: 2024-03-23 09:37 pm (UTC)А с длинноадресными надо думать.
Кстати см. https://github.com/leobru/dispak-tools/blob/main/arap.b6
Он был скомпилирован с проверкой границ массивов и переполнения стека, так что номера строк начал процедур и всех обращений к массивам с переменными индексами были известны, и я выровнял декомпилированный текст по этим номерам. Не считая большого начального куска, где был, видимо, include всех полезных макросов, констант и типов, во всех остальных местах безумное количество строк комментариев к тривиальным процедурам поражает.