我正在学习汇编编程语言,并且我已经开始使用宏来缩短我的程序。其中一个宏没有像预期的那样工作。
这是我试图运行的裸骨程序,
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文件是由我们为本课程提供的书提供的,我们不应该修改这个文件。
答案 0 :(得分:4)
shl bx, 4
会导致错误。 80186处理器引入了大于1的移位计数。 MASM默认只接受8086条指令,但您可以指示它接受以后的指令集。
TL; DR:将.186
指令放在源代码的顶部。更好的是.386
。