Проблема, по-видимому, связана с использованием ASSUME с сегментом, который еще не определен. Перемещение директивы ASSUME в сегмент code
устраняет ошибку, равно как и удаление директивы. Изменение регистра CS на регистр DS в директиве ASSUME и в инструкции PUSH приводит к одной и той же ошибке, поэтому используемый регистр сегмента, похоже, не имеет значения.
Это похоже на ошибку в ассемблере, ноОбходной путь прост. Просто переместите директиву ASSUME сразу после директивы code SEGMENT
. Это то место, где вы обычно хотели бы этого, поскольку обычно вы не хотели бы предполагать, что CS находится внутри других сегментов code
.
(Вы также можете обойти эту проблему, используя TASM, по крайней мере, два прохода. Для этого требуется как опция /m
, так и наличие в вашем коде как минимум одной конструкции, которая требует второго прохода, например, forwardссылка. Ошибка в TASM 5.4 заключается в том, что он не распознает, что assume cs:code
является прямой ссылкой.)