我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: ASSUME伪指令是干什么用的? 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ inside /in'said/ a. 里面的,内部的;ad. 在内部,在里面;prep. 在…里面,在…内部;内部 ]


ASSUME伪指令是干什么用的?

Copy code
TITLE EXAMPLE PROGRAM
DATA SEGMENT
    VARX DW 15H
    VARY DW 10H
    VARZ DW ?
DATA ENDS
STACK1 SEGMENT PARA STACK
    DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK1
START:    MOV AX,DATA
    MOV DS,AX
    MOV AX,VARX
    SHL AX,1
    ADD AX,VARX
    ADD AX,VARY
    SUB AX,5
    SAR AX,1
    MOV VARZ,AX
    MOV AH,4CH
    INT 21H
CODE ENDS
    END START


这是微机原理与接口课本第150页的例程,
用老师给的Emu8086软件编译通过并运行正确,
我把ASSUME那一行注释掉,还是可以编译通过运行正确。

那么这条伪指令是干什么用的呢?

网上有说是“告诉汇编程序,在程序中,哪些段是当前段,它们分别由哪个段寄存器指向”
但是我把它注释掉之后,编译器仍然知道去哪找数据段哪找代码段啊。
不解
顶端 Posted: 2007-10-29 20:31 | [楼 主]
yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ rosy /'rəuzi/ a. 玫瑰色的,美好的,光明的 ]


如果我把程序改成这样:
Copy code
STACK1 SEGMENT PARA STACK
    DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
    VARX DW 15H
    VARY DW 10H
    VARZ DW ?

    ;ASSUME CS:CODE,DS:CODE,SS:STACK1
START:   
    MOV AX,CODE
    MOV DS,AX
    MOV AX,VARX
    SHL AX,1
    ADD AX,VARX
    ADD AX,VARY
    SUB AX,5
    SAR AX,1
    MOV VARZ,AX
    MOV AH,4CH
    INT 21H
CODE ENDS
    END START

程序也可以正确运行,ASSUME那句话真的要不要都可以~
关键好像是把变量所在的段MOV到DS

我还是没懂ASSUME有什么用
顶端 Posted: 2007-10-30 23:09 | [1 楼]
yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ obstruct /əbs'trΛkt/ vt. 阻塞,阻挡,妨碍 ]


Copy code
TITLE EXAMPLE PROGRAM
DATA SEGMENT
DATA ENDS
STACK1 SEGMENT PARA STACK
    DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
    VARX DW 15H
    VARY DW 10H
    VARZ DW ?

    ASSUME CS:CODE,DS:DATA,SS:STACK1
START:   
    MOV AX,CODE
    MOV DS,AX
    MOV AX,VARX
    SHL AX,1
    ADD AX,VARX
    ADD AX,VARY
    SUB AX,5
    SAR AX,1
    MOV VARZ,AX
    MOV AH,4CH
    INT 21H
CODE ENDS
    END START


又改了一下,我故意用ASSUME把DS指向错误的段,程序还是可以正确运行~读取VARX的值的时候还是15H


可能是因为我用的是Emu8086而不是MASM的原因?当我想用MASM运行这个程序的时候却发现它报个“I:\masm32\yinX\Test\Test.asm(14) : error A2004: symbol type conflict”这样的错误。就是    MOV AX,CODE 那一行。


[ 此贴被yinx在2007-10-30 23:29重新编辑 ]
顶端 Posted: 2007-10-30 23:21 | [2 楼]
yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ comply /kəm'plai/ vi. 遵守,照办 ]


Copy code
TITLE EXAMPLE PROGRAM
DATA SEGMENT
    VARX DW 15H
    VARY DW 10H
    VARZ DW ?
DATA ENDS
STACK1 SEGMENT PARA STACK
    DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
    ASSUME CS:CODE,ES:CODE,SS:STACK1
START:    MOV AX,DATA
    MOV DS,AX
    MOV AX,VARX
    SHL AX,1
    ADD AX,VARX
    ADD AX,VARY
    SUB AX,5
    SAR AX,1
    MOV VARZ,AX
    MOV AH,4CH
    INT 21H
CODE ENDS
    END START



我改成这样之后程序还是没问题……
而且我用WinHex发现ASSUME那句改之前和之后所编译出来的.exe文件是一模一样的,一bit不差。我越来越怀疑是不是我现在用的编译器的问题。

至于MASM不能编译这个程序的原因,我上网查了一下,好像是说我用的版本太高,不能编译这种16位程序。
顶端 Posted: 2007-10-31 09:53 | [3 楼]
yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ adolescent /ædə'lesənt/ a. 青少年的,青春期的;n. 青少年 ]


Quote:
引用第9楼hhbhhb于2007-10-31 10:02发表的  :
[code]
TITLE EXAMPLE PROGRAM
DATA SEGMENT
    VARX DW 15H
    VARY DW 10H
.......


未命名.JPG

好像还是对的……
VARX这个东东在程序中好像就只是被编译成一个偏移量[0000H],与DS被ASSUME到的指向无关……
关键好像是在使用[0000H]这个偏移量之前要先把正确的值MOV到DS
顶端 Posted: 2007-10-31 10:52 | [4 楼]
yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ extract /iks'trækt, 'ekstrækt/ vt. (用力)拔出,抽出,提取,提炼;n. 提出物,精华 ]


Quote:
引用第13楼ity于2007-10-31 22:30发表的  :

你什么时候又跑来这边混了............


程序无国界~~~
连我都在这边混了~
顶端 Posted: 2007-10-31 23:02 | [5 楼]
我来我网·5come5 Forum » 程序员之家

Total 0.010652(s) query 6, Time now is:11-22 21:03, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号