当前位置: 代码迷 >> 汇编语言 >> 新手简单有关问题求教
  详细解决方案

新手简单有关问题求教

热度:6254   发布时间:2013-02-26 00:00:00.0
新手简单问题求教
Assembly code
assume 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.

  相关解决方案