您遇到的是 MASM 语法中的一个怪癖。当你有一个内存操作数,里面只有一个立即值,而不是一个标签(即[0000]
or [0010]
),MASM将生成一个Immediate mode Illegal
错误。这样的指令确实没有任何问题,但 MASM 有特定的语法。您必须显式指定段寄存器。许多汇编者会假设DS对于这种情况,但 MASM 没有。
要解决此问题,请使用以下语法:
MOV [DS:0000],AX
MOV [DS:0010],AX
MASM 还允许:
MOV DS:[0000],AX
MOV DS:[0010],AX
第一种是首选,因为 TASM(与 MASM 兼容的汇编器)不支持后一种形式。如果将段放入其中,它应该可以与 MASM 和 TASM 汇编器以及开源 JWASM 汇编器一起使用。
如果你的内存操作数包含一个寄存器和一个偏移量,那么 MASM 不会抱怨,所以这是有效的 MASM 语法:
MOV [BX+0000],AX
MOV [BX+0010],AX
如果您希望将立即值(源)移动到只是立即引用的内存地址,则语法如下所示:
MOV WORD PTR [DS:0000], 0100h
MOV BYTE PTR [DS:0000], 00h
应该注意的是,值 0010 是十进制的 10(不是十六进制)。目前尚不清楚您是否打算在代码中使用十进制或十六进制。十六进制值有一个H
suffix.
注意:我发表了关于将现已删除的段寄存器清零的评论。虽然我的评论是正确的,但我看起来不够仔细,没有意识到您确实将 DS 设置为 0000,因此您的代码正在访问 0000:0000 和 0000:0010。在这方面,您的代码是正确的,尽管尚不清楚您为什么要修改那部分内存。在 IBM-PC 兼容系统上,中断向量表 (IVT) 位于存储器的前 1024 字节中。您可能使用的是非 IBM-PC 兼容系统,并且您所做的事情可能根本不是问题。我只是想提醒您一下。