我正在学习汇编编程语言,并且我已经开始使用宏来缩短我的程序。宏之一未按预期工作。
这是我试图运行的裸骨程序,
include pcmac.inc
.model small
.stack 100h
.data
.code
Hello PROC
_Begin ;Line 12
_Exit 0
Hello ENDP
END Hello
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时,我收到以下错误,
file.asm(12) : error A2070 : invalid instruction operands
_Begin(5) : Macro Called From
file.asm(12): Main Line Code
Run Code Online (Sandbox Code Playgroud)
如果我用_Begin原始汇编代码替换宏,程序会按预期工作,
mov ax, @data
mov ds, ax
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么_Begin宏不起作用,错误是什么意思?
我在 iMac 上的 Windows 8 上使用 masm。
编辑:
我刚刚发现,如果我在_Begin宏中注释掉以下行,程序就可以工作。
shl bx, 4
Run Code Online (Sandbox Code Playgroud)
但是这个 PCMAC.INC 文件是由我们为课程所遵循的书提供的,我们不应该修改这个文件。
shl bx, 4导致错误。80186 处理器引入了移位计数大于 1 的移位。MASM 默认仅接受 8086 条指令,但您可以指示它接受以后的指令集。
TL;DR:.186在源代码的顶部放置一个指令。更好的是.386。
| 归档时间: |
|
| 查看次数: |
1275 次 |
| 最近记录: |