码迷,mamicode.com
首页 > 其他好文 > 详细

第六章 包含多个段的程序

时间:2020-05-18 23:06:25      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:多个   分配   中指明   问题:   pop   内容   系统   入口   family   

前面我们写的程序中,只有一个 代码段

现在有一个问题是:

如果程序需要用其他空间来存放数据,我们使用哪里呢?

第5章中,我们讲到要使用一段安全的空间。

我们说0:200~0:300是相对安全的

可是这段空间的容量只有256个字节,如果我们需要的空间超过256个字节,该怎么办呢?

下面我们将以这样的顺序来深入的讨论多个段的问题:

1)在一个段中存放数据、代码、栈,我们先来体会一下不适用多个段时的情况。

2)将数据、代码、栈放入不同的段中。

 

技术图片

 

 

 

技术图片

 

 

 程序第一行中的dw的含义是定义字型数据。dw即define  word。

在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),他们所占的内存空间的大小为16个字节。

由于这8个数据在代码段中,程序在运行的时候CS中存放代码段的段地址,所以我们可以从CS中得到他们的段地址。

这8个数据的偏移地址是多少呢?

因为用dw定义的数据处于代码段的最开始,所以偏移地址为0,这8个数据就在代码段的偏移0、2、4、6、8、A、C、E处。

程序运行时,他们的地址就是CS:0、CS:2、CS:4、CS:6、CS:8、CS:A、CS:C、CS:E

用debug加载后,我们可以将IP设置为10h,从而使CS:IP指向程序中的第一条指令.然后再用T   P   G命令

而我们直接编译连接形成可执行文件后,直接运行会出现问题,因为程序的入口处不是我们所希望执行的指令.

我们可以在源程序中指明程序的入口所在,如下:

技术图片

 

 

 

我们在程序的第一条指令的前面加上了一个标号start,而这个标号在伪指令end的后面出现.

 

探讨end的作用:

end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方.

 

技术图片

 

 

 

 

6.2  在代码段中使用栈

技术图片

 

 

 

 

程序的思路大致如下:

程序运行时,定义的数据存放在cs:0~cs:F单元中,共8个字单元.依次将这8个字单元中的数据入栈,然后再依次出栈到这8个字单元中,从而实现数据的逆序存放.

 

问题是,我们首先要有一段可当作栈的内存空间.如前所述,这段空间应该由系统来分配.我们可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来用.

 

 1 assume cs:codesg
 2 codesg segment
 3     dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
 4     dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0      
 5                 ;用dw定义8个字型数据,在程序加载后,将取得8个字的
 6                     ;内存空间,存放这8个数据。我们在后面的程序中将这段
 7                     ;空间当作栈来使用。
 8   start: mov ax,cs        
 9      mov ss,ax
10      mov sp,30h        ;设置栈顶ss:sp指向cs:30
11 
12      mov bx,0
13      mov cx,8
14       s: push cs:[bx]
15      add bx,2
16      loop s            ;以上将代码段0~15单元中的8个字型数据依次入栈
17 
18      mov bx,0
19      mov cx,8
20      s0: pop cs:[bx]
21      add bx,2
22      loop s0        ;以上依次出栈8个字型数据到代码段0~15单元中
23      mov ax,4c00h
24      int 21h
25 codesg ends
26 end start            ;指明程序的入口在start处

 

注意程序中的指令:

mov ax,cs        
mov ss,ax mov sp,30h
我们要将cs:10~cs:2f的内存空间当作栈来用,初始状态下栈为空,所以ss:sp要指向栈底,则设置ss:sp指向cs:30


6.3 将数据、代码\栈放入不同的段
在前面的内容中,我们在程序中用到了数据和栈,我们将数据\栈和代码都放到了一个段里面.我们在编程的时候要注意何处是数据,何处是栈,何处是代码
这样做显然有两个问题:
1)把他们放到一个
段中使程序显得混乱
2)前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题.
但如果数据\栈和代码需要的空间超过64KB,就不能放在一个段中(一个段的容量不能大于64KB,8086模式是这样),所以我们应该考虑用多个段来存放数据\代码和栈

第六章 包含多个段的程序

标签:多个   分配   中指明   问题:   pop   内容   系统   入口   family   

原文地址:https://www.cnblogs.com/fate-/p/12913209.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!