首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

新手简单有关问题求教

2012-02-08 
新手简单问题求教Assembly codeassume cs:code, ds:data, ss:stackstack segmentdw 0, 0, 0, 0, 0, 0, 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.

热点排行