鱼C论坛

 找回密码
 立即注册
查看: 3871|回复: 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缺找不到呢??

  1. assume ds:date, ss:stack, cs:code

  2. date segment
  3.         dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
  4. date ends

  5. stack segment
  6.         dw 0, 0, 0, 0, 0, 0, 0, 0
  7. stack ends

  8. code segment
  9.                
  10. start:
  11.         mov ax, stack
  12.         mov ss, ax
  13.         mov sp, 10h
  14.        
  15.         mov ax, date
  16.         mov ds, ax
  17.        
  18.         mov bx, 0       
  19.         mov cx, 8
  20.   s:push [bx]
  21.         add bx, 2
  22.           loop s
  23.          
  24.           mov bx, 0
  25.           mov cx, 8
  26. s0:pop [bx]
  27.         add bx, 2
  28.         loop s0
  29.        
  30.         mov ax, 4c00h
  31.         int 21h
  32.        
  33. code ends

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

使用道具 举报

发表于 2019-11-4 17:24:55 | 显示全部楼层    本楼为最佳答案   
一個執行檔載入記憶體中運行, 他會從你 end start 的這個start標號開始, 也就是start標號開始翻譯指令, 翻譯到end start為止.
然而你在data segment 中有預設一些資料, 當程式載入記憶體中, 他並不知道你的資料從哪裡開始, 所以你要指定它正確的地址才能找到你預定的資料
stack segment也是一樣, 只是stack 是保留一段空間當棧, 所以你要把他指定到正確的空間當作棧的操作空間
小甲鱼最新课程 -> https://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的值依旧是刚载入程序的那样。
  1. assume ds:date, ss:stack, cs:code

  2. date segment
  3.         dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
  4. date ends

  5. stack segment
  6.         dw 0, 0, 0, 0, 0, 0, 0, 0
  7. stack ends

  8. code segment
  9.                

  10.         mov ax, stack
  11.         mov ss, ax
  12.         mov sp, 10h
  13.        
  14.         mov ax, date
  15.         mov ds, ax
  16.        
  17.         mov bx, 0       
  18.         mov cx, 8
  19.   s:push [bx]
  20.         add bx, 2
  21.           loop s
  22.          
  23.           mov bx, 0
  24.           mov cx, 8
  25. s0:pop [bx]
  26.         add bx, 2
  27.         loop s0
  28.        
  29.         mov ax, 4c00h
  30.         int 21h
  31.        
  32. code ends

  33. end
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

好的,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 19:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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