鱼C论坛

 找回密码
 立即注册
查看: 3109|回复: 7

关于实验五(5)的困惑

[复制链接]
发表于 2011-8-21 00:45:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 piggie 于 2011-8-21 00:51 编辑

在论坛看到的这一段代码:  注意红色的字段,第一行是code与代码段关联。那么后面的a,b,c没有关联,他们都在代码段中,段地址应是一样的。那mov ax,a     mov es,ax     mov ax,c      mov ds,ax
是在干什么?a把什么传进了ax,是段地址么?他没有和段关联呀。看了书上的例子,没有这样的。书上的例子都是在一开始都关联好的。困惑,请帮忙解答下。

assume cs:code

a segment

    db 1,2,3,4,5,6,7,8

a ends


b segment

     db 1,2,3,4,5,6,7,8

b ends


c segment

     db 0,0,0,0,0,0,0,0

c ends



code segment

start:mov ax,a

mov es,ax

mov ax,c

mov ds,ax

mov bx,0

mov cx,8



s1:mov ax,es:[bx]

add [bx],ax

add bx,2

loop s1



mov ax,b

mov es,ax

mov ds,ax

mov bx,0

mov cx,8



s2:mov ax,es:[bx]

add [bx],ax

add bx,2

loop s2



mov ax,4c00h

int 21h

code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-21 12:07:10 | 显示全部楼层
我是这么理解的:不是必须关联的。一开始的关联不是很必要。下面a segment 是设立A段的意思,不是在代码段。他们是两个段,B.C也一样,下面必须要mov ax,a 这里的是将A段段地址赋给AX。然后再赋给其他段寄存器。CS段,A段,B段,C段是4个不同的段。段地址不同。

就这个意思。不知道有没有错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-21 12:07:49 | 显示全部楼层
1、王爽书上第90页关于assume的说明:
“这条伪指令的含义是’假设‘。它假设某一段寄存器和程序中的某一个用segment...ends定义的段想关联。通过assume说明这种关联,在需要的情况下,编译程序可以将段寄存器和某一个具体的段相联系。。。“
这段话说得已经很明白了。
2、对于assume cs:code,ds:datasg这样的语句在编译处理过程中并不会被转为机器码,它作为伪指令,它的“关联”仅仅是一种假设。你可以在assume中也写出这样的假设,但因为只是”假设“,所以不写也没关系。而真正实现关联的是:"mov ax,a     mov ds,ax"这个语句。你提到的a段,其标号'a'在编译器编译过程中已经被自动转成了a段的段地址。在编译器读到如下指令时候,完成了对标号a赋值段地址的操作:a segment
  db 1,2,3
a ends
3、上面1、2点应该能解释你的疑问了。至于标号a被转成的段地址的分析,我在关于自定义的段占用内存空间一文里有过说明和个人的理解;可惜没人去看。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-8-21 16:44:58 | 显示全部楼层
本帖最后由 piggie 于 2011-8-21 16:46 编辑

谢谢,有点明白了
其标号'a'在编译器编译过程中已经被自动转成了a段的段地址

,我怎么没看到这样的描述啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-22 10:42:32 | 显示全部楼层
这句话我在书上确实也没见过,只是我自己的判断。。
但我觉得这个判断应该没有问题。。。
首先,可以确定的是mov ax,a这个语句中的a是a段的段地址;这在书上有提过,当然我们也可以通过debug看出来;
其次,涉及‘a'的指令就以下三个:
1、assume ds:a
这句是伪指令,在书上已有说明,只是预先假设;其次这语句出现时候的a还未进行定义;编译器在该语句时候无法定位a.
2、a segment
        db  ...
     a ends
3、mov ax,a
     mov ds,ax
这句只是传输指令,如果编译器在进行到这一步再去赋值a的话,编译器还得重新回到2步去解析。。

所以,只能是在上述2句编译的时候对a进行了赋值。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-9 23:03:10 | 显示全部楼层
我是来看 我是不是VIP的
a b c  他定义的数据 编译器会把a b c 翻译成一个段地址 并不是他存在当前段地址种
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-10 16:11:55 | 显示全部楼层
又是a,b,c段没有定义的问题,这个都是基础,书本有些地方也是错的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-10 16:34:33 | 显示全部楼层
不懂!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 04:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表