一、匯編語(yǔ)言的語(yǔ)句格式
由匯編語(yǔ)言編寫的源程序是由許多語(yǔ)句(也可稱為匯編指令)組成的。每個(gè)語(yǔ)句由1~4個(gè)部分組成,其格式是:
[標(biāo)號(hào)]指令助記符[操作數(shù)][;注解]
其中用方括號(hào)括起來(lái)的部分,可以有也可以沒(méi)有。每部分之間用空格(至少一個(gè))分開(kāi),一行最多可有132個(gè)字符。
1.標(biāo)識(shí)符
給指令或某一存儲(chǔ)單元地址所起的名字??捎上铝凶址M成:
字母:a ~ z ; 數(shù)字:0 ~ 9??; 特殊字符:?、· 、@、一、$ 。
數(shù)字不能作標(biāo)識(shí)符的第一個(gè)字符,而圓點(diǎn)僅能用作第一個(gè)字符。標(biāo)識(shí)符最長(zhǎng)為31個(gè)字符。當(dāng)標(biāo)識(shí)符后跟冒號(hào)時(shí),表示是標(biāo)號(hào)。它代表該行指令的起始地址;當(dāng)標(biāo)識(shí)符后不帶冒號(hào)時(shí),表示變量;偽指令前的標(biāo)識(shí)符不加冒號(hào)。
2.指令助記符
表示不同操作的指令,可以是8086的指令助記符,也可以是偽指令。
3.操作數(shù)
指令執(zhí)行的對(duì)象。依指令的要求,可能有一個(gè)、兩個(gè)或者沒(méi)有,
例如: ret;無(wú)操作數(shù)
count: inccx;一個(gè)操作數(shù)
如果是偽指令,則可能有多個(gè)操作數(shù),例如:
costdb3,4,5,6,7;5個(gè)操作數(shù)
movax,[bp+4];第二個(gè)操作數(shù)為表達(dá)式
4.注解
該項(xiàng)可有可無(wú),是為源程序所加的注解,用于提高程序的可讀性。
二、匯編語(yǔ)言的運(yùn)算符
1.算術(shù)運(yùn)算符、邏輯運(yùn)算符和關(guān)系運(yùn)算符
算術(shù)運(yùn)算符可以應(yīng)用于數(shù)字操作數(shù),結(jié)果也是數(shù)字。而應(yīng)用于存儲(chǔ)器操作數(shù)時(shí),只有+、-運(yùn)算符有意義。
2.取值運(yùn)算符seg、offset、type、size和length
· seg和offset分別給出一個(gè)變量或標(biāo)號(hào)的段地址和偏移量。
例如,定義:slotdw25
則: movax,slot;從slot地址中取一個(gè)字送入ax
movax,segslot;將slot所在段的段地址送入ax
movax,offsetslot;將slot所在段的段內(nèi)偏移地址送ax
· type操作符返回一個(gè)表示存儲(chǔ)器操作數(shù)類型的數(shù)值。各種存儲(chǔ)器地址操作數(shù)類型部分的值如表4-1所示。
·length和size操作符只應(yīng)用于數(shù)據(jù)存儲(chǔ)器操作數(shù)。(用db/dw/dd等定義的操作數(shù))
length返回一個(gè)與存儲(chǔ)器地址操作數(shù)相聯(lián)系的單元數(shù),
size操作數(shù)返回一個(gè)為存儲(chǔ)器操作數(shù)分配的字節(jié)數(shù)。
例如:若mult-word dw 50dup(0)
則length(mult-word)=50
size(mult-word)=100
注意:size(x)=(length x)*(type x)
3.屬性運(yùn)算符
屬性運(yùn)算符用來(lái)給指令中的操作數(shù)指定一個(gè)臨時(shí)屬性,而暫時(shí)忽略當(dāng)前的屬性。常用的有:
(1) 合成運(yùn)算符ptr
它作用于操作數(shù)時(shí),則忽略了操作數(shù)當(dāng)前的類型(字節(jié)或字)及屬性(near或far),而給出一個(gè)臨時(shí)的類型或?qū)傩裕?
一般格式:類型ptr 表達(dá)式
功能:建立一個(gè)存儲(chǔ)器地址操作數(shù),它與其后的存儲(chǔ)器地址操作數(shù)有相同的段地址偏移量,但有不同的類型。
例如:slotdw25
此時(shí)slot已定義成字單元。若我們想取出它的第一個(gè)字節(jié)內(nèi)容,則可用ptr對(duì)其作用,使它暫時(shí)改變?yōu)樽止?jié)單元,即 moval,byteptrslot
三、表達(dá)式
由運(yùn)算符和操作數(shù)組成的序列,在匯編時(shí)產(chǎn)生一個(gè)確定的值。這個(gè)值可以僅表示一個(gè)常量,也可以表示一個(gè)存儲(chǔ)單元的偏移地址,相應(yīng)的表達(dá)式稱為常量表達(dá)式和地址表達(dá)式。
1. 常數(shù)
匯編語(yǔ)言語(yǔ)句中出現(xiàn)的常數(shù)可以有7種:
① 二進(jìn)制數(shù)后跟字母b,如01000001b。
② 八進(jìn)制數(shù)后跟字母q或o,如202q或202o。
③ 十進(jìn)制數(shù) 后跟d或不跟字母,如85d或85。
④ 十六進(jìn)制數(shù)后跟h,如56h,0ffh。注意,當(dāng)數(shù)字的第一個(gè)字符是a~f時(shí),在字符前應(yīng)添加一個(gè)數(shù)字0,以示和變量的區(qū)別。
另有,十進(jìn)制浮點(diǎn)數(shù)、十六進(jìn)制實(shí)數(shù)、字符和字符串
2.常量操作數(shù)
常量操作數(shù)是一個(gè)數(shù)值操作數(shù),一般是常量或者是表示常量的標(biāo)識(shí)符??梢詾閿?shù)字常量操作數(shù)或字符串常量操作數(shù)。前者可采用二進(jìn)制、八進(jìn)制、十進(jìn)制或十六進(jìn)制等計(jì)數(shù)形式;而后者則為相應(yīng)字符的ascii碼。
3.存儲(chǔ)器操作數(shù)
存儲(chǔ)器操作數(shù)是一個(gè)地址操作數(shù),代表一個(gè)存儲(chǔ)單元的地址,通常以標(biāo)識(shí)符的形式出現(xiàn)。
存儲(chǔ)器操作數(shù)可以分為變量及標(biāo)號(hào)兩種類型,如果存儲(chǔ)器操作數(shù)所代表的是某個(gè)數(shù)據(jù)在數(shù)據(jù)段、附加段或堆棧段中的地址,那么這個(gè)存儲(chǔ)器操作數(shù)就稱為變量;如果存儲(chǔ)器操作數(shù)所代表的是某條指令代碼在代碼段中的地址,那么這個(gè)存儲(chǔ)器操作數(shù)稱為標(biāo)號(hào)。變量所對(duì)應(yīng)的存儲(chǔ)單元內(nèi)容在程序的運(yùn)行過(guò)程中是可以改變的,標(biāo)號(hào)通常作為轉(zhuǎn)移指令或調(diào)用指令的目標(biāo)操作數(shù),在程序運(yùn)行過(guò)程中不能改變。
存儲(chǔ)器操作數(shù)有三個(gè)方面的屬性。
(1) 段地址:即存儲(chǔ)器操作數(shù)所對(duì)應(yīng)的存儲(chǔ)單元所在段的段地址;
(2) 偏移地址:即存儲(chǔ)器操作數(shù)所對(duì)應(yīng)的存儲(chǔ)單元在所在段內(nèi)的偏移地址;
(3) 類型:變量的類型是相應(yīng)存儲(chǔ)單元所存放的數(shù)據(jù)項(xiàng)的字節(jié)數(shù);而標(biāo)號(hào)的類型則反映了相應(yīng)存儲(chǔ)單元地址在作為轉(zhuǎn)移或調(diào)用指令的目標(biāo)操作數(shù)時(shí)的尋址方式,可有兩種情況,即near和far。具體值可見(jiàn)表4-1
4.常量表達(dá)式
由常量操作數(shù)及運(yùn)算符構(gòu)成,在匯編時(shí)產(chǎn)生一個(gè)常量。
如port、val+1、 offset sum、seg sum、type cycle等。
5.地址表達(dá)式
由存儲(chǔ)器操作數(shù)與運(yùn)算符構(gòu)成,必須有明確的物理意義。
例如sum+2、cycle-5
表達(dá)式sum+2、cycle-5的值仍然是一個(gè)存儲(chǔ)器操作數(shù),該存儲(chǔ)器操作數(shù)的段地址與類型屬性分別與存儲(chǔ)器操作數(shù)sum及cycle相同,但偏移地址分別比sum及cycle大2或小5。表達(dá)式是在匯編時(shí)計(jì)算的,而變量單元的內(nèi)容在程序的運(yùn)行過(guò)程中可以改變。
四、匯編語(yǔ)言程序匯編步驟
匯編語(yǔ)言程序要能在機(jī)器上運(yùn)行,還必需將匯編源程序匯編成可執(zhí)行程序。為此必須完成以下幾個(gè)步驟。
1.編輯源程序
2.調(diào)用宏匯編對(duì)源程序進(jìn)行匯編
3.對(duì)目標(biāo)程序進(jìn)行連接
4.運(yùn)行可執(zhí)行程序并調(diào)試