【问题标题】:shl instruction throws 'error A2070 : invalid instruction operands'shl 指令抛出“错误 A2070:无效指令操作数”
【发布时间】:2015-10-07 17:24:27
【问题描述】:

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

这是我正在尝试运行的最简单的程序,

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 文件是由我们正在为课程学习的书提供的,我们不应该修改这个文件。

【问题讨论】:

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

标签: assembly x86 masm


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多