酒鬼 发表于 2015-6-21 12:24:02

为何需要 自己主动将 datasg赋值给ds 而cs则不用??

assume cs:codesg,ds:datasg

datasg segment
        db 8 dup(2)
datasg ends



codesg segment
        Start:
                mov ax,datasg
                mov ds,datasg       
               
codesg ends

        end Start

请问各位一个小问题

为何 程序一开始执行时 ds的值不是等於 datasg
而是必須要
mov ax,datasg
mov ds,datasg       
這樣子才行

但是 同樣在assume那裡假設過的 codesg
程序一开始执行时,cs就是等於codesg了
不必再做赋值的动作

为何??


you_shou 发表于 2015-6-21 22:28:58

因为程序执行的入口是start啊,程序编译时cs:ip会指向它。code段才是机器硬指令,其他段都是编译器翻译的

酒鬼 发表于 2015-6-22 08:58:39

you_shou 发表于 2015-6-21 22:28
因为程序执行的入口是start啊,程序编译时cs:ip会指向它。code段才是机器硬指令,其他段都是编译器翻译的

那请问一下

assume的功用是啥么啊??

我看书本里面,有時有打出

datasg segment
      
datasg ends

但在assume卻沒假設 ds:datasg

但还是依然能执行

所以我想问一说 assume的功用那底是啥??

you_shou 发表于 2015-6-23 12:44:19

酒鬼 发表于 2015-6-22 08:58
那请问一下

assume的功用是啥么啊??


网上找的:编写汇编语言的程序,要用编译软件来编译。

assume,就是通知编译软件的,说明段寄存器和定义段的关系。

编译软件,比较弱智,你随便瞎写一个对应关系,它都辨别不出来真假。

程序正确与否,全靠 MOV...这种针对 CPU 的指令,和 ASSUME 基本无关。

就不用琢磨它了。

792257079 发表于 2015-7-30 20:20:34

assume cs:codesg,ds:datasg是给编译器看的
mov才是汇编指令,才是给cpu看得
页: [1]
查看完整版本: 为何需要 自己主动将 datasg赋值给ds 而cs则不用??