首页 > 其他分享 >段的定义

段的定义

时间:2023-05-08 19:15:09浏览次数:43  
标签:定义 组合 伪指令 类型 堆栈 STACK

目录

老是记不住,摘自杨季文老师的《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

标签:定义,组合,伪指令,类型,堆栈,STACK
From: https://www.cnblogs.com/ylc0x01/p/17382837.html

相关文章

  • Android系统中自带的图标&一些预定义样式&参考颜色值
    Android系统中自带了很多图标,我们的程序可以方便使用。Android™1.5android.R.drawableIconResourceshttp://since2006.com/android/1.5-drawables.phpAndroid™1.6android.R.drawableIconResourceshttp://since2006.com/android/1.6-drawables.ph......
  • javasript定义类的几种方法(推荐)
    1.工厂模式functioncreateObject(name,age){varobj=newObject();obj.name=name;obj.age=age;obj.getName=function(){returnthis.name;};obj.getAge=function(){returnthis.age;}returnobj;}varobj2=createObject("王五",19);......
  • vue2自定义组件@click点击失效问题及解决
    1.参照官方文档,可以用@click.native=“click”解决2.$emit组件之间事件传递解决https://www.jb51.net/article/246610.htm......
  • 若依--自定义指令 v-hasPermi 和 v-hasRole
    为什么大家都在用若依?若依版本有很多种,前端的,后端的,大家点击去看看http://doc.ruoyi.vip/,看完记得回来!第一次接触到若依是进入这家公司之后,以前做项目都是“白手起家”,若依项目结构清晰,很多轮子都被造好了,不用自己搭建项目,gitclone就完成了,happy!还有项目文档可以查看,虽然我......
  • C# DataGridView自定义排序
    privatevoiddgvScanFai_SortCompare(objectsender,DataGridViewSortCompareEventArgse){if(e.Column.Name=="Time"){stringcellValue1=e.CellValue1.ToString();stringcellValu......
  • ArcGIS将自己的Python代码作为工具箱或自定义工具
      本文介绍在ArcMap软件中,通过已有的Python脚本程序,建立新的工具箱并在其中设置自定义工具的方法。  通过本文介绍的操作,我们便可以实现将自己的Python代码封装,并像其他ArcGIS已有工具一样,进行界面化的地理处理操作。  话不多说,我们开始具体操作。首先,在ArcMap中打开“ArcT......
  • delphi FastReport 自定义预览窗口显示报表
    FastReport自定义预览窗口显示报表属性和方法TfrxReport.PreviewpropertyPreview:TfrxCustomPreview;指向TfrxPreview组件的链接,在其中显示完成的报表。如果此属性为空,则在标准预览窗口中显示报表。TfrxPreviewTfrxPreview组件是为创建自定义预览窗口而设计的。要显......
  • Springboot 自定义Web容器
    Springboot自定义Web容器如果你的项目并发量比较高,想要修改最大线程数、最大连接数等配置信息,可以通过自定义Web容器的方式,代码如下所示。@SpringBootApplication(proxyBeanMethods=false)publicclassAppimplementsWebServerFactoryCustomizer<ConfigurableServletWebSer......
  • 【web 开发基础】PHP 中数组的定义和使用
    前言在PHP中定义数组非常灵活。与其他许多编程语言中的数组不同,PHP不需要在创建数组时指定数组的大小和类型,甚至无需再使用数组前先行声明,也可以在同一个数组中存储任何类型的数据,PHP支持一维和多维数组,可以由用户创建,也可以由一些特定的数据库处理函数从数据库查询中生成数组,或者......
  • 使用 NutUI 搭建「自定义业务风格」的组件库 | 京东云技术团队
    本文介绍,如何使用NutUI组件库,搭建一套为专属业务风格的业务组件库。NutUI是一款京东风格的移动端组件库。NutUI目前支持Vue和React技术栈,支持Taro多端适配。当下的实现方式一般组件库,都会给用户提供修改主题的方式。比如在NutUI组件库中,给用户提供了两种方式:修改CSS变量,Nu......