. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验5(5)(6)  [已解决] 回复[ 3次 ]   点击[ 478次 ]  
fyjava
[帖 主]   [ 发表时间:2009-09-11 02:20 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48
实验5的第5个和第6个实验前面只定义了 assume cs:code 后面不用定义ds ss也可以通过
拿实验5的第6个程序说把 我的理解程序应该写成这样
assume cs:code,ds:a,ss:b
a segment
        dw 1,2,3,4,5,6,7,8
a ends

b segment
        dw 0,0,0,0,0,0,0,0
b ends

code segment
 start: mov ax,a
        mov ds,ax
        mov ax,b
        mov ss,ax
        mov sp,16
        mov bx,0

        mov cx,8
    s:  push [bx]
        add bx,2
        loop s

        mov ax,4c00h
        int 21h
code ends
end start

问题是不用定义ds:a,ss:b程序也没问题 难道说assume 后面定义ds ss都是无所谓的 可以省略 ???
lwbfq
[第1楼]   [ 回复时间:2009-09-11 09:09 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:0
注册日期:2008-01-19 13:58
对于这个程序来说是没有问题,但是对于在a段和b段中使用了标号(后面会讲到)的程序来说,就会出现问题。比如下面的程序:
assume cs:code,ds:a,ss:b
a segment 
       sega dw 1,2,3,4,5,6,7,8 
a ends 

b segment 
       segb dw 0,0,0,0,0,0,0,0 
b ends 

code segment 
 start: mov ax,a 
        mov ds,ax
        mov ax,b
        mov ss,ax
        mov ax,sega[0]
        mov ax,segb[0]
        mov ax,4c00h 
        int 21h 
code ends 
end start 
因为在a段和b段中分别定义了标号sega和segb,此时如果不写入ds:a,ss:b,那么编译是通不过的,也就是说编译器通过assume指令指定标号处所对应的段寄存器,它是与标号密切相关的。通过DEBUG查看,mov ax,sega[0]和mov ax,segb[0]两条指令分别被对应指令mov ax,[0000]和mov ax,ss:[0000],sega对应的段寄存器是DS,segb对应的段寄存器是SS。相反,如果把ds:a,ss:b改为ss:a,ds:b,编译连接后再通过DEBUG查看这两条指令,你就知道assume指令的作用了。

此外assume cs:code指令有时也是可以不写的,什么情况下呢?比如程序中不存在标号,如下:
code segment
mov ax,4c00h
int 21h
code ends
end

通过上面的分析,我们会发现程序通过assume指令指定了与标号相关的段寄存器,因为程序最终会被编译器编译为机器指令,那么如何根据程序中的标号把对应的汇编指令编译为正确的机器指令呢,assume伪指令就是起这个作用的。
------------------------------------------------------------------------------
以上结论都是根据自己的经验总结出来的,至于assume伪指令还有其它什么功能,本人就不太清楚了。
fyjava
[第2楼]   [ 回复时间:2009-09-23 13:59 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48
看懂了,谢谢兄弟
fyjava
[第3楼]   [ 回复时间:2009-11-02 02:04 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48
此贴由 贴主 于 [ 2009-11-02 02:04 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved