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

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

yinx



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

5come5帮你背单词 [ regardless /ri'ga:dlis/ ad. 不管后果;a. 不留心的,不注意的 ]


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 | [楼 主]
silkroad



性别: 帅哥 状态: 该用户目前不在线
头衔: 珍惜青春梦一场 珍惜相聚的时光
等级: 前途无量
家族: 菠韬汹勇
发贴: 5819
威望: 0
浮云: 1592
在线等级:
注册时间: 2005-10-19
最后登陆: 2011-05-23

5come5帮你背单词 [ telegraph /'teligra:f/ n. 电报机;v. 打电报 ]


ASSUME只是个段说明语句 编译通过是因为你后面进行了段初始化
顶端 Posted: 2007-10-29 20:44 | [1 楼]
hhbhhb



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 292
威望: 0
浮云: 1105
在线等级:
注册时间: 2006-09-21
最后登陆: 2009-03-16

5come5帮你背单词 [ criticise // v. 批评,评论,非难 ]


就说说我的理解好了。。……
首先这是个伪指令,就说明它是在汇编过程中起作用的。。事实上我们也确实必须手工设置段寄存器。。
所以ASSUME的作用应该是设置某个符号所默认的段寄存器……
比如后面使用VARX,就会默认用DS,这样。
前面的程序中注释掉也可以用是因为所有的数据都在DATA里,你又把DATA段装入了DS,而汇编默认使用的段寄存器就是DS,所以正常……

以上纯属虚构,本人从来没写过一行汇编。如有雷同纯属巧合……
顶端 Posted: 2007-10-30 20:09 | [2 楼]
再不斩



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1414
威望: 0
浮云: 1413
在线等级:
注册时间: 2005-12-23
最后登陆: 2009-04-26

5come5帮你背单词 [ australia /os'treiljə/ n. 澳大利亚 ]


Quote:
引用第2楼hhbhhb于2007-10-30 20:09发表的  :
就说说我的理解好了。。……
首先这是个伪指令,就说明它是在汇编过程中起作用的。。事实上我们也确实必须手工设置段寄存器。。
所以ASSUME的作用应该是设置某个符号所默认的段寄存器……
比如后面使用VARX,就会默认用DS,这样。
前面的程序中注释掉也可以用是因为所有的数据都在DATA里,你又把DATA段装入了DS,而汇编默认使用的段寄存器就是DS,所以正常……
.......

相当正点。
我听过老师讲过,就是将一个负号对应的地址装入相应的段寄存器。
顶端 Posted: 2007-10-30 22:55 | [3 楼]
yinx



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

5come5帮你背单词 [ yacht /jot/ n. 游艇,快艇 ]


如果我把程序改成这样:
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 | [4 楼]
hhbhhb



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 292
威望: 0
浮云: 1105
在线等级:
注册时间: 2006-09-21
最后登陆: 2009-03-16

5come5帮你背单词 [ senior /'si:njə/ a. 年长的,资格老的,地位高的;n. 长辈,上级,上司 ]


ASSUME CS:CODE,ES:CODE,SS:STACK1
这样估计就挂了。。
顶端 Posted: 2007-10-30 23:14 | [5 楼]
yinx



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

5come5帮你背单词 [ manipulate /mə'nipjuleit/ 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 | [6 楼]
hhbhhb



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 292
威望: 0
浮云: 1105
在线等级:
注册时间: 2006-09-21
最后登陆: 2009-03-16

5come5帮你背单词 [ lovely /'lΛvli/ a. 美丽的,可爱的,有趣的,令人愉快的 ]


不不。。你还是没理解我的意思。。
把寄存器和错误的段关联没关系。。有关系的是把段和错误的寄存器关联。。
这样下面使用VARX的时候就会用到错误的段寄存器。
于是就挂了。。
顶端 Posted: 2007-10-31 09:32 | [7 楼]
yinx



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

5come5帮你背单词 [ frank /fræŋk/ a. 直率的 ]


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 | [8 楼]
hhbhhb



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 292
威望: 0
浮云: 1105
在线等级:
注册时间: 2006-09-21
最后登陆: 2009-03-16

5come5帮你背单词 [ snob /snob/ n. 势利小人 ]


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: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

上面你把数据移到Data段了。。Data段没和任何段寄存器绑定。。于是默认使用DS。。于是还是对的……
就算不移吧。。code段同时还和CS绑定了。。这种情况下用哪个寄存器也不好说。。
试下这个好了。。估计会读到系统提供的某段的内容……
顶端 Posted: 2007-10-31 10:02 | [9 楼]
musant



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 104
威望: 0
浮云: 1122
在线等级:
注册时间: 2006-07-30
最后登陆: 2008-06-19

5come5帮你背单词 [ masculine /'ma:skjulin/ a. 男性的,男子气概的,阳性的 ]


只知道masm32下assume最常用于结构指针赋值
顶端 Posted: 2007-10-31 10:40 | [10 楼]
yinx



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

5come5帮你背单词 [ toss /tos/ vt. 投,扔,抛,使颠簸;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 | [11 楼]
hhbhhb



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 292
威望: 0
浮云: 1105
在线等级:
注册时间: 2006-09-21
最后登陆: 2009-03-16

5come5帮你背单词 [ lukewarm /'lu:kwo:m/ a. (指液体)微温的,不热心的 ]


其实关键是MOV的时候用的是哪个段寄存器……
我觉得并不是DS被assume到哪。。而是那个段被assume到哪个寄存器……
不过既然可以用那我也不知道了……
顶端 Posted: 2007-10-31 13:23 | [12 楼]
ity



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 394
威望: 0
浮云: 1105
在线等级:
注册时间: 2007-06-19
最后登陆: 2008-06-29

5come5帮你背单词 [ truthful /'tru:θful/ a. 真实的,说实话的,诚实的 ]


Quote:
引用第12楼hhbhhb于2007-10-31 13:23发表的  :
其实关键是MOV的时候用的是哪个段寄存器……
我觉得并不是DS被assume到哪。。而是那个段被assume到哪个寄存器……
不过既然可以用那我也不知道了……

你什么时候又跑来这边混了............
顶端 Posted: 2007-10-31 22:30 | [13 楼]
yinx



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

5come5帮你背单词 [ rewrite /'ri:'rait/ vt. & n. 重写,改写 ]


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

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


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

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