|
主题 : : 谁能告诉我为什么必须要有assume cs:code而可以没有assume ds:data啊 [待解决] |
回复[ 7次 ]
点击[ 806次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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
谁能给我解释一下啊,谢谢了! | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-08-05 09:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
一个程序可以没有数据段,不能没有代码段
cs段地址不是由程序本身决定的,是由装入程序决定的 | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-08-05 11:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48 |
可以查询一下伪指令assume的用法。
到书的最后两章,会用到必须有ds:data,才能让程序正常运行。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-08-05 12:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-13 23:22 |
非常感谢2楼的回答。我昨晚的理解和1楼是一样的。现在看来,问题还没有这么简单。呵呵。。。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-08-05 12:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
我觉得如果用不到数据段就没必要用assume来指明数据段 | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-08-05 16:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-13 23:22 |
回复:[第4楼]
------------------
这是肯定的了。要不然岂不是多此一举了。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-08-05 17:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
回复:[第4楼]
------------------
这是肯定的了。要不然岂不是多此一举了。
------------------
回复:呵呵,看来熟练掌握masm的使用方法也很重要呀 | | |
|
|
|
|
[第7楼]
[ 回复时间:2010-09-09 02:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-08-29 20:25 |
|