汇编学习笔记50
二、段的簡化定義
新版匯編語言提供了段的簡化定義方法,從而使程序員可以方便地定義段。
無論是編寫獨立的匯編語言程序還是編寫供高級語言程序調用的函數,簡化的段定義偽指令幾乎總是使程序設計更容易。
本節介紹段的簡化定義
(一) 存儲類型說明偽指令
? 在程序員使用段簡化定義偽指令之前,必須首先使用存儲類型說明偽指令描述程序采用的存儲類型。
? 存儲類型說明偽指令的格式如下:
? .MODEL 存儲模型
? 常用的存儲模型有:
(1) SMALL (小型模型)
? 全部數據限制在單個64KB段內,全部代碼也限制在單個64KB段內,這是獨立的匯編語言程序最常用的模型。在這種存儲模型下,數據段寄存器可保持不變,所有轉移均可變為是段間轉移。
(2) MIDDLE (中型模型)
? 全部數據限制在單個64K段內,但代碼可大于64KB,在這種存儲模型下,數據段寄存器可保持不變,但會出現段間轉移情形。
(3) COMPACT (緊湊模型)
? 全部代碼限制在單個64KB段內,數據總量可大于64KB,但一個數組不能大于64KB
(4) LARGE (大型模型)
? 代碼可超過64KB,數據也可以超過64KB,但一個數組不能大于64KB。
(5) HUGE (巨型模型)
? 代碼可超過64KB,數據也可以超過64KB,并且一個數組也能大于64KB.
獨立的匯編程序可選用任一種存儲類型,對大多數完全用匯編語言編寫的程序來說,小(SMALL)模型就足夠了。
(二) 簡化段定義偽指令
1. 簡化的段定義偽指令
簡化的段定義偽指令均以符號點引導。
常用的簡化段定義偽:
(1)代碼段簡化定義偽指令
.CODE
例1:
寫一個使系統喇叭發出嘟的一聲的程序
.MODEL SMALL
.CODE
START: MOV DL, 7
MOV AH, 2
INT 21H
MOV AX, 4C00H
INT 21H
END START?? ; 結束代碼段
偽指令.CODE說明代碼段的開始,偽指令END說明段結束。
簡化段定義偽指令說明一個段的開始,同時也表示上一個段的結束,偽指令END說明是一個段的結束。
(2) 定義堆棧段偽指令
.STACK [大小]
它表示一個堆棧段開始,若沒有指令堆棧段的大小,則采用缺省值1024
(3) 定義數據段的偽指令
.DATA
例2:
如下偽指令定義了一個數據段
.DATA
VAR3 DB 5
LARRAY DW 50DUP( 0 )
MESS DB 'HELLO', 0DH, 0AH, '$'
例3:
增加一個大小為1024字節的堆棧段
.MODEL SMALL
.STACK 1024
.DATA
MESS DB 'HELLO' 0DH, 0AH, '$'
.CODE
START: MOV AX, DGROUP
MOV DS, AX
MOV DX, OFFSET MESS
MOV AH, 9
INT 21H
MOV AH, 4C00H
INT 21H
END START
在一個源程序模塊中可定義多個由偽指令.DATA開始的數據段,如同在一個源程序模塊中定義多個同名的數據段
(4) 定義遠程(獨立)數據段指令
定義獨立數據段偽指令的一般格式如下:
它表示一個獨立數據段的開始
.FARDATA [名字]
名字是可選項,如果使用,則設成該數據段的段名
例: 如下偽指令定義了一個獨立數據段
.FARDATA
BUFF DB 1024(?)
此外,還有偽指令.DATA?和偽指令.CONST, .FARDATA?等。它們分別用于說明未初始化數據段的開始和常規數據的開始,未初始化的獨立數據段,在編寫純粹的匯編語言程序時,一般不使用這些偽指令
2. 有關的預定義符
在上述程序片斷中使用符號@CODE等是匯編程序提供的若干騎了定義符,它們類似于用偽指令EQU所定義的符號。
與簡化的段定義偽指令相關的一些預定義符號有:
(1) 符號@CODE表示代碼段的段名
(2) 符號@DATA表示DATA段和STACK段等集合而成的段組的組名
(3) 符號@FARDATA表示獨立數據段的段名
轉載于:https://www.cnblogs.com/hailong/archive/2011/01/27/1946457.html
總結
- 上一篇: SET QUERY_GOVERNOR_C
- 下一篇: 关于《红泰昌 TC-2015B》严重漏电