专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 汇编语言

新手简单有关问题求教

发布时间:2010-06-14 15:51:35 文章来源:www.iduyao.cn 采编人员:星星草
新手简单问题求教
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.

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: