shl 指令抛出 'error A2070 : invalid instruction operands'

shl instruction throws 'error A2070 : invalid instruction operands'

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

这是我正在尝试的基本程序 运行,

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 文件是由我们为 class 所关注的书提供的,我们不应该修改这个文件。

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

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