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

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

yinx



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

5come5帮你背单词 [ wrench /rent/ n. 扳手 ]


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



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

5come5帮你背单词 [ license /'laisəns/ n. 执照,许可证,许可,特许;vt. 批准,发给…执照 ]


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

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



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

5come5帮你背单词 [ documentary /dokju'mentəri/ a. 公文的,文件的;n. 记录片 ]


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



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

5come5帮你背单词 [ clothes /kləuðz/ n. 衣服 ]


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



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

5come5帮你背单词 [ brain /brein/ 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 | [4 楼]
hhbhhb



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

5come5帮你背单词 [ splash /splæ/ vi. 泼;溅落,飞溅;n. 溅泼(声),飞溅(声) ]


其实关键是MOV的时候用的是哪个段寄存器……
我觉得并不是DS被assume到哪。。而是那个段被assume到哪个寄存器……
不过既然可以用那我也不知道了……
顶端 Posted: 2007-10-31 13:23 | [5 楼]
我来我网·5come5 Forum » 程序员之家

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