鱼C论坛

 找回密码
 立即注册
查看: 3133|回复: 4

[已解决]关于多个段的编程

[复制链接]
发表于 2019-11-4 16:24:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 1809228982 于 2019-11-4 16:29 编辑

为什么ds段和ss段需要重新给它赋值呢??

        mov ax, stack
        mov ss, ax
        mov sp, 10h
       
        mov ax, date
        mov ds, ax

一开始不是把    assume ds:date, ss:stack, cs:code    吧地址绑定在一起了吗???

而cs段的就不需要??

为什么cs可以找到地址,而ds,和ss缺找不到呢??
assume ds:date, ss:stack, cs:code

date segment
        dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
date ends

stack segment
        dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends

code segment
                
start:
        mov ax, stack
        mov ss, ax
        mov sp, 10h
        
        mov ax, date
        mov ds, ax
        
        mov bx, 0        
        mov cx, 8
  s:push [bx]
        add bx, 2
          loop s
          
          mov bx, 0
          mov cx, 8
 s0:pop [bx]
         add bx, 2
         loop s0
         
         mov ax, 4c00h
         int 21h
         
code ends

end start
最佳答案
2019-11-4 17:24:55
一個執行檔載入記憶體中運行, 他會從你 end start 的這個start標號開始, 也就是start標號開始翻譯指令, 翻譯到end start為止.
然而你在data segment 中有預設一些資料, 當程式載入記憶體中, 他並不知道你的資料從哪裡開始, 所以你要指定它正確的地址才能找到你預定的資料
stack segment也是一樣, 只是stack 是保留一段空間當棧, 所以你要把他指定到正確的空間當作棧的操作空間
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-4 17:24:55 | 显示全部楼层    本楼为最佳答案   
一個執行檔載入記憶體中運行, 他會從你 end start 的這個start標號開始, 也就是start標號開始翻譯指令, 翻譯到end start為止.
然而你在data segment 中有預設一些資料, 當程式載入記憶體中, 他並不知道你的資料從哪裡開始, 所以你要指定它正確的地址才能找到你預定的資料
stack segment也是一樣, 只是stack 是保留一段空間當棧, 所以你要把他指定到正確的空間當作棧的操作空間
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-6 09:07:46 | 显示全部楼层
kikiatw 发表于 2019-11-4 17:24
一個執行檔載入記憶體中運行, 他會從你 end start 的這個start標號開始, 也就是start標號開始翻譯指令, 翻 ...


那是不是说CS段的地址其实是由系统自动分配的,程序一载入就已经分配了的。而ds和ss则需要程序员手动分配地址??
当我把start去掉之后 debug程序,用G命令跳转到代码的部分,cs的值依旧是刚载入程序的那样。
assume ds:date, ss:stack, cs:code

date segment
        dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
date ends

stack segment
        dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends

code segment
                

        mov ax, stack
        mov ss, ax
        mov sp, 10h
        
        mov ax, date
        mov ds, ax
        
        mov bx, 0        
        mov cx, 8
  s:push [bx]
        add bx, 2
          loop s
          
          mov bx, 0
          mov cx, 8
 s0:pop [bx]
         add bx, 2
         loop s0
         
         mov ax, 4c00h
         int 21h
         
code ends

end 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 09:24:41 | 显示全部楼层
如果把START標號去除, 他會從Code segment開始
如果此時沒有 start標號, 而且你在code segment 定義變量, 他會從變量開始
小甲魚視頻你看到後面就會說到這個了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-6 09:34:45 | 显示全部楼层
kikiatw 发表于 2019-11-6 09:24
如果把START標號去除, 他會從Code segment開始
如果此時沒有 start標號, 而且你在code segment 定義變量,  ...

好的,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-5 12:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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