. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  谁能告诉我为什么必须要有assume cs:code而可以没有assume ds:data啊  [待解决] 回复[ 7次 ]   点击[ 806次 ]  
sleepinglion
[帖 主]   [ 发表时间:2010-08-04 22:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-13 23:22
谁能告诉我为什么必须要有assume cs:code而可以没有assume ds:data啊。比如下面的程序:
assume cs:code
data segment
        db 'conversation',0
data ends

code segment
start:
        mov ax,data
        mov ds,ax
        mov bx,0
        
        mov cx,4
s:        mov si,bx
        call capital
        add bx,5
        loop s
        
        mov ax,4c00h
        int 21h
capital:
        push cx
        push si
change:        
        mov cl,[si]
        mov ch,0
        jcxz ok
        and byte ptr [si],11011111b
        inc si
        jmp short change

ok:        pop si
        pop cx
        ret
code ends
end start

C:\>masm 2
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987.  All rights reserved.

Object filename [2.OBJ]:
Source listing  [NUL.LST]:
Cross-reference [NUL.CRF]:
2.ASM(7): error A2062: Missing or unreachable CS
2.ASM(13): error A2062: Missing or unreachable CS
2.ASM(20): error A2062: Missing or unreachable CS
2.ASM(23): error A2062: Missing or unreachable CS
2.ASM(31): error A2062: Missing or unreachable CS

  50268 + 449956 Bytes symbol space free

      0 Warning Errors
      5 Severe  Errors
没有assume cs:code编译的时候就会出现错误。而没有assume ds:data为什么就可以呢?怎么说程序都要用到code和data段的啊。
而且,assume cs:code只是假设某一段寄存器和程序中的code段相关联,cpu并不会将cs指向code的,为什么不要加mov ax,code mov cs:ax呢?如果说可以没有assume ds:data是因为后面有mov ax,data      mov ds,ax 那么为什么我改成下面的程序,编译仍然会出错呢?
data segment
        db 'conversation',0
data ends

code segment
start:
        mov ax,code
        mov cs,ax
        mov ax,data
        mov ds,ax
        mov bx,0
        
        mov cx,4
s:        mov si,bx
        call capital
        add bx,5
        loop s
        
        mov ax,4c00h
        int 21h
capital:
        push cx
        push si
change:        
        mov cl,[si]
        mov ch,0
        jcxz ok
        and byte ptr [si],11011111b
        inc si
        jmp short change

ok:        pop si
        pop cx
        ret
code ends
end start
C:\>masm 2
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987.  All rights reserved.

Object filename [2.OBJ]:
Source listing  [NUL.LST]:
Cross-reference [NUL.CRF]:
2.ASM(6): error A2062: Missing or unreachable CS
2.ASM(8): error A2059: Illegal use of CS register
2.ASM(14): error A2062: Missing or unreachable CS
2.ASM(21): error A2062: Missing or unreachable CS
2.ASM(24): error A2062: Missing or unreachable CS
2.ASM(32): error A2062: Missing or unreachable CS

  50268 + 449956 Bytes symbol space free

      0 Warning Errors
      6 Severe  Errors
谁能给我解释一下啊,谢谢了!
masmaster
[第1楼]   [ 回复时间:2010-08-05 09:26 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
一个程序可以没有数据段,不能没有代码段
cs段地址不是由程序本身决定的,是由装入程序决定的
mess
[第2楼]   [ 回复时间:2010-08-05 11:33 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
可以查询一下伪指令assume的用法。

到书的最后两章,会用到必须有ds:data,才能让程序正常运行。
sleepinglion
[第3楼]   [ 回复时间:2010-08-05 12:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-13 23:22
非常感谢2楼的回答。我昨晚的理解和1楼是一样的。现在看来,问题还没有这么简单。呵呵。。。
masmaster
[第4楼]   [ 回复时间:2010-08-05 12:22 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
我觉得如果用不到数据段就没必要用assume来指明数据段
sleepinglion
[第5楼]   [ 回复时间:2010-08-05 16:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-13 23:22
回复:[第4楼]
------------------
这是肯定的了。要不然岂不是多此一举了。
masmaster
[第6楼]   [ 回复时间:2010-08-05 17:17 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
回复:[第4楼]
------------------
这是肯定的了。要不然岂不是多此一举了。
------------------
回复:呵呵,看来熟练掌握masm的使用方法也很重要呀
elsewherelife
[第7楼]   [ 回复时间:2010-09-09 02:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-08-29 20:25
cs是不能用move的,只能用jmp等转移指令。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved