【发布时间】: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