- 1
- 0
- 约1.3万字
- 约 55页
- 2019-12-13 发布于湖北
- 举报
* 一、完整分段定义伪指令 1. 段定义伪指令 SEGMENT/ENDS ——将程序分成段:代码段,数据段,堆栈段,附加段。 格式: 段名 SEGMENT [定位类型][组合属性][‘类别名’] … (段体) … 段名 ENDS 功能:指出段名和段的各种属性, 并表示段的开始和结束位置。 段定义由伪操作SEGMENT开始、ENDS结束。 其中: SEGMENT 和ENDS 必须成对出现, 且语句前必须有段名,段名必须相同。 SEGMENT和ENDS语句之间可以有指令和其他伪指令, 表示存放在该段内存的变量、指令或其他伪指令对该段内存的处理 程序中可以定义多个段。 程序经汇编、连接及装入内存后,段名为一具体的段值。 合法标识符,有段基地址和段内偏移量两个属性,与某个存储单元相联系。 * (1)定位类型 ——用于告诉链接程序,链接时(各模块.obj) 本段首地址的边界定位方式,常有四种: ① PARA:段的起始地址必须是16的倍数(XXXX0H), 这是一种默认方式。 ② PAGE:段的起始地址必须是256的倍数(XXX00H), 256字节为一页,在页的起点上。 ③ WORD:段的起始地址必须是偶数(XX…0B)。 ④ BYTE:段的起始地址可以是任何地址。 (2) 组合类型—— 在多模块(每个模块有自己的代码段、数 据段、堆栈段)组合时,告诉Link程序本 段与其他模块中同名段的组合链接关系。 * ① NONE: 本段与其他同名段无组合关系,并有自己的段起始 地址,这是一种默认方式。 ② PUBLIC:在满足定位类型的前提下,LINK程序将其与其他 模块中的同名段邻接在一起,共用一个段地址。 ③ STACK: 同PUBLIC 。链接以后作为堆栈段,并自动初始化 SS、SP。若程序中不说明STACK,则必须由用户 在程序的开始处,自己通过语句设置SS、SP。 ④ COMMON:各模块中同名段重叠覆盖,有着相同的起始地 址。段的长度取决于最长的COMMON段。段的 内容为所链接的最后一个模块中COMMON段的 内容。 ⑤ MEMERY:链接在其他所有段的后面(高端存储区 )。若有 多个MEMERY段,则只认第一个,其余按 COMMON处理。 * (3)段字属性 在32位80X86微处理器中,新增加了USE属性说明。对于16位CPU默认的是16位段,即USE 16。而对于汇编32位80X86CPU指令时,它默认采用32位段,即USE 32。但可以使用USE 16指定标准的16位段。若在程序开头使用了.386伪指令(见简化段定义伪指令),缺省类型为32位段字长。注意,在禁止用80386的情况下,使用USE选择项将导致出错。 (4)段类别名属性 类别名可以是任何合法的名字,必须用单引号括起来。在连接处理时,链接程序把类别名相同的所有段存放在连续的存储区内。典型的类别名如:‘DATA’,‘STACK’,‘CODE’。 以上是定位类型、组合类型、段字和类别名四个参数的说明,各参数之间用空格分隔。在选用时,可以只选其中一个或两个参数项,但不能交换它们之间的顺序。 * ORG伪指令和当前位置计数器$ 汇编时将段名填入段表,同时为该段配备一个初值为0的位置计数器$。计数器依次累计段内语句被汇编后生成的目标代码字节个数。可用ORG伪指令把位置计数器$的值设置成需要的值。 在数据段中,ORG后面的数据定义伪指
原创力文档

文档评论(0)