简单小问题
为什么我下面的代码从有不在同一段的错误,我是用masm611编译的,同一代码,我用一个集成的编译环境编译就没错,是不是我的masm611有问题,谢谢大家帮忙!
0000 data segment
0000 61 73 64 66 6B 20 str db 'asdfk lio op'
6C 69 6F 20 6F 70
000C = $-str len equ $-str
000C data ends
0000 code segment
assume cs:code,ds:data
0000 start proc far
0000 B8 ---- R mov ax,data
0003 8E D8 mov ds,ax
0005 mov cx,len
aaa.asm(10): error A2025: operands must be in same segment
0005 BE FFFF mov si,-1
0008 B0 20 mov al,20h
0015 next:
0015 46 inc si
0016 3A 84 0000 R cmp al,str[si]
001A E0 F9 loopne next
001C 75 08 jne nfind
001E B2 79 mov dl,'y'
0020 B4 02 mov ah,2
0022 CD 21 int 21h
0024 EB 06 jmp exit
0026 nfind:
0026 B2 6E mov dl,'n'
0028 B4 02 mov ah,2
002A CD 21 int 21h
002C exit:
002C B4 4C mov ah,4ch
002E CD 21 int 21h
0030 CB ret
0031 start endp
0031 code ends
end start
问题点数:20、回复次数:6Top
1 楼zara(Kyrie eleison)回复于 2006-03-15 12:47:17 得分 15
将 len equ $-str 改为 len = $-str 试试Top
2 楼wangshuaiws(宇智波.鼬)回复于 2006-03-15 21:08:35 得分 0
高手很强,果然成功了,但我还是不太明白,这个程序是一本书上的,类似的把数组和字符串长度用 len equ $-str 的用法我在其他书上也见过,而且在初始化阶段我已经用mov ax,data mov ds,ax 把段地址附好了,你怎么这样改就没错了呢?我真的想不通。Top
3 楼zara(Kyrie eleison)回复于 2006-03-15 21:46:00 得分 0
具体实际的原因我也不太清楚. 从表现来看, 可能是不同版本的编译器对 equ 和 = 后面表达式的计算时机不同. 比如在这里, 用 Masm6 的话, equ 是在 mov 时计算的, 这样 $ 在代码段, 而str 却是在数据段, 所以出现不同段的错误; 而 = 应该是在 len 被定义时就已经计算完成了, 那时 $ 和 str 都是在数据段中的Top
4 楼fhb13(游途道标)回复于 2006-03-15 21:57:24 得分 5
编译器问题吧,楼主用6.14试试.
或是用
len equ ($-str)
试试
你的编译器是这样编译的
mov cx,len
转换成如下这个样子
mov cx,$-str
而不是
mov cx,str的数目
Top
5 楼fhb13(游途道标)回复于 2006-03-15 22:00:39 得分 0
我用6.14编译这类的代码没问题
我记得要用equ替换字符是如下这个样子
标号 equ <字符串>Top
6 楼wangshuaiws(宇智波.鼬)回复于 2006-03-15 22:52:12 得分 0
我试了len equ ($-str),还是不行,非常谢谢两位,我会继续好好学汇编的,希望有一天也能象你们一样帮助其他汇编学习者,谢谢!
Top




