PUSH CS работал с TASM 1.01, но дает нелегальную индексацию с TASM 5.4 - Как это исправить? - PullRequest
3 голосов
/ 07 ноября 2019

У меня есть устаревший (эпоха DOS) код, который использовал:

push cs
pop ds

и прекрасно собран с TASM v1.01

Попытка собрать с TASM v5.4 я получаю "незаконно"Ошибка режима индексации для push cs инструкции.

Как это исправить?

(Поиск [tasm] illegal indexing mode не дал результатов по этой конкретной проблеме.)

РЕДАКТИРОВАТЬ: Вот код, приведенный к минимуму (бессмысленно), который все еще производит ошибку, о которой я говорю.

        assume  cs:code
code    segment
main    proc
        push    cs
main    endp
code    ends
        end

и вот вывод ассемблера:

Turbo Assembler  Version 5.4  Copyright (c) 1988, 2010 Embarcadero Technologies, Inc.

Assembling file:   sample.ASM
**Error** sample.ASM(4) Illegal indexing mode
Error messages:    1
Warning messages:  None
Passes:            1

1 Ответ

4 голосов
/ 07 ноября 2019

Проблема, по-видимому, связана с использованием ASSUME с сегментом, который еще не определен. Перемещение директивы ASSUME в сегмент code устраняет ошибку, равно как и удаление директивы. Изменение регистра CS на регистр DS в директиве ASSUME и в инструкции PUSH приводит к одной и той же ошибке, поэтому используемый регистр сегмента, похоже, не имеет значения.

Это похоже на ошибку в ассемблере, ноОбходной путь прост. Просто переместите директиву ASSUME сразу после директивы code SEGMENT. Это то место, где вы обычно хотели бы этого, поскольку обычно вы не хотели бы предполагать, что CS находится внутри других сегментов code.

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

...