汇编学习笔记(14) - 段定义(MASM)
完整的段定义
格式
段名 SEGMENT [定位类型] [组合类型] ['类别']
XXXXXXXXX
段名 ENDS
说明
定位类型
定位类型就是这个段的起始位置的对齐方式,有如下几种
BYTE 没有对齐的要求,随便起始地址是哪里
WORD 起始地址的最后一位是0,即地址是 XXXX XXXX XXXX XXX0
DWORD 起始地址的最后二位是0,即地址是 XXXX XXXX XXXX XX00
PARA 起始地址的最后四位是0,即地址是 XXXX XXXX XXXX 0000
PAGE 起始地址的最后八位是0,即地址是 XXXX XXXX 0000 0000
组合类型
就是遇到名字和类型相同的段的时候他们直接怎么合并,有如下几种
PUBLIC 直接按照顺序拼接在一起,总长度就是所有段加起来的长度
COMMOM 这个就相当于C中的联合体 UNION, 互相重叠在一起,总长度就是最长的那个的长度
STACK 表明这是一个堆栈段,和PUBLIC采用相同的规则,拼接起来
类别
用 ' ' 包起来的一个自定义的字符串,相当于在段名的基础上加了个小标,只有段名和类别都一致才认为是一个段
举例
CSEG SEGMENT BYTE PUBLIC 'DATA'
XXXXXXXXX
CSEG ENDS
其他说明
段组
格式
组名 GROUP 段名1, 段名2
举例
DS1S2 GROUP DSG1, DSG2
说明
每个段寻址的时候都是使用段地址:偏移地址的方式寻址,如果存在多个段,那么在使用的时候就需要频繁的切换段地址 可能是DS寄存器,也可能是ES寄存器,这就很麻烦,使用段组就相当于给这些段起了个总的段地址, 所有段中的变量都可以使用这个总的段地址,
同时原来的段地址也还是可以正常使用的,不有有一下两点注意
1. ASSUME 的 DS必须设置为 组名
ASSUM DS:DS1S2
2. 取地址的时候必须使用如下格式
OFFSET DS1S2 VAR1
简化的段定义
前提
需要使用 .MODEL [类型] 的方式来告知汇编器 程序的存储模型
.MODEL SMALE 程序和数据都不超过64K
.MODEL MEDIUM 数据小于64K 代码不一定
.MODEL COMPACT 代码小于64K 数据数据不一定,但是单个数组肯定小于64K
.MODEL LARGE 代码和数据都可能大于64K,但是单个数组肯定小于64K
.MODEL HUGE 代码和数据都可能大于64K,而单个数组可能也大于64K
.MODEL指令使用的时候相当于同时执行了如下伪指令
DGROUP GROUP DATA,CONST,BSS,STACK
ASSUME CS:_TEXT,DS:DGROUP,SS:DGROUP
简化的段定义
.CODE
代码段的简化定义,遇到下一个段的定义或者遇到END表示该段结束
.STACK [大小]
堆栈段的简化定义,遇到下一个段的定义表示该段结束, 大小表明这个段有多大
.DATA
数据段的简化定义,遇到下一个段的定义表示该段结束
.DATA?
未初始化的数据段的简化定义,遇到下一个段的定义表示该段结束
.CONST
常数段的简化定义,遇到下一个段的定义表示该段结束
.FARDATA [名字]
其他自定义段的简化定义, 名字表示段的名称
例子
.MODEL SMALL
.STACK 1024
.DATA
MESS: DB 'HELLO',0DH,0AH
.CODE
START : MOV AX, DGROUP
MOV DX,AX
MOV DX,OFFSET MESS
MOV AH,9
INT 21H
MOV AX, 4C00H
INT 21H
ASSUME DS:@CODE ;可以手动重设段地址,简化的段名使用@符号引用
END START
函数的导出与引用
说明
汇编程序可以分别汇编多段程序,然后使用LINK程序将它们链接成一个完成程序,它们之后需要使用CALL来互相调用,那么在别写的时候就需要知道其他模块的函数,而本身给别人调用的时候也要告诉别人自己的函数名
PUBLIC
公开自己的函数或者变量
格式
PUBLIC A,B,C
说明
A,B,C 可以是函数名,也可以是变量名
EXTRN
告诉汇编器,这些函数或者变量是在别的模块中定义的
格式
EXTREN 名称:类型
举例
EXTREN PROC1:NEAR,PROC2:FAR
EXTREN VAR1:WORD,VAR2:BYTE
说明
由于链接的时候很能确定两段代码时候能在同一个段中,所以 函数的声明最好永远是使用FAR调用的
程序例子
模块1
.MODEL SMALL
PUBLIC VAR1,VAR2
PUBLIC DELAY
.DATA
VAR1 DW ?
VAR2 DB ?
VAR3 DB 5 DUP (0)
.CODE
DELAY PROC
LAB1: RET
DELAY ENDP
END
模块2
.MODEL SMALL
EXTRN VAR1:WORD,VAR2:BYTE
EXTRN DELAY:FAR
.CODE
START: MOV AX, VAR1
MOV AL, VAR2
CALL FAR PTR DELAY
END SATRT