Chinaunix首页 | 论坛 | 博客
  • 博客访问: 226363
  • 博文数量: 45
  • 博客积分: 1850
  • 博客等级: 上尉
  • 技术积分: 473
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-11 10:21
文章分类
文章存档

2006年(17)

2005年(28)

我的朋友

分类:

2006-03-31 19:52:03

整段定义格式的伪指令
1、完整段定义伪指令
完整段定义由SEGMENT和ENDS这一对伪指令实现,格式如下:
段名    segment [定位类型] [组合类型] [段字/寻址方式] ['类别']
    。。。。。
段名    ends
段定义后的4个关键字由来确定段的各种属性,堆栈段要使用stack组合类型,代码段应具有‘code’类别,其他为可选性参数。
(1)定位类型(align)——指定逻辑段在主存储器中的边界,该关键字可为:
BYTE:段开始为下一个可用的字节地址(xxxx xxxxB),属性值为1
WORD:段开始为下一个可用的偶数地址(xxxx xxx0B),属性值为2
DWORD:段开始为下一个可用的4倍数地址(xxxx xx00B),属性值为4
PARA:段开始为下一个可用的节地址(xxxx 0000B),属性值为16
PAGE:段开始为下一个可用的页地址(0000 0000B),属性值为256
完整段定义伪指令的默认定位类型为PARA,其低4位已经是0,所以默认情况下数据段的偏移地址从0开始
(2)组合类型(Combine)——指定多个逻辑段之间的关系。通常,在开发大型程序时,要分成很多模块,然后用连接程序形成一个可执行文件。在其他模块中,可以具有同名或/同类型的逻辑段,通过组合类型属性可以进行合理的合并,组合的关键字有:
PRIVATE:本段与其他段没有逻辑关系,不与其他段合并,每段都有自己的段地址。这是完整段定义伪指令的默认段组合方式。
PUBLIC:连接程序把本段与所有同名同类别的其它段相邻的连接在一起,然后为所有这些段指定一个共同的段地址,即合成一个物理段。这是简化段定义伪指令的默认值。
STACK:本段是堆栈的一部分,连接程序将所有的STACK段按照与PUBLIC段的同样方式进行合并。这是堆栈段必须具有的段组合。
COMMON:连接程序把所有同名同类别的COMMON段指向共同的段地址,因而各段相互重叠,后面的同名同类别段将覆盖前面的段,段的总长度是所有同名段中最长的段所具有的长度,主要用于数据的共享。
AT表达式:把本段定位在表达式的值指定的段地址上,它允许用户强制指定该逻辑段的物理地址,注意他不能用于定位代码段,一般用于访问系统数据(但MASM的连接程序LINK.EXE不支持这种形式)。
MEMORY:连接程序把本段定位在所有段的上面,即程序的最高地址处,如有多个MEMORY段,则遇到的第一个是MEMORY段,其余作COMMON。
(3)段字属性/寻址类型(Use)——这是为32位段设置的属性。对于16位x86CPU默认的是16位段,即USE16,而对于汇编32位x86CPU指令时,默认采用32位段,即USE32,但可以用USE16指定标准的16位段。编写运行于实地址方式(8086工作方式)的汇编语言程序,必须采用16位段。即,对于80386及以上,可以设定为USE16或USE32,代表16位寻址或32位寻址,当处理器是386级以上时,保护模式下缺省为USE32,其它模式为USE16,对于386以下的CPU,不具备32位寻址方式,只能是USE16。
(4)类别(Class)——当连接程序组织段时,将所有的同类别段相邻分配。段类别可以任意命名,但必须位于单引号中,大多数MASM程序使用‘code’、‘data’和‘stack’来分别指示代码段、数据段和堆栈段,以保持所有代码和数据的连续。
2、指定段寄存器伪指令
segment伪指令说明各逻辑段的名字、起始位置及属性,而指定段寄存器ASSUME伪指令是说明各逻辑段的种类,它的格式:
ASSUME 段寄存器:段名 [,段寄存器:段名,。。。]
ASSUME通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系,明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。ASSUME伪指令并不为段寄存器设定初值,连接程序LINK将正确的设置CS:IP和SS:SP,数据段需要在程序中自己设置。
ASSUME伪指令的段名参数,可以是:
(1)以段定义伪指令设置的段名
(2)以group伪指令设置的组名
(3)保留字NOTHING(表示取消指定的段寄存器与段名的关系)
(4)用seg操作符返回的段地址
3、段组伪指令
MASM允许程序员定义多个同类段(代码段、数据段、堆栈段),伪指令GROUP把多个同类段合并为一个64KB物理段,并用一个组名统一存取它,格式:
组名   GROUP  段名 [,段名,...]
定义段组后,段组内各段统一为一个段地址,各段定义的变量和标号的偏移地址相对于段组地址计算。OFFSET操作符取变量和标号相对于段组的偏移地址,如果没有段组则相对于段的偏移地址。OFFSET后可以跟段组中的某个段名,表示该段最后一个字节后面字节相对于段组的偏移地址。
4、段顺序伪指令
在源程序中,通常按照便于阅读的原则或个人习惯书写各个逻辑段,但段在主存中的实际顺序是可以设置的,MASM具有如下伪指令:
.SEG          ;按照源程序的各段顺序
.DOSSEG       ;按照其它微软的程序设计语言使用的标准DOS规定
.ALPHA        ;按照段名的字母顺序
完整段定义格式中,默认按照源程序各段的书写顺序安排(即.SEG),采用.MODEL伪指令简化段定义时,则是.DOSSEG规定的标准DOS程序顺序:代码段、数据段、堆栈段。
阅读(2193) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~