【问题标题】:`Improper Operand type: data error` with MASM 5.00MASM 5.00 的“操作数类型不正确:数据错误”
【发布时间】:2019-12-18 04:51:35
【问题描述】:

我在将我的文件从 EMU8086 汇编语法转换为 MASM 5.00 语法时遇到问题,我收到错误:

不正确的操作数类型:DATA

我的代码是:

.model small
.stack 100h
.data
x db ?
y db ?
z db ?
q db 10,13, 'First Digit  $'
r db 10,13, 'Second Digit  $'
s db 10,13, 'Product  $'

.code
mov ax,data
mov DS,ax
lea dx,q
mov ah,9
int 21h
mov ah,1
int 21h
sub al,30h
mov x,al
lea dx,r
mov ah,9
int 21h
mov ah,1
int 21h
sub al,30h
mov y,al
mul x
mov z,al
aam
add ah,30h
add al,30h
mov bx,ax
lea dx,s
mov ah,9
int 21h
mov ah,2
mov dl,bh
int 21h
mov ah,2
mov dl,bl
int 21h
mov ah,4ch
int 21h
end

【问题讨论】:

  • 复制/粘贴错误消息的文本,并显示是哪一行。 emu8086 是否需要mov ax, @data 作为细分基础?一些汇编程序会这样做。另外,您使用的是dosbox还是使用emu8086? emu8086 有自己的模拟器。 (出于某种原因,8086 是 emu8086 的标签同义词。但 DOSBox 至少模拟 386,因此如果您不使用 emu8086,则正确的标签更有可能是 x86-16。)
  • 您是编程新手,想从汇编和仿真开始?这听起来像是一条漫长而崎岖的道路。也许从更适合初学者的环境开始,例如 Python 或 Java...
  • 一个好的开始方法是使用高级语言,该语言可以使用 Intel Assembly 内联块,该块可以访问高级语言范围内的变量。不幸的是,我不知道目前有任何一个(Turbo C 和 Turbo Pascal 在过去已经符合这个标准)。
  • 为什么必须是 Intel 汇编语法? GCC(用于 C 和 C++)为 GNU GAS / AT&T 语法提供了复杂的内联汇编机制。
  • @Erlkoenig :足够复杂,但如果您不知道如何正确处理约束的所有细微差别,则容易出错。对于新人,我强烈建议不要使用 GCC 的内联汇编,并在单独的汇编模块(文件)中进行汇编并将它们链接起来。此外,除非您使用 ia16 GCC 项目,否则 GCC 会输出具有 32 位的混蛋 16 位代码操作数前缀覆盖。英特尔汇编的旧高级语言(如 Turbo-C 具有内联汇编)比 GCC 的内联汇编宽容得多,但代价是它生成的代码效率较低。

标签: assembly masm x86-16 emu8086 dosbox


【解决方案1】:

EMU8086 使用类似 MASM 的相当宽松的语法。当使用带有实际 MASM 的简化段指令时,您必须从名称中引用带有 @ 符号的段名称(并且删除句点 .)。 .data 段应引用为 @data 而不是 dataMASM documentation 是这样描述的:

@code、@data 等:对于每个主要段指令,都有一个对应的同名等式,只是等式以 at 符号 (@) 开头,但指令以句号。例如,@code 等同表示由 .CODE 指令定义的段名称。同样,@fardata 代表 .FARDATA 段名,@fardata?代表.FARDATA?段名。 @data 等价表示所有邻近数据段共享的组名。它可用于访问由 .DATA、.DATA?、.CONST 和 .STACK 段创建的段。

代码:

mov ax,data
mov DS,ax

应该写成:

mov ax,@data
mov DS,ax

附加说明

这不适用于您正在使用的 MASM 5.xx。在较新版本的 MASM (6.00+) 中,汇编器可以生成所需的启动代码,为使用 .startup 指令指定的 model 适当地设置段寄存器。使用较新版本的 MASM(和 TASM),您可以替换:

.code
mov ax,@data
mov DS,ax
...

与:

.code
.startup
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多