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

时间:2015-10-07 17:24:27

标签: 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文件中,_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

如果我用原始汇编代码替换_Begin宏,程序将按预期工作,

    mov ax, @data
    mov ds, ax

任何人都可以告诉我为什么_Begin宏不起作用,错误是什么意思?

我在iMac上的Windows 8上使用masm。

修改 我刚刚发现,如果我在_Begin宏中注释掉以下行,则该程序可以正常工作。

shl     bx, 4

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

1 个答案:

答案 0 :(得分:4)

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

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