池子 发表于 2011-11-5 10:16:44

关于assume cs:code,ds:data,ss.stack的一点问题

我知道伪指令是编译器用来认识的,可是cpu已经通过指令 mov ax,datamov ds,datamov ax,stack
mov ss,ax指定的各个指定的段与相应的段联系起来 ,可编译器为什么还要通过题目的伪指令将他们联系起来?

z310394543 发表于 2011-11-5 10:26:09

ever.g 发表于 2011-11-5 13:11:31

:L 不知道 假设嘛。。
我直接不用assume

开始就code segment 都正常编译运行调试

kane080824 发表于 2011-11-7 05:05:17

本帖最后由 kane080824 于 2011-11-7 05:07 编辑

我打个比喻吧:比如电脑是你的一个佣人,你呢又很懒,有天回家对佣人说,我将要写作业你把准备工作给我做好,给我找定一个写作业的桌子(即在内存里开辟出数据段或栈段等等),然后上面给我放好课本,笔,作业本等等(段中的数据),这些做好后,你就可以开始写作业了.
回过头来说,assume ds:data,data segment db ...ends的含义是:让计算机做好准备工作,让它给你开辟一段内存空间,里面预先放好数据,并且告诉它,你给我指定的这个段的段地址以后是要保存在ds里面的.
于是你开始写作业了,中途你会去倒点水喝或者出去放松下,为了防止自己回来找不到写字桌,你就干脆把地址保存起来,于是(mov ax,datamov ds,ax),这样你来回n次寻你的工作区,你都能找到,这是你自己要做的事,不是佣人做的,所以在源程序里面要先写这两句,而assume ...这些不用你操心,是编译器让计算机预先处理的(当然也是你让编译器做滴,但他不在你的工作内容中,是佣人的工作而已,所以不位于程序里面),你要做的就是刚开始就保存一下段地址,这个段地址是多少由佣人提供的,但保存是需要你自己保存的,保存在哪里也是你自己定的,因为你一开始就告诉assume ds:data,意思是对佣人说,以后我要保存地址是保存在ds里,如果我弄错了,你就提醒我一下,佣人的作用是提示你data地址和ds保存的对应关系而已
有天你良心发现,勤快了,对佣人说你休息下,准备工作我自己做了,于是乎:mov ax,2000Hmov ds,ax... 就直接热火朝天干起来了,因为佣人休息了,所以你只好自己给出桌子的位置,比如段地址2000H,然后照例保存段地址在ds中,可是笔,书本什么的还没没有,咋办,那还用说,开始给数据吧,比如mov bx,0
    mov word ptr .0,0BEH
    mov word ptr .2,6h
    mov word ptr .4,0   -   ----给段内赋一些数据等价于dw BE,00,06,00,00,00

这样你的桌子上就有东西了,即段中就有了数据,那么这些工作本来不就是assume....事先做的吗

为了说明问题,罗素很多,不知道大概意思是否理解,当然一般还是建议用编译器做预处理,好处多多.
本人是新手,说错了莫怪

池子 发表于 2011-11-7 11:17:08

kane080824 发表于 2011-11-7 05:05 static/image/common/back.gif
我打个比喻吧:比如电脑是你的一个佣人,你呢又很懒,有天回家对佣人说,我将要写作业你把准备工作给我做好,给我 ...

非常感谢,明白了!以后多多交流 。

cyht33 发表于 2011-11-9 11:21:14

kane080824 发表于 2011-11-7 05:05 static/image/common/back.gif
我打个比喻吧:比如电脑是你的一个佣人,你呢又很懒,有天回家对佣人说,我将要写作业你把准备工作给我做好,给我 ...

顶一下,比喻很生动
页: [1]
查看完整版本: 关于assume cs:code,ds:data,ss.stack的一点问题