汇编中的标号
使用變量是任何編程語言都要遇到的工作。變量是計(jì)算機(jī)內(nèi)存中已命名的存儲位置,在大部分的語言中都有很多種類的變量,如整數(shù)型、浮點(diǎn)型和字符串等,不同的變量有不同的用途和尺寸,比如說雖然長整數(shù)和單精度浮點(diǎn)數(shù)都是32位長,但它們的用途不同。
顧名思義,變量的值在程序運(yùn)行中是需要改變的,所以它必須定義在可寫的段內(nèi),如 .data和 .data?,或者在堆棧內(nèi)。按照定義的位置不同,MASM中的變量也分為全局變量和局部變量兩種。
詳細(xì)地~~~~~
標(biāo)號:標(biāo)號(LABEL)是為一組機(jī)器指令所起名字.標(biāo)號可有可無,只有當(dāng)需要用符號地址來訪問該語句時(shí),才給此語句賦予標(biāo)號.標(biāo)號是程序目標(biāo)標(biāo)志,總是和某地址相聯(lián)系,供轉(zhuǎn)移或循環(huán)指令控制轉(zhuǎn)移使用.
1 標(biāo)號屬性
因標(biāo)號表示是指令地址,所以它有三個屬性,即段屬性、偏移屬性和類型屬性.段屬性即段地址,標(biāo)號段必須在CS中.偏移屬性是表示該標(biāo)號到段首地址距離,單位是字節(jié),是16位無符號整數(shù).類型屬性是距離屬性,指標(biāo)號和轉(zhuǎn)移指令距離,該標(biāo)號在本段內(nèi)引用,距離在-128~ 127之間時(shí)稱短標(biāo)號,距離屬性為SHORT,當(dāng)標(biāo)號在本段,距離在-32768~ 32767之間時(shí)稱近標(biāo)號,距離屬性為NEAR,當(dāng)引用標(biāo)號指令和標(biāo)號不在同一段時(shí)稱遠(yuǎn)標(biāo)號,距離屬性為FAR.
計(jì)算機(jī)匯編語言的一個突出優(yōu)點(diǎn)就是利用符號(Symbol)來代替目標(biāo)碼,也即大量的二進(jìn)制代碼用符號來表示,使匯編語言源程序容易理解,便于記憶。
在宏匯編語言中所有變量名、標(biāo)號名、記錄名、指令助記符和寄存器名等統(tǒng)稱符號.這些符號可通過匯編控制語句的偽操作命令重新命名,也可以通過指令給它定義其它名字及新的類型屬性,因而給程序設(shè)計(jì)帶來很大的靈活性.符號是程序員在程序中用來代表某個存儲單元、數(shù)據(jù)、表達(dá)式和名字等所定義的標(biāo)識符,可分為寄存器、標(biāo)號、變量、數(shù)字、名字五類.
匯編語句形式:
START: ADD AX,BUFFER
DATA SEGMENT
BUFFER DB 01H, 02H
DATA ENDS
JMP START其中START,BUFFER,DATA均為符號,它們分別表示標(biāo)號,變量名,段名,它們具有完全不同的特定含意.?
標(biāo)號
標(biāo)號(LABEL)是為一組機(jī)器指令所起的名字.標(biāo)號可有可無,只有當(dāng)需要用符號地址來訪問該語句時(shí),才給此語句賦予標(biāo)號.標(biāo)號是程序的目標(biāo)標(biāo)志,總是和某地址相聯(lián)系,供轉(zhuǎn)移或循環(huán)指令控制轉(zhuǎn)移使用.
2 1 標(biāo)號的屬性
因標(biāo)號表示的是指令地址,所以它有三個屬性,即段屬性、偏移屬性和類型屬性.段屬性即段地址,標(biāo)號的段必須在CS中.偏移屬性是表示該標(biāo)號到段首地址的距離,單位是字節(jié),是16位無符號整數(shù).類型屬性是距離屬性,指標(biāo)號和轉(zhuǎn)移指令的距離,該標(biāo)號在本段內(nèi)引用,距離在-128~+127之間時(shí)稱短標(biāo)號,距離屬性為SHORT,當(dāng)標(biāo)號在本段,距離在-32768~+32767之間時(shí)稱近標(biāo)號,距離屬性為NEAT,當(dāng)引用標(biāo)號的指令和標(biāo)號不在同一段時(shí)稱遠(yuǎn)標(biāo)號,距離屬性為FAR.
2 2 標(biāo)號的定義
標(biāo)號的定義有三種方法:
2 2 1 隱含說明標(biāo)號距離屬性為SHORT和NEAR的標(biāo)號可以使用隱含說明,即在代碼段中定義,標(biāo)識符后加冒號,放在一條匯編指令的操作符前面.例:
NEXT: MOV AX,BX?
----------
LOOP NEXT
- - - - - - - - - ?
NEXT1: CMP AX,BX
JA NEXT1
其中NEXT和NEXT1都是標(biāo)號名.
2 2 2 用LABEL定義標(biāo)號
對于屬性為NEAR和FAR的標(biāo)號均可以用這種定義.格式是:
標(biāo)號名 LABEL NEAR/FAR
例如:NEXT LABEL NEAR/FAR
- - - - - - - - - ?
LOOP NEXT
2 2 3 用EQU定義標(biāo)號?
對于屬性為NEAR和FAR的標(biāo)號也可用EQU定義.格式是:
標(biāo)號名 EQU THIS NEAT/FAR
例如:
NEXT EQU THIS NEAR
- - - - - - - - - ?
LOOP NEXT
2 3 標(biāo)號的使用
2 3 1 無條件轉(zhuǎn)移指令中標(biāo)號作為轉(zhuǎn)移地址
格式:
JMP 標(biāo)號
其中標(biāo)號可以是短標(biāo)號,近標(biāo)號或遠(yuǎn)標(biāo)號
. 2 3 2 循環(huán)指令中,標(biāo)號作為轉(zhuǎn)移地址
格式:LOOP 標(biāo)號
其中標(biāo)號只能是短標(biāo)號
2 3 3 條件轉(zhuǎn)移中標(biāo)號作為轉(zhuǎn)移地址
格式:
條件轉(zhuǎn)移指令 標(biāo)號
其中標(biāo)號只能用短標(biāo)號
2 3 4 屬性分離符
2 .3. 4. 1 取段地址算符SEG
例如:MOV AX,SEG NEXT
SEG NEXT 就是取標(biāo)號NEXT所在段的段地址.?
2 3 4 2 取偏移量算符OFFSET
例如:MOV BX, OFFSET NEX
其中OFFSET NEXT就是取標(biāo)號NEXT的有效地址,該語句等效于:LEA BX, NEXT
2 3 4 3 取類型算符TYPE
例如:
MOV AX, TYPE NEXT
若NEXT為近標(biāo)號,則TYPE NEXT值為FFFFH(-1),若NEXT為遠(yuǎn)標(biāo)號TYPE NEXT值為FFFEH(-2).其中-1和-2無真正的物理意義,僅以數(shù)值表示標(biāo)號類型而已.?
變量
變量(Variable)代表存放在某些存儲單元的數(shù)據(jù),這些數(shù)據(jù)在程序運(yùn)行期間可以隨時(shí)被修改.變量是通過變量名在程序中引用,變量名實(shí)際上是存儲區(qū)中一個數(shù)據(jù)區(qū)的名字,以變量名數(shù)據(jù)的方式供程序員使用,作為指令或偽.指令的操作數(shù),大大方便了程序設(shè)計(jì)者.
由于變量是在邏輯段中定義.這就決定了變量和標(biāo)號一樣具有段屬性、偏移屬性和類型屬性,前兩個和標(biāo)號的屬性相同,而類型屬性是指出數(shù)據(jù)區(qū)的數(shù)據(jù)項(xiàng)的存取單位是字節(jié)(BYTE),字(WORD)或數(shù)字(DWORD)等.可見變量和標(biāo)號的主要區(qū)別在于變量指的是數(shù)據(jù),而標(biāo)號則對應(yīng)的是指令。
.3 1 變量的定義
變量通常也有三種定義法
.3 1 1 用偽指令DB,DW,DD等來定義
格式:[變量名] 定義數(shù)據(jù)偽指令〈表達(dá)式〉
其中變量名可有可無,若沒有名字則該變量為無名變量.表達(dá)式可以是常數(shù)、保留符號"?"、ASCII碼字符串(只能用DB定義)、地址表達(dá)式(不能用DB定義)、預(yù)置數(shù)據(jù)表格和用DUP定義的重復(fù)值.變量名可在任一邏輯段中定義,其后邊不緊跟冒號而是加一空格。
.例如:A DB 100;A為一個字節(jié),值為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是一個字節(jié),預(yù)留一個字節(jié),可以置入任何內(nèi)容.
E DB 23 DUP(0);定義23個0,每一個0占一個字節(jié).
F DB 3 DUP(1,2 DUP(0));定義9個數(shù),順序?yàn)?1,0,0,1,0,0,1,0,0.
G DW 'AB','CD';G的值為4142H,G+2的值為4344H.
H DW 2 3;H為一個字,存放順序?yàn)?6,00H
I DW ? 預(yù)留一個字,占兩個字節(jié)單元,
3 1 2 用偽指令LABEL定義變量
格式:
變量名 LABEL BYTE/WORD/DWORD
例如:
BUF LABEL BYTE
DB 21
它等價(jià)于 BUF DB 21
3 1 3 用偽指令EQU定義變量
格式:變量名 EQU THIS BYTE/WORD/DWORD
THIS是定義任意類型算符,它同LABEL一樣用于建立變量或標(biāo)號類型屬性,而其段屬性為語句所在段的段地址,偏移屬性為所在位置的下一個能分配到的可用偏移地址.例如:
STACK SEGMENT
DW 100 DUP(?
TOP EQU THIS WORD(或TOP LABEL WORD)
STACK END
變量TOP被定義為字類型,它的偏移量應(yīng)為STACK段定義100個字后的下一個字的偏移量,它恰就是堆棧指針SP的初值,因此經(jīng)常用這種方法為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,定義了一個字節(jié)類型變量,訪問同一個位置,用AB按字節(jié)訪問,用AW則按字訪問.
3 2 變量的訪問
3 2 1 變量名作為存儲單元的直接地址
變量名用直接尋址時(shí),變量的類型必須與指令的要求相符合.
例如:AB已定義字節(jié)變量,AW定義為字變量,用變量名作直接尋址形式如下:
MOV AH,AB
MOV AX,AW
3 2 2 用合成運(yùn)算符PTR臨時(shí)改變變量類型
接上例用
MOV CX,WORD PTR AB
MOV CL,BYTE PTR AW
則可臨時(shí)把AB變?yōu)樽诸愋?AW變?yōu)樽止?jié)類型,但段和偏移屬性不變.
3 2 3 變量名作為相對尋址中的偏移量
例如:
MOV AX,AB〔SI〕
MOV AX,AW[BX][SI]
在這里AB,AW分別表示它們的偏移量而不是它們所表示的數(shù)據(jù),常用于數(shù)組或表格操作中,AB[SI]就表示AB數(shù)組中第SI個元素.
3 2 4 屬性分離符
其中SEG和OFFSET用法和標(biāo)號相同,分別表示取變量所在段的段地址和變量的偏移地址.而TYPE運(yùn)算符,將回送該變量類型所表示的字節(jié)數(shù).
例如:設(shè)AB為字節(jié)變量,AW為字變量,則:
MOV AH,TYPE AB即MOV AH,1
MOV AX,TYPE AW即MOV AX,2
3 2 5 取變量數(shù)據(jù)項(xiàng)個數(shù)運(yùn)算符LENGTH對于變量定義時(shí)使用DUP的情況,匯編程序?qū)⒒厮?#xff24;UP前的重復(fù)次數(shù),即分配給該變量的單元數(shù),若表達(dá)式有多個DUP,則取第一個DUP項(xiàng),其它情況則回送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表示數(shù)組元素個數(shù),而不管其類型.
3 2 6 取變量數(shù)據(jù)項(xiàng)長度算符SIZE
SIZE算符,匯編程序?qū)⒒厮头峙浣o該變量的字節(jié)數(shù),即
SIZE=LENGTH TYPE
例如:
ARRAY DW 50 DUP(0) 則
SIZE ARRAY=50 2=100
要注意:對字符串變量求其長度,使用SIZE不能達(dá)到目的.
例如:
ST DB 'ABCDEFG' 則
SIZE ST值為1而不是7,欲求字符串長可用COUNT EQU $-ST,則COUNT值為7,其中$為定義ST一串字符后下一個可用的偏移地址.
3 2 7 變量名僅對應(yīng)數(shù)據(jù)區(qū)第一個數(shù)據(jù)項(xiàng)
例如:
WORD DW 20 DUP(?)
MOV AX,WORD;第一個元素送AX,
MOV AX,WORD+38;第20個元素送AX.?
其它符號
除標(biāo)號和變量外,符號還可表示常量、段名、過程名、寄存器名和指令助記符等.
(1)符號常數(shù)常數(shù)也常以符號形式出現(xiàn),使之更具有通用性且便于修改.例:
COUNT EQU 100 則COUNT就表示常數(shù)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 [形式參數(shù)]
- - - -- - - - - - - - - - -
? ENDM
宏調(diào)用格式:
宏指令名 [實(shí)參數(shù)]
每當(dāng)引用宏指令名則匯編程序?qū)暾{(diào)用作宏展開,就是用宏定義體取代源程序中的宏指令并用實(shí)參數(shù)取代宏定義中的形式參數(shù)
總結(jié)
- 上一篇: 程序员提高建议之踏踏实实“扎马步”
- 下一篇: 如何看懂源代码–(分析源代码方法)