1. 儲存模型偽指令
表4.2.3 MASM 5.0和MASM 6.0支援的儲存模型:
| 儲存模型 |
功 能 |
適用作業系統 |
| Tiny (微型) |
所有資料和代碼都放在一個段內,其訪問都為NEAR型,整個程式≤64K,並會產生.COM檔案。 |
MS-DOS |
| Small (小型) |
所有代碼在一個64KB的段內,所有資料在另一個64KB的段內(包括資料區段,堆棧段和附加段)。 |
MS-DOS Windows |
| Medium (中型) |
所有代碼>64K時可放在多個程式碼片段中,轉移或調用可為FAR型。所有資料限在一個段內,DS可保持不變。 |
MS-DOS Windows |
| Compact(緊湊型) |
所有代碼限在一個段內,轉移或調用可為NEAR型。資料>64K時,可放在多個段中。 |
MS-DOS Windows |
| Large (大型) |
允許程式碼片段和資料區段都可超過64K,被放置在有多個段內,所以資料和代碼都是遠訪問。 |
MS-DOS Windows |
| Huge (巨型) |
單個資料項目可以超過64K,其它同Large模型 |
MS-DOS Windows |
| Flat (平展型) |
所有代碼和資料放置在一個段中,但段地址是32位的,所以整個程式可為4GB。MASM 6.0支援該模型。 |
OS/2 WindowsNT |
注意:Small 模型是一般應用程式最常用的一種模型,因為只有一個程式碼片段和一個資料區段,所以資料和代碼都是近訪問的。這種模型的資料區段是指資料區段、堆棧段和附加段的總和。
在DOS下用組合語言編程時,可根據程式的不同特點選擇前6種模型,一般可以選用SMALL模型。另外,TINY模型將產生COM程式,其他模型產生EXE程式。FLAT模型只能運行在32位x86 CPU上,DOS下不允許使用這種模型。當與進階語言混合編程時,兩者的儲存模型應當一致。
2. 簡化的段偽指令
表4.2.4 簡化段偽指令的格式如下表:
| 簡化段偽指令 |
功 能 |
注釋 |
| .CODE [段名] |
建立一個程式碼片段 |
段名為可選項,如不給出段名,則採用預設段名。對於多個程式碼片段的模型,則應為每個程式碼片段指定段名。 |
| .DATA |
建立一個資料區段 |
段名是:_DATA |
| .DATA? |
建立無初值變數的資料區段 |
段名是:_BSS |
| .FARDATA [段名] |
建立有初值的遠調用資料區段 |
可指定段名,如不指定,則將以FAR_DATA命名。 |
| .FARDATA? [段名] |
建立無初值的遠調用資料區段 |
可指定段名,如不指定,則將以FAR_BSS命名。 |
| .CONST |
建立唯讀常量資料區段 |
段名是:CONST |
| .STACK [大小] |
建立一個堆棧段並指定堆棧段大小 |
段名是:stack。如不指定堆棧段大小,則預設值為1KB |
3.與簡化段定義有關的預定義符號
下面的舉例說明預定義符號的使用方法。在完整的段定義情況下,在程式的一開始,需要用段名裝入資料區段寄存器,如例4.1中的
mov ax,data_seg1
mov ds,ax
若用簡化段定義,則資料區段只用.data來定義,而並未給出段名,此時可用
mov ax,@data
mov ds,ax
這裡預定義符號@data就給出了資料區段的段名。
4.簡化段定義舉例
例4.3
.MODEL SMALL
.STACK 100H ; 定義堆棧段及其大小
.DATA ; 定義資料區段
.
.
.
.CODE ; 定義程式碼片段
START: ; 起始執行地址標號
MOV AX, @DATA ; 資料區段地址
MOV DS, AX ; 存入資料區段寄存器
.
.
.
MOV AX, 4C00H
INT 21H
END START ; 程式結束
從例4.3可以看出,簡化段定義比完整的段定義簡單得多。但由於完整的段定義可以全面地說明段的各種類型與屬性,因此在很多情況下仍需使用它。