鱼C论坛

 找回密码
 立即注册
查看: 2348|回复: 0

[学习笔记] 第六章 包含多个段的程序

[复制链接]
发表于 2017-9-8 22:32:56 | 显示全部楼层 |阅读模式

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

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

x
6.1节  在代码段中使用数据

先看程序:
  1. assume cs : code

  2. code segment
  3.         dw 0110H, 0456H, 1236H, 1478H, 1236H, 2589H, 3698H, 1256H
  4.        
  5. start : mov bx, 0
  6.                
  7.                 mov dx, 0
  8.                 mov cx, 8
  9.                
  10.         s : add dx, cs : [bx]
  11.                 add bx, 2
  12.                
  13.                 loop s
  14.                
  15.                 mov ax, 4c00H
  16.                 int 21H
  17. code ends
  18. end start
复制代码


其中的dw意思是:“define word”,即使用dw定义了8个字型数据,他们所占的空间大小为16个字节

此时千万不用运行程序,因为程序还没有默认CS指向的是定义数据那里开始执行,所以得到的结果也就不正确,想要正常运行就要给出入口的地方。如下代码:
  1. assume cs : code

  2. code segment
  3.         dw 1236H, 1478H, 2589, 1253H, 6985H, 3258H, 1236H, 7895H
  4.         dw 0, 0, 0, 0, 0, 0, 0, 0
  5.        
  6. start : mov ax, cs
  7.                 mov ss, ax
  8.                 mov sp, 32
  9.                
  10.                 mov bx, 0
  11.                 mov cx, 8
  12.         s : push cs : [bx]
  13.                 add bx, 2
  14.                
  15.                 loop s
  16.        
  17.                 mov bx, 0
  18.                 mov cx, 8
  19.         s0: pop cs : [bx]
  20.                 add bx, 0
  21.                
  22.                 loop s0
  23.                
  24.                 mov ax, 4c00H
  25.                 int 21H
  26.                
  27. code ends
  28. end start
复制代码


在程序开始执行的地方有个start标号,在程序结束时也有start,这中的代码表示是要执行的代码,这样程序就不会从定义数据那里开始执行,

6.2节  在代码中使用栈

先看代码:
  1. assume cs : code

  2. code segment
  3.         dw 1236H, 1478H, 2589, 1253H, 6985H, 3258H, 1236H, 7895H
  4.         dw 0, 0, 0, 0, 0, 0, 0, 0
  5.        
  6. start : mov ax, cs
  7.                 mov ss, ax
  8.                 mov sp, 32
  9.                
  10.                 mov bx, 0
  11.                 mov cx, 8
  12.         s : push cs : [bx]
  13.                 add bx, 2
  14.                
  15.                 loop s
  16.        
  17.                 mov bx, 0
  18.                 mov cx, 8
  19.         s0: pop cs : [bx]
  20.                 add bx, 0
  21.                
  22.                 loop s0
  23.                
  24.                 mov ax, 4c00H
  25.                 int 21H
  26.                
  27. code ends
  28. end start
复制代码

这里我们将cs:10~cs:19当作内存空间的栈使用,初始状态栈为空,所以ss:sp指向栈低
上面代码可以解释为:先将ss:sp指向栈低,然后将cs:0~15的数据放在栈中,然后将栈中的数据逆序放在cs:0~15的地方

6.3节  将数据、代码、栈放在不同的段中

下面的代码就是将不同的数据放在不同的段中:
  1. assume cs : code

  2. data segment
  3.         dw 1478H, 1258H, 3698H, 2587H, 1458H, 3698H, 1258H, 8796H
  4. data ends

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

  8. code segment

  9. start : mov ax, stack
  10.                 mov ss, ax
  11.                 mov sp, 16

  12.                 mov ax, data
  13.                 mov ds, ax
  14.                
  15.                 mov bx, 0
  16.                 mov cx, 8
  17.         s : push [bx]
  18.                 add bx, 2
  19.                
  20.                 loop s
  21.                
  22.                 mov bx, 0
  23.                 mov cx, 8
  24.         s0: pop [bx]
  25.                 add bx, 2
  26.                
  27.                 loop s0
  28.                
  29.                 mov ax, 4c00H
  30.                 int 21H
  31.                
  32. code ends
  33. end start
复制代码


我们不同将全部的数据放在同一个段中,因为对于8086CPU来说一个段只能容纳64KB的空间

mov ax, data 就是将在data段的地址放在ax中
mov ax, stack 就是将stack段中的地址放在ax中

其中的data和stack是标号,表示所在段的地址。
这样也是封装的一种思想。

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 09:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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