新手简单问题求教Assembly codeassume cs:code, ds:data, ss:stackstack segmentdw 0, 0, 0, 0, 0, 0, 0,
新手简单问题求教
Assembly codeassume cs:code, ds:data, ss:stackstack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack endsdata segment db '1. display ' db '2. brows ' db '3. replace ' db '4. modify ' data endscode segmentstart: mov ax, stack mov ss, ax mov sp, 10h mov ax, data mov ds, ax mov bx, 0 mov cx, 4s: 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 endsend 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.