同一個程序中,標號或變量只能定義一次.
標號有三種屬性:段、偏移、類型(NEAR PTR,WORD PTR,FAR PRT,DWORD PTR)
一。數值回送操作符:TYPE、LEGNTH、SIZE、OFFSET、SEG
1. TYPE expression_r(or label)
如果表達式是變量,則回送該變量以字節數表示的類型:DB為 1, DW為 2, DD為 4...
如果表達式是標號,則回送該標號類型的數值:NEAR為 -1, FAR為 -2.
如果表達式是常量,則回送0.
array DW A110H,B02CH,C322H
ADD AX, TYPE array 等價於 ADD AX, 2
2. LENGTH variable 對於變量使用DUP的情況,將回送分配給該變量的單元數; 對其它情況則回送1.
fees DW 100 DUP(?)
MOV CX, LEGNTH fees 等價於MOV CX, 100
3. SIZE variable 回送分配給該變量的字節數
MOV CX, SIZE fees 等價於 MOV CX, 200
4. OFFSET variable (or lable) 回送變量或標號的偏移地址.
MOV BX,OFFSET OPER_ONE 等價於 LEA BX,OPER_ONE 語句 ,將OPER_ONE的偏移地址送入BX
5. SEG variable(or lable) 回送變量或標號的段地址.
若OPER_ONE是DATA_SEG數據段中的一個變量,下面語句取得DATA_SEG段首地址
MOV DS , SEG OPER_ONE 等價於
MOV AX , DATA_SEG MOV DS , AX
二。屬性操作符:PTR、THIS、HIGH、LOW、HIGHWORD、LOWWORD
1. type PTR expression 用來給已分配的存儲地址賦予另一種屬性,使該地址具有另一種類型.
表示按expression表達式尋址,按指定的類型type看待.
即PTR是給后面的expression操作數賦予新的數據類型或地址類型.
MOV BYTE PTR[BX] , 5 //存入字節(Byte)單元
MOV WORD PTR[BX] , 5 //存入字(Word)單元
2. THIS type 指定與當前地址計數器相等的一個地址單元的類型.type是NEAR、FAR、PROC,也可以是BYPE、WORD...
first_type EQU THIS BYTE
word_table DW 100 DUP(?) 此時,first_type的偏移地址與word_table完全相同,但它是字節類型
3. HIGH (LOW) express 字節分離操作符, HIGH取高位字節, LOW取低位字節.
HIGHWORD (LOWWORD) express 字分離操作符, HIGHWORD取高位字, LOWWORD取低位字.
CONST EQU 0ABCDH , MOV AH, HIGH CONST 等價於
MOV AH,0ABH
三。數據定義語句:variable_name Mnemonic oper1, oper2.....
常用的助記符Mnemonic有:
DB 定義字節,表示其后每個操作數占有一個字節(1Byte)單元
DW 定義字,表示表示其后每個操作數占有一個字(2Byte)單元
DD 定義雙字,表示表示其后每個操作數占有兩個字(4Byte)單元
DQ 定義四個字,表示表示其后每個操作數占有四個字(8Byte)單元
DT 定義十個字節,表示表示其后每個操作數占有十個字(10Byte)單元,形成壓縮BCD碼.
data_byte DB 10 , 4 , 10H , ? //共定義了4個字節,其中 '?' 是保留單元
data_word DW 100,?,100H //共定義了3個字(6Byte)
str_aa DB 'ABCDEFG' //定義和初始化多於兩個能上能下字符的字符串時,只能使用DB偽指令.
四。符號定義語句(即常量)
name EQU expression //定義
PURGE name1,name2... //解除
CONSTANT EQU 256 //表示CONSTANT的值為256
五。段定義語句:SEGMENT ... ENDS、ASSUME、ORG
segmnet_name SEGMENT [align_type] [combine_type] [use_type] [class]
...
segment_name ENDS //SEGMENT和ENDS成對使用,把匯編語句分成段
對於數據段、附加段和堆棧段,一般是存儲單元定義、初始化數據、分配單元等偽指令.
對於代碼段,主要是指令序列和偽指令.
可選項說明:詳細信息
定位類型align_type:說明段的起始地址就有怎有怎樣的邊界值.
PARA 缺省項. 指定段的起始地址須從小段邊界開始,即以16進表示地址時最低位必須為0.
BYTE 可從任何地址開始.
WORD 必須從字的邊界開始,即段地址必須是偶數..
DWORD 必須從雙字的邊界開始,即以16進制表示地址時最低位必須是4的倍數.
PAGE 必須從頁的邊界開始,即以16時制表示地址時最低兩位必須為00.(能被256整除)
組合類型combine_type:說明程序連接的段合並方法.
PRIVATE 缺省項.為私有段,連接時不與其他模塊中的同名分段合並.
PUBLIC 將與相同名字的其它分段合並.
COMMON 將與相同名字的其它分段合並且會產生覆蓋.
MEMORY 同PUBLIC.
STACK 指定該段在運行時為堆棧的一部分.
使用類型use_type:只適用386及其后繼機型,用來說明是USE16(16位尋址)還是USE32(32位尋址).
類別class:用引號中給出連接時組成段組的類型名.
ASSUME使匯編程序在匯編指令時,能知道各段寄存器的值.
ASSUEM segment_registername : segment_name , segment_registername : segment_name...
任何對存存儲器或堆棧的訪問的指令,都將使用CS、DS、ES和SS段寄存器的值才能形成真正的物理地址.
ASSUME只指定某個段分配給某個寄存器,並不能把段地址裝入段寄存器.
所以,DS、ES、SS段寄存器的值必須通過MOV指令來賦予,CS段寄存器在程序初始化時自動完成.
為了給存儲單元設置起始偏移地址,可以用ORG偽指令.
ORG 表達式 //表達式的值范圍必須在0 ~ +65535
偽指令ORG可設置於代碼段、數據段的任何地方.
mydata SEGMENT //段定義,段名為mydata
ORG 100H //置mydata段的起始偏移地址為100H
X DB 12H , ? , 30H //數據定義,X 的偏移地址為0100H, X+1=0101H, X+2=0102H
Z DD 9C56H //Z的偏移地址為0103H
mydata ENDS
mycode SEGMENT
ASSUME CS : mycode , DS : mydata //用ASSUME偽指令分配段寄存器
start: MOV AX , mydata //等價於MOV AX , SEG X語句, 將mydata段的起始地址裝入到DS
MOV DS , AX
...
mycode ENDS
END start //源程序結束指令END, 其中start為lable
六。過程定義語句:PROC ... ENDP
procedure_name PROC [ NEAR | FAR ] //要說明是NEAR過程或FAR過程.
...
RET //RET 返回指令必須與[ NEAR | FAR ] 對應
procedure_name ENDP //PROC 和ENDP必須有名字,兩者成對出現.
七。宏指令語句:MACRO...ENDM
macro_name MACRO [ parameter_list ] //形參 parameter_list 可選,有多個參數時,中間用逗號隔開.
...
ENDM
MULTIPLY MACRO OPR1 , OPR2 , RESULT //宏定義,宏名MULTIPLY,形參為OPR1,OPR2和RESULT
PUSH DX
PUSH AX
MOV AX , OPR1
IMUL OPR2
MOV RESULT , AX
POP AX
POP DX
ENDM
MULTIPLY 240 , BX , SAVE //宏調用,實參為240 , BX , SAVE
宏指令與子程序的區別:
子程序產生目標代碼少,占用內存少,但執行時間長,速度慢.
宏指令產生目標代碼長,占用內存多,但執行時間短,速度快.
八。程序開始和結束語句:NAME | TITLE、END
模塊名:NAME moudle_name
標題名:TITLE text
源程序結束指令:END [ lable ]
