段的定义

老是记不住,摘自杨季文老师的《80X86汇编语言程序设计教程》

段的完整定义

1. 一般格式

完整段定义的一般格式如下:

段名 	SEGMENT [定位类型] [组合类型] ['类别']
	语句
......
段名	ENDS

段开始语句SEGMENT中的可选项定位类型组合类型类别

2. 定位类型

定位类型表示出当前段对起始地址的要求,从而指示连接程序如何衔接相邻两段。

image

一般情况下(80386以下)缺省的定位类型是PARA,即段起始地址位于可用的第一个节(每节为16个字节)的边界处。

3. 组合类型

组合类型就是用于通知连接程序,如何把不同模块内段名相同的段组合到一起。C里面,默认都是PUBLIC

(1) PUBLIC

组合类型PUBLIC表示当前段与其它模块中组合类型为PUBLIC的同名段组合成一个段。

(2) COMMON

组合类型COMMON表示当前段与其它模块中的同名段重叠,即起始地址相同。地址重叠部分,数据会被覆盖

(3) STACK

组合类型STACK表示当前段是堆栈段,组合情况与PUBLIC相同。

当把某个段的组合类型指定为STACK时,这个段就被指定为堆栈段了。也就是说,组合类型STACK不仅是某种组合类型,而且能够表示当前段是堆栈段。

LINK程序会把组合类型为STACK的段的有关信息写入可执行程序文件中。于是在执行该程序时,操作系统的装入程序就能根据这些信息自动设置寄存器SS和SP,从而构成物理堆栈。设置的SS值是组合类型为STACK的段的段值,设置的SP值是堆栈段的大小,即SS:SP指向堆栈尾。

无论在程序中是否说明堆栈段,只要需要,都可通过重置寄存器SS和SP来切换堆栈,从而建立合适的新堆栈。

(4) MEMORY

组合类型MEMORY与组合类型PUBLIC相同,为兼容而设。

(6) PRIVATE

组合类型PRIVATE表示不与其它段组合。宏汇编程序MASM不识别此关键字。

4. 类别

类别用于表示段的分类。LINK程序总是使类别相同的段相邻。实际上只有类别相同的同名段才根据组合类型进行组合。

类别是一个由程序员指定的字符串,但必须用单引号括起。如果一个段没有给出类别,那么这个段的类别就为空。

段的简化定义

1.存储模型说明伪指令

存储模型说明伪指令的简单格式如下:

MODEL	存储模型

注意该伪指令以符号点.引导。例如,为了说明采用SMALL存储模型,只要在源程序首使用如下伪指令:

.MODEL SMALL

到32位CPU后,默认的都是FLAT(平坦)模型,即所有的数据都在一个段内

2.简化的段定义伪指令

(1) 定义代码段的伪指令

定义代码段的伪指令如下,它表示一个代码段的开始:

.CODE

伪指令.CODE说明代码段的开始,伪指令END说明段结束。

简化的段定义伪指令说明一个段的开始,同时也表示上一个段的结束。伪指令END说明最后一个段的结束。

(2) 定义堆栈段的伪指令

定义堆栈段的伪指令一般格式如下,它表示一个堆栈段的开始

.STACK	[大小]

可选的“大小”说明堆栈的字节数,若没有指定堆栈大小,则采用缺省值1024。如下的伪指令就表示定义一个2KB的堆栈。

.STACK 2048

通常只有在编写纯粹的汇编语言程序时才需要定义堆栈。

(3) 定义数据段的伪指令

定义(初始化)数据段的伪指令如下,它表示数据段的开始:

.DATA

2. 缺省段名

在使用简化的段定义伪指令说明各段后,程序员一般不需要知道这些段的段名和它们的定位类型、组合类型等。但如果想把简化的段定义伪指令与标准的段定义伪指令混合使用,那么就需要知道这些内容了。

image

3.存储模型说明伪指令的隐含动作

1.隐含的段组和段设定

存储模型说明伪指令,.MODEL,除了说明程序采用的存储模型外,还起着相当于如下语句的作用:

DGROUP		GROUP DATA,CONST,BSS,STACK
ASSUME 		CS:TEXT,DS:DGROUP,SS:DGROUP

它指示汇编程序把可能有的段_DATA、段CONST、段BSS和段STACK集合成一个名为DGROUP的段组,同时指示汇编程序把数据段寄存器DS和堆栈段寄存器SS与段组DGROUP对应,使代码段寄存器CS与代码段对应。

由于伪指令.MODEL的上述隐含动作,所以在使用伪指令.MODEL后,可以直接引用段组DGROUP,而且多数情况下也可以不使用伪指令ASSUME

2. 有关的预定义符

在上述程序片段中使用的符号@CODE等是汇编程序提供的若干预定义符。它们类似于用伪指令EQU所定义的符号。与简化的段定义伪指令相关的一些预定义符号有:

  1. 符号@CODE表示代码段的段名。
  2. 符号@DATA表示由.DATA段和.STACK段等集合而成段组的组名。
  3. 符号@FARDATA表示独立数据段的段名。

完整定义参数的直观展示

定位类型

byte:使用下一个可用字节的地址

para:使用下一个可用字地址

  • image
  • image

组合类型

pubilc:同名段组合成一个段

common:当前段与其它模块中的同名段重叠,即起始地址相同。地址重叠部分,数据会被覆盖

  • image
  • image

段组

image

posted @ 2023-05-08 18:50  ylc0x01  阅读(412)  评论(0)    收藏  举报