PUSH CS 与 TASM 1.01 一起工作,但在 TASM 5.4 下提供非法索引——如何修复?

PUSH CS worked with TASM 1.01 but gives illegal indexing with TASM 5.4 -- How to fix?

我有旧版(DOS 时代)代码使用了:

push cs
pop ds

并且 assembled 适合 TASM v1.01

尝试使用 TASM v5.4 assemble 我得到 'illegal indexing mode' push cs 指令的错误。

我该如何解决?

(搜索 [tasm] illegal indexing mode 没有 return 此特定问题的任何结果。)

编辑:这是代码,减少到最少(废话)仍然会产生我正在谈论的错误。

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

这里是 assembler 输出:

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

该问题似乎与将 ASSUME 与尚未定义的段一起使用有关。将 ASSUME 指令移动到 code 段可以消除错误,删除指令也是如此。在ASSUME指令和PUSH指令中将CS寄存器更改为DS寄存器会导致相同的错误,因此使用的段寄存器似乎无关紧要。

这似乎是汇编程序中的错误,但解决方法很简单。只需将 ASSUME 指令移动到 code SEGMENT 指令之后即可。这是您通常想要它的地方,因为您通常不想假设 CS 在其他段内是 code

(您也可以通过让 TASM 使用至少两次传递来解决该问题。这需要同时使用 /m 选项并在您的代码中至少有一个构造需要第二次传递,例如前向引用。TASM 5.4 中的错误似乎是它无法识别 assume cs:code 是前向引用。)