- Assembly code
assume cs:code, ds:data, ss:stack stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends data segment db '1. display ' db '2. brows ' db '3. replace ' db '4. modify ' data ends code segment start: mov ax, stack mov ss, ax mov sp, 10h mov ax, data mov ds, ax mov bx, 0 mov cx, 4 s: push cx mov si, 0 mov cx, 4 s0: mov al, [bx + 3 + si] // 这里 and al, 11011111b mov [bx + 3 + si], al // 这里 inc si loop s0 pop cx add bx, 10h loop s mov ax, 4c00h int 21h code ends end start
用masm6.15编译出错,提示error A2070: invalid instruction operands
为什么那两个改成[bx + si + 3]就没事,写成[3 + bx + si]或[bx + 3 + si]就错呢?
------解决方案--------------------
我学过一点编译原理。
masm6.15 可能 智能存储编译 还没有那么高。
估计编译过程是这样的:
如果是:bx + si + 3
那么先算si + 3,得出的值给si,si再与bx相加。
但其他2种情况,比如:bx + 3 + si
先算3 + si,他们相加得出的结果给谁呢?3是常量不是寄存器,而且编译常量的地址是不可以赋值的。
所以他们算出来的中间值无法存放,编译器就认为是错误的。
用的是MASM5.0 ,以及其他公司的编译器都可以试一下,是不同的结果
------解决方案--------------------
加上红字就可以啦, 我用的也是masm6.15
mov al, byte ptr [bx + 3 + si]
mov byte ptr [bx + 3 + si], al
d:\masm>bin\ml /?
Microsoft (R) Macro Assembler Version 6.15.8803
Copyright (C) Microsoft Corp 1981-2000. All rights reserved.