計算機匯編語言的一個突出優點就是利用符號(Symbol)來代替目標碼,也即大量的二進制代碼用符號來表示,使匯編語言源程序容易理解,便於記憶.
在宏匯編語言中所有變量名、標號名、記錄名、指令助記符和寄存器名等統稱符號.這些符號可通過匯編控制語句的偽操作命令重新命名,也可以通過指令給它定義其它名字及新的類型屬性,因而給程序設計帶來很大的靈活性.符號是程序員在程序中用來代表某個存儲單元、數據、表達式和名字等所定義的標識符,可分為寄存器、標號、變量、數字、名字五類.
匯編語句形式:
START: ADD AX,BUFFER
DATA SEGMENT
BUFFER DB 01H, 02H
DATA ENDS
JMP START其中START,BUFFER,DATA均為符號,它們分別表示標號,變量名,段名,它們具有完全不同的特定含意.
標號
標號(LABEL)是為一組機器指令所起的名字.標號可有可無,只有當需要用符號地址來訪問該語句時,才給此語句賦予標號.標號是程序的目標標志,總是和某地址相聯系,供轉移或循環指令控制轉移使用.
2 1 標號的屬性
因標號表示的是指令地址,所以它有三個屬性,即段屬性、偏移屬性和類型屬性.段屬性即段地址,標號的段必須在CS中.偏移屬性是表示該標號到段首地址的距離,單位是字節,是16位無符號整數.類型屬性是距離屬性,指標號和轉移指令的距離,該標號在本段內引用,距離在-128~+127之間時稱短標號,距離屬性為SHORT,當標號在本段,距離在-32768~+32767之間時稱近標號,距離屬性為NEAT,當引用標號的指令和標號不在同一段時稱遠標號,距離屬性為FAR.
2 2 標號的定義
標號的定義有三種方法:
2 2 1 隱含說明標號距離屬性為SHORT和NEAR的標號可以使用隱含說明,即在代碼段中定義,標識符後加冒號,放在一條匯編指令的操作符前面.例:
NEXT: MOV AX,BX
----------
LOOP NEXT
- - - - - - - - -
NEXT1: CMP AX,BX
JA NEXT1
其中NEXT和NEXT1都是標號名.
2 2 2 用LABEL定義標號
對於屬性為NEAR和FAR的標號均可以用這種定義.格式是:
標號名 LABEL NEAR/FAR
例如:NEXT LABEL NEAR/FAR
- - - - - - - - -
LOOP NEXT
2 2 3 用EQU定義標號
對於屬性為NEAR和FAR的標號也可用EQU定義.格式是:
標號名 EQU THIS NEAT/FAR
例如:
NEXT EQU THIS NEAR
- - - - - - - - -
LOOP NEXT
2 3 標號的使用
2 3 1 無條件轉移指令中標號作為轉移地址
格式:
JMP 標號
其中標號可以是短標號,近標號或遠標號
. 2 3 2 循環指令中,標號作為轉移地址
格式:LOOP 標號
其中標號只能是短標號
2 3 3 條件轉移中標號作為轉移地址
格式:
條件轉移指令 標號
其中標號只能用短標號
2 3 4 屬性分離符
2 .3. 4. 1 取段地址算符SEG
例如:MOV AX,SEG NEXT
SEG NEXT 就是取標號NEXT所在段的段地址.
2 3 4 2 取偏移量算符OFFSET
例如:MOV BX, OFFSET NEX
其中OFFSET NEXT就是取標號NEXT的有效地址,該語句等效於:LEA BX, NEXT
2 3 4 3 取類型算符TYPE
例如:
MOV AX, TYPE NEXT
若NEXT為近標號,則TYPE NEXT值為FFFFH(-1),若NEXT為遠標號TYPE NEXT值為FFFEH(-2).其中-1和-2無真正的物理意義,僅以數值表示標號類型而已.
變量
變量(Variable)代表存放在某些存儲單元的數據,這些數據在程序運行期間可以隨時被修改.變量是通過變量名在程序中引用,變量名實際上是存儲區中一個數據區的名字,以變量名數據的方式供程序員使用,作為指令或偽.指令的操作數,大大方便了程序設計者.
由於變量是在邏輯段中定義.這就決定了變量和標號一樣具有段屬性、偏移屬性和類型屬性,前兩個和標號的屬性相同,而類型屬性是指出數據區的數據項的存取單位是字節(BYTE),字(WORD)或數字(DWORD)等.可見變量和標號的主要區別在於變量指的是數據,而標號則對應的是指令
.3 1 變量的定義
變量通常也有三種定義法
.3 1 1 用偽指令DB,DW,DD等來定義
格式:[變量名] 定義數據偽指令〈表達式〉
其中變量名可有可無,若沒有名字則該變量為無名變量.表達式可以是常數、保留符號"?"、ASCII碼字符串(只能用DB定義)、地址表達式(不能用DB定義)、預置數據表格和用DUP定義的重復值.變量名可在任一邏輯段中定義,其後邊不緊跟冒號而是加一空格
.例如:A DB 100;A為一個字節,值為100.
B DB 100,2 3;B值為100,B+1的值為6.
C DB 'ABC';C的值為41H,C+1的值為42H,C+2的值為43H.D DB ?;
D是一個字節,預留一個字節,可以置入任何內容.
E DB 23 DUP(0);定義23個0,每一個0占一個字節.
F DB 3 DUP(1,2 DUP(0));定義9個數,順序為:1,0,0,1,0,0,1,0,0.
G DW 'AB','CD';G的值為4142H,G+2的值為4344H.
H DW 2 3;H為一個字,存放順序為06,00H
I DW ? 預留一個字,占兩個字節單元,
3 1 2 用偽指令LABEL定義變量
格式:
變量名 LABEL BYTE/WORD/DWORD
例如:
BUF LABEL BYTE
DB 21
它等價於 BUF DB 21
3 1 3 用偽指令EQU定義變量
格式:變量名 EQU THIS BYTE/WORD/DWORD
THIS是定義任意類型算符,它同LABEL一樣用於建立變量或標號類型屬性,而其段屬性為語句所在段的段地址,偏移屬性為所在位置的下一個能分配到的可用偏移地址.例如:
STACK SEGMENT
DW 100 DUP(?
TOP EQU THIS WORD(或TOP LABEL WORD)
STACK END
變量TOP被定義為字類型,它的偏移量應為STACK段定義100個字後的下一個字的偏移量,它恰就是堆棧指針SP的初值,因此經常用這種方法為SP賦初值.本文來自編程入門網
3 1 4 雙重定義變量名利用隱含方式和顯示方式的雙重方式,可以對同一位置定義為雙重變量.
格式
〈變量名〉 EQU THIS〈類型〉
〈變量名〉 DB/DW/DD…
例如:
AB EQU THIS BYTE
(或AB LABEL BYTE)
AW DW 50 DUP(0)AW定義為字變量,在AW前使用了THIS BYTE,定義了一個字節類型變量,訪問同一個位置,用AB按字節訪問,用AW則按字訪問.
3 2 變量的訪問
3 2 1 變量名作為存儲單元的直接地址
變量名用直接尋址時,變量的類型必須與指令的要求相符合.
例如:AB已定義字節變量,AW定義為字變量,用變量名作直接尋址形式如下:
MOV AH,AB
MOV AX,AW
3 2 2 用合成運算符PTR臨時改變變量類型
接上例用
MOV CX,WORD PTR AB
MOV CL,BYTE PTR AW
則可臨時把AB變為字類型,AW變為字節類型,但段和偏移屬性不變.
3 2 3 變量名作為相對尋址中的偏移量
例如:
MOV AX,AB〔SI〕
MOV AX,AW[BX][SI]
在這裡AB,AW分別表示它們的偏移量而不是它們所表示的數據,常用於數組或表格操作中,AB[SI]就表示AB數組中第SI個元素.
3 2 4 屬性分離符
其中SEG和OFFSET用法和標號相同,分別表示取變量所在段的段地址和變量的偏移地址.而TYPE運算符,將回送該變量類型所表示的字節數.
例如:設AB為字節變量,AW為字變量,則:
MOV AH,TYPE AB即MOV AH,1
MOV AX,TYPE AW即MOV AX,2
3 2 5 取變量數據項個數運算符LENGTH對於變量定義時使用DUP的情況,匯編程序將回送DUP前的重復次數,即分配給該變量的單元數,若表達式有多個DUP,則取第一個DUP項,其它情況則回送1.
例如:ARRAY DW 50 DUP(0)則
MOV CX,LENGTH ARRAY即MOV CX,50
ARRAY1,DW1,2,3 則
MOV CX,LENGTH ARRAY1
即MOV CX,1
可見LENGTH表示數組元素個數,而不管其類型.
3 2 6 取變量數據項長度算符SIZE
SIZE算符,匯編程序將回送分配給該變量的字節數,即
SIZE=LENGTH TYPE
例如:
ARRAY DW 50 DUP(0) 則
SIZE ARRAY=50 2=100
要注意:對字符串變量求其長度,使用SIZE不能達到目的.
例如:
ST DB 'ABCDEFG' 則
SIZE ST值為1而不是7,欲求字符串長可用COUNT EQU $-ST,則COUNT值為7,其中$為定義ST一串字符後下一個可用的偏移地址.
3 2 7 變量名僅對應數據區第一個數據項
例如:
WORD DW 20 DUP(?)
MOV AX,WORD;第一個元素送AX,
MOV AX,WORD+38;第20個元素送AX.
其它符號
除標號和變量外,符號還可表示常量、段名、過程名、寄存器名和指令助記符等.
(1)符號常數常數也常以符號形式出現,使之更具有通用性且便於修改.例:
COUNT EQU 100 則COUNT就表示常數100.
(2)符號表示指令助記符.例:
MOV EQU MOV則MOVE就表示指令MOV
(3)符號表示寄存器,例:COUNT EQU CX則COUNT就代表寄存器CX.
(4)符號作為段名,例:
DATA SEGMENT
- - - -- - - - - - - - - - -
DATA ENDS
DATA 是段名,引用DATA表示段地址.
(5)符號作為過程名,例:SUBR PROC NEAR/FAR
- - - -- - - - - - - - - - -
SUB ENDP
SUB為過程名,它同樣具有段、偏移量和距離類型三個屬性
.(6)符號作為宏指令名
宏定義格式宏指令名 MACRO [形式參數]
- - - -- - - - - - - - - - -
ENDM
宏調用格式:
宏指令名 [實參數]
每當引用宏指令名則匯編程序對宏調用作宏展開,就是用宏定義體取代源程序中的宏指令並用實參數取代宏定義中的形式參數.