完整的段定義
格式
段名 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