assembly - PUSH CS 适用于 TASM 1.01,但使用 TASM 5.4 会产生非法索引 -- 如何修复?

标签 assembly x86-16 tasm

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

push cs
pop ds

并且与 TASM v1.01 组装得很好

尝试使用 TASM v5.4 进行汇编时,我收到 push cs 指令的“非法索引模式”错误。

我该如何解决这个问题?

(搜索[tasm]非法索引模式未返回此特定问题的任何结果。)

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

        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

最佳答案

该问题似乎与使用 ASSUME 和尚未定义的段有关。将 ASSUME 指令移至 code 段可消除错误,删除该指令也能消除错误。在 ASSUME 指令和 PUSH 指令中将 CS 寄存器更改为 DS 寄存器会导致相同的错误,因此使用的段寄存器似乎并不重要。

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

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

关于assembly - PUSH CS 适用于 TASM 1.01,但使用 TASM 5.4 会产生非法索引 -- 如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58746137/

相关文章:

assembly - 计算机如何将寄存器设置为恒定值?

c++ - 使用汇编程序消息编译错误

visual-studio - 如何在 Visual Studio 2017/2019 中构建 x64 汇编项目

assembly - 将整数转换为字符串汇编 8086 tasm

assembly - 同时获得两把 key - 组装 8086

assembly - 实时按键事件组装 x86 TASM

assembly - 用户按下按键后程序显示垃圾

assembly - 汇编变量是如何实现的?

assembly - 在 TASM 中使用两个数据段

assembly - 组装中的 Pong 项目 8086