新手简单问题求教

ProgrammingRing 2012-01-12 06:24:16

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]就错呢?
...全文
80 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
难得糊涂ha 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 masmaster 的回复:]

加上红字就可以啦, 我用的也是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 19……
[/Quote]i学习了
hili210 2012-01-12
  • 打赏
  • 举报
回复

像:bx + 3 + si

智能一点的可以把 3 + si 的值给si,然后si再与bx相加。

但是根据现在的情况看,编译器是比较死板的,与C语言的赋值运算符相似,楼主可以看成C语言的:bx = 3 = si

很显然,si的值无法给3,


masm6.15 编译器估计也是类似的结合性


不过 5.0 的编译器 使用bx + si + 3也是错误的。


用 MASM6.11 就没有问题


MASM 不断在补,楼主可以多装几个其他的编译器
masmaster 2012-01-12
  • 打赏
  • 举报
回复
加上红字就可以啦, 我用的也是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.

hili210 2012-01-12
  • 打赏
  • 举报
回复

我学过一点编译原理。

masm6.15 可能 智能存储编译 还没有那么高。


估计编译过程是这样的:

如果是:bx + si + 3

那么先算si + 3,得出的值给si,si再与bx相加。


但其他2种情况,比如:bx + 3 + si

先算3 + si,他们相加得出的结果给谁呢?3是常量不是寄存器,而且编译常量的地址是不可以赋值的。

所以他们算出来的中间值无法存放,编译器就认为是错误的。


用的是MASM5.0 ,以及其他公司的编译器都可以试一下,是不同的结果
gsy999 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 programmingring 的回复:]
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 '……
[/Quote]
因为编译器的开发者认为[3 + bx + si]是错的,所以就是错的。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧