鱼C论坛

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

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

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

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

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

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

先看程序:
assume cs : code 

code segment 
        dw 0110H, 0456H, 1236H, 1478H, 1236H, 2589H, 3698H, 1256H
        
start : mov bx, 0
                
                mov dx, 0
                mov cx, 8
                
        s : add dx, cs : [bx]
                add bx, 2
                
                loop s 
                
                mov ax, 4c00H
                int 21H
code ends 
end start 

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

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

code segment 
        dw 1236H, 1478H, 2589, 1253H, 6985H, 3258H, 1236H, 7895H
        dw 0, 0, 0, 0, 0, 0, 0, 0
        
start : mov ax, cs 
                mov ss, ax 
                mov sp, 32
                
                mov bx, 0
                mov cx, 8
        s : push cs : [bx]
                add bx, 2
                
                loop s 
        
                mov bx, 0
                mov cx, 8
        s0: pop cs : [bx]
                add bx, 0
                
                loop s0 
                
                mov ax, 4c00H
                int 21H
                
code ends 
end start 

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

6.2节  在代码中使用栈

先看代码:
assume cs : code 

code segment 
        dw 1236H, 1478H, 2589, 1253H, 6985H, 3258H, 1236H, 7895H
        dw 0, 0, 0, 0, 0, 0, 0, 0
        
start : mov ax, cs 
                mov ss, ax 
                mov sp, 32
                
                mov bx, 0
                mov cx, 8
        s : push cs : [bx]
                add bx, 2
                
                loop s 
        
                mov bx, 0
                mov cx, 8
        s0: pop cs : [bx]
                add bx, 0
                
                loop s0 
                
                mov ax, 4c00H
                int 21H
                
code ends 
end start 
这里我们将cs:10~cs:19当作内存空间的栈使用,初始状态栈为空,所以ss:sp指向栈低
上面代码可以解释为:先将ss:sp指向栈低,然后将cs:0~15的数据放在栈中,然后将栈中的数据逆序放在cs:0~15的地方

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

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

data segment 
        dw 1478H, 1258H, 3698H, 2587H, 1458H, 3698H, 1258H, 8796H
data 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, 16

                mov ax, data 
                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 

我们不同将全部的数据放在同一个段中,因为对于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-11-25 03:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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