Assembly shl指令抛出';错误A2070:无效的指令操作数';

Assembly shl指令抛出';错误A2070:无效的指令操作数';,assembly,x86,masm,Assembly,X86,Masm,我正在学习汇编编程语言,我已经开始使用宏来缩短我的程序。其中一个宏未按预期工作 这是我试图运行的基本程序 include pcmac.inc .model small .stack 100h .data .code Hello PROC _Begin ;Line 12 _Exit 0 Hello ENDP END Hello 在pcmac.inc文件中,\u Begin宏具有以下定义: _Begin MACRO mov ax, @d

我正在学习汇编编程语言,我已经开始使用宏来缩短我的程序。其中一个宏未按预期工作

这是我试图运行的基本程序

include pcmac.inc

.model small

.stack 100h

.data

.code

Hello PROC
    _Begin     ;Line 12
    _Exit 0
Hello ENDP

END Hello
pcmac.inc
文件中,
\u Begin
宏具有以下定义:

_Begin  MACRO
        mov     ax, @data
        mov     ds, ax
        mov     bx, ss
        sub     bx, ax
        shl     bx, 4
        mov     ss, ax
        add     sp, bx
        ENDM
当我运行这个程序时,我得到以下错误:

file.asm(12) : error A2070 : invalid instruction operands
    _Begin(5)   :   Macro Called From
    file.asm(12):   Main Line Code
如果我用原始汇编代码替换
\u Begin
宏,程序将按预期工作

    mov ax, @data
    mov ds, ax
有人能告诉我为什么
\u Begin
宏不工作,以及错误是什么意思吗

我在iMac上的Windows 8上使用masm


编辑: 我刚刚发现,如果我在
\u Begin
宏中注释掉下面一行,程序就会运行

shl     bx, 4

但是这个PCMAC.INC文件是我们为本课程所遵循的书提供的,我们不应该修改这个文件。

shl bx,4
导致错误。在80186处理器中引入了移位计数大于1的移位。MASM默认只接受8086条指令,但您可以指示它接受以后的指令集


TL;DR:将
.186
指令放在源代码的顶部。更好的是
.386

假设第12行引用的是
mov-ax、@data
指令,我怀疑宏会扩展成一种指令形式,在这种形式中错误地传递操作数。看起来您想要传递一个立即整数值
5
。我认为这需要一个
$
#
来表示“立即”值。请查看汇编程序手册。您写的文件名是pamac.inc,但后来包含了
include pcmac.inc
,这是您的实际代码吗?您的帖子中有错误吗?@MByD抱歉,这是一个打字错误。修正了。@Jens第12行引用了_Begin宏。我认为第5行引用了Begin宏中的一行。我刚刚开始学习。我不确定什么是直接价值。PCMAC.INC文件是由我们下面的书提供的-我们不应该修改这个文件。