第 4 章 80x86 匯編語言及程序_第1頁
第 4 章 80x86 匯編語言及程序_第2頁
第 4 章 80x86 匯編語言及程序_第3頁
第 4 章 80x86 匯編語言及程序_第4頁
第 4 章 80x86 匯編語言及程序_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第4章80x86匯編語言及程序設(shè)計(jì)4.1匯編語言的基本語法4.280x86宏匯編指示性語句的增強(qiáng)與擴(kuò)充4.3匯編語言程序設(shè)計(jì)基礎(chǔ)及應(yīng)用4.1匯編語言的基本語法4.1.1匯編語言概述1.匯編語言及特征匯編語言是一種采用助記符表示的機(jī)器語言指令,即用助記符來表示指令的操作碼和操作數(shù),用標(biāo)號(hào)或符號(hào)代表地址、常量或變量。助記符一般是英文單詞的縮寫,因此,相對(duì)于機(jī)器語言來說,使用匯編語言編寫的程序便于記憶、閱讀,使用方便。用匯編語言編寫的程序,產(chǎn)生的目標(biāo)代碼短、執(zhí)行速度快,可以直接控制系統(tǒng)硬件,具有高級(jí)語言不可替代的作用。學(xué)習(xí)匯編語言也是理解和掌握計(jì)算機(jī)工作原理和過程的主要途徑。但使用匯編語言編寫程序,程序員必須熟悉系統(tǒng)硬件結(jié)構(gòu),且其功能描述不如高級(jí)語言直觀,編程效率較低。匯編語言作為一種計(jì)算機(jī)語言,必然由程序員和計(jì)算機(jī)都能識(shí)別的符號(hào)、功能代碼及語法約定來描述。匯編語言主要包括:指令語句、偽指令語句和詞法(語法)。(1)指令語句指令語句是指第3章介紹的由匯編指令構(gòu)成的語句,是計(jì)算機(jī)可以執(zhí)行的語句。一條指令語句必產(chǎn)生一條相應(yīng)的目標(biāo)代碼,在用匯編語言編寫的源程序中,程序的主要功能是通過指令語句來實(shí)現(xiàn)的。(2)偽指令語句偽指令語句是指為了方便用戶設(shè)計(jì)程序,由偽指令提供給匯編程序完成的一些操作。偽指令又稱匯編控制指令,它是控制匯編過程的一些命令,即程序員通過偽指令設(shè)置匯編程序進(jìn)行匯編時(shí)的一些操作,主要包括源程序存放的起始地址、定義存儲(chǔ)段及過程等。因此,偽指令不產(chǎn)生機(jī)器語言的目標(biāo)代碼,它是匯編語言程序中的不可執(zhí)行語句。(3)詞法詞法用于規(guī)定程序中允許使用的符號(hào)、運(yùn)算符、表達(dá)式及程序的結(jié)構(gòu)要求等。程序員必須按照詞法約定編寫程序2.匯編程序用匯編語言編寫的程序稱為源程序。源程序必須翻譯成用機(jī)器語言表示的目標(biāo)代碼(亦稱目標(biāo)程序),計(jì)算機(jī)才能執(zhí)行。其編譯工作可由匯編程序自動(dòng)完成。匯編程序的功能就是將用匯編語言編寫的源程序翻譯成用機(jī)器語言表示的目標(biāo)程序,這一過程稱為匯編(編譯)。3.匯編語言語句語句是程序的基本組成部分,匯編語言源程序中主要包括指令語句、偽指令語句和宏指令語句。(1)指令語句指令語句格式由以下幾個(gè)部分組成:[標(biāo)識(shí)符:]操作碼[目的操作數(shù)][,源操作數(shù)][;注釋]例如:LOP:MOVAL,DATA1;雙操作數(shù)指令,標(biāo)號(hào)LOP為指令地址ADDAL,[2000H];雙操作數(shù)指令DECAL;單操作數(shù)指令NOP;無操作數(shù)指令一條語句應(yīng)在一行內(nèi)完成。(2)偽指令語句偽指令語句格式:[標(biāo)識(shí)符]偽操作符[操作數(shù)][;注釋]其中,[]中的項(xiàng)表示可選項(xiàng)。標(biāo)識(shí)符:根據(jù)偽指令作用的不同,可以是變量名、段名、過程名及符號(hào)常量等。偽操作符:又稱定義符/偽指令助記符,表示偽操作功能,如定義變量名、段名、過程名及符號(hào)常量等。標(biāo)識(shí)符與偽操作符之間用空格分隔。操作數(shù):又稱偽指令參數(shù),根據(jù)不同的偽指令,可以有一個(gè)或多個(gè)。例如:DATA1DB30H,31H,32H;定義字節(jié)變量DATA1開始的3個(gè)連續(xù)存儲(chǔ)單元DATA2DB33H;定義字節(jié)變量DATA2單元DW1234H;定義字存儲(chǔ)單元PIEQU3.14;定義符號(hào)常量(3)宏指令語句宏指令語句是由若干條指令語句形成的語句體。一條宏指令語句的功能相當(dāng)于若干條指令語句的功能。4.1.2匯編語言的數(shù)據(jù)、標(biāo)識(shí)符和表達(dá)式數(shù)據(jù)是匯編語言語句中操作數(shù)的基本組成部分。匯編語言所能識(shí)別的數(shù)據(jù)有常量、變量和標(biāo)識(shí)符,并通過不同的運(yùn)算符組成表達(dá)式,以實(shí)現(xiàn)對(duì)數(shù)據(jù)的加工。1.常量在程序中,數(shù)據(jù)固定不變的值稱為常量。(1)數(shù)值常量數(shù)值常量的表示形式有二進(jìn)制數(shù)、八進(jìn)制數(shù)、十六進(jìn)制數(shù)、十進(jìn)制數(shù),其后分別跟字母B、O、H、D(十進(jìn)制數(shù)可省略D)。十六進(jìn)制數(shù)以A~F開頭時(shí),前面加數(shù)字0,以避免和操作碼混淆。

例如:0010111B、1234H、0FFFFH、121O。常量可以是數(shù)值,也可以是名字。用名字表示的常量稱為符號(hào)常量。在編程時(shí),符號(hào)常量可使用偽指令“EQU”進(jìn)行定義。例如:CNTEQU100;CNT為符號(hào)常量,等值100(2)字符串常量字符串常量是由包含在引號(hào)中的若干個(gè)字符組成的。字符串在計(jì)算機(jī)中存儲(chǔ)的是相應(yīng)字符的ASCII。如“A”的值是41H,“AB”的值是4142H等。2.變量變量是在程序運(yùn)行過程中可隨時(shí)改變的量,它實(shí)際上是存儲(chǔ)器的某一個(gè)數(shù)據(jù)存儲(chǔ)單元。對(duì)變量的訪問就是對(duì)這個(gè)存儲(chǔ)單元的訪問。在程序中是通過變量名的形式來實(shí)現(xiàn)對(duì)存儲(chǔ)單元的操作的。變量名被稱為存放數(shù)據(jù)的存儲(chǔ)單元的符號(hào)地址。變量有以下3個(gè)屬性。①段屬性:指變量所表示的存儲(chǔ)單元所在段的段基址。②偏移地址屬性:指變量所表示的存儲(chǔ)單元地址與段基址之間的偏移量。③類型屬性:指變量占用存儲(chǔ)單元的字節(jié)數(shù)。變量可分為字節(jié)變量、字變量和雙字變量。字節(jié)變量為1個(gè)字節(jié)單元,類型為BYTE;字變量為2個(gè)字節(jié)單元,類型為WORD;雙字變量為4個(gè)字節(jié)單元,類型為DWORD。3.標(biāo)識(shí)符標(biāo)識(shí)符就是符號(hào)名稱,標(biāo)識(shí)符在源程序中可以表示標(biāo)號(hào)、變量、常量、過程名、段名等。標(biāo)識(shí)符必須是大小寫英文字母、數(shù)字及一些特殊符號(hào)的組合指令語句中的標(biāo)號(hào)表示該指令的符號(hào)地址,它可作為轉(zhuǎn)移類指令的操作數(shù),以確定程序轉(zhuǎn)移的目標(biāo)地址。標(biāo)號(hào)有以下3個(gè)屬性。①標(biāo)號(hào)所在段必定是代碼段。②標(biāo)號(hào)所在地址與段基址之間的偏移量為16位無符號(hào)數(shù)。③當(dāng)標(biāo)號(hào)只允許作為段內(nèi)轉(zhuǎn)移或調(diào)用指令的目標(biāo)地址時(shí),類型為NEAR;當(dāng)標(biāo)號(hào)可作為段間轉(zhuǎn)移或調(diào)用指令的目標(biāo)地址時(shí),類型為FAR。偽指令語句中的標(biāo)識(shí)符可作為常量、變量名等數(shù)據(jù)參加運(yùn)算,也可作為段名及過程名等4.運(yùn)算符和表達(dá)式用運(yùn)算符把常量、變量或標(biāo)識(shí)符組合起來的式子就是表達(dá)式,由匯編程序在匯編時(shí)對(duì)其進(jìn)行運(yùn)算,得到的是運(yùn)算結(jié)果數(shù)據(jù)。運(yùn)算符主要包括算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、分析運(yùn)算符和屬性運(yùn)算符5種類型。(1)算術(shù)運(yùn)算符算術(shù)運(yùn)算符包括+(加)、-(減)、*(乘)、/(除)、MOD(模除),參加運(yùn)算的數(shù)和運(yùn)算結(jié)果均為整數(shù)。例如,用匯編語言描述的程序?yàn)椋篗OVAL,10H*2;在匯編時(shí)完成源操作數(shù)10H*2ADDAL,7MOD2;在匯編時(shí)完成7MOD2=1(2)邏輯運(yùn)算符邏輯運(yùn)算符包括AND(與)、OR(或)、XOR(異或)、NOT(非),其作用是對(duì)操作數(shù)進(jìn)行按位操作,其結(jié)果不影響標(biāo)志位。必須注意到,邏輯運(yùn)算符與邏輯運(yùn)算指令中的助記符完全相同,但由邏輯運(yùn)算符組成的表達(dá)式只能作為指令的操作數(shù)部分,在匯編時(shí)完成邏輯運(yùn)算,其結(jié)果自然不影響標(biāo)志位;邏輯運(yùn)算指令中,邏輯運(yùn)算助記符出現(xiàn)在指令的操作碼部分,在執(zhí)行目標(biāo)代碼(指令)時(shí)完成邏輯運(yùn)算,其結(jié)果影響狀態(tài)標(biāo)志位。(3)關(guān)系運(yùn)算符關(guān)系運(yùn)算符包括EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)共6種,該運(yùn)算符可實(shí)現(xiàn)兩個(gè)數(shù)據(jù)的比較運(yùn)算。若關(guān)系成立,結(jié)果為全1(邏輯真),否則為全0(邏輯假)。(4)分析運(yùn)算符分析運(yùn)算符的運(yùn)算對(duì)象必須為變量或標(biāo)號(hào),運(yùn)算符總是加在運(yùn)算對(duì)象之前。它可以將變量或標(biāo)號(hào)的屬性(如段、偏移量、類型)分離出來①SEG運(yùn)算符。根據(jù)SEG運(yùn)算符組成的表達(dá)式可以得到該變量或標(biāo)號(hào)所在段的段基址。例如:MOVBX,SEGDATA②OFFSET運(yùn)算符。根據(jù)OFFSET運(yùn)算符組成的表達(dá)式可以得到該變量或標(biāo)號(hào)在段內(nèi)的偏移地址。例如:MOVSI,OFFSETSOURCE在該例中,倘若變量SOURCE在數(shù)據(jù)段內(nèi)的偏移地址是1200H,則該指令執(zhí)行的結(jié)果為(SI)=1200H。該指令與指令LEASI,SOURCE等價(jià)。③TYPE運(yùn)算符。根據(jù)TYPE運(yùn)算符組成的表達(dá)式可以得到該變量或標(biāo)號(hào)的類型屬性。當(dāng)其加在標(biāo)號(hào)之前時(shí),可以得到這個(gè)標(biāo)號(hào)的類型屬性。④LENGTH運(yùn)算符。根據(jù)LENGTH運(yùn)算符組成的表達(dá)式可以得到分配給變量的連續(xù)單元的個(gè)數(shù)(也稱為數(shù)組)。該運(yùn)算符只針對(duì)用DUP重復(fù)操作符定義的數(shù)組產(chǎn)生正確結(jié)果。例如:DATA1DW20HDUP(0)MOVAL,LENGTHDATA1;匯編后為MOVAL,20H⑤SIZE運(yùn)算符。根據(jù)SIZE運(yùn)算符組成的表達(dá)式可以得到分配給變量所占有的總字節(jié)數(shù)。(5)屬性運(yùn)算符變量、標(biāo)號(hào)或地址表達(dá)式的屬性可以用一些運(yùn)算符來修改。①PTR運(yùn)算符。PTR運(yùn)算符用來指定或臨時(shí)修改某個(gè)變量、標(biāo)號(hào)或地址表達(dá)式的類型或距離屬性,它們?cè)瓉淼膶傩圆蛔儭n愋涂梢允牵築YTE、WORD、DWORD、NEAR或FAR。例如:DATADB12H,34H,56,78HINCBYTEPTR[DI];指明目的操作數(shù)為字節(jié)類型MOVAX,WORDPTRDATA;臨時(shí)修改DATA為字類型,(AX)=3412HJMPDWORDPTR[BX];指明為段間轉(zhuǎn)移②段前綴“:”運(yùn)算符。該運(yùn)算符的作用是指定變量、標(biāo)號(hào)或地址表達(dá)式所在的段。例如:MOVAX,ES:[BX];用附加段ES取代默認(rèn)的數(shù)據(jù)段DS③SHORT運(yùn)算符。SHORT運(yùn)算符用于說明轉(zhuǎn)移指令的目標(biāo)地址的屬性,取值范圍為-128~127。例如:JMPSHORTLP另外,還有用于改變運(yùn)算符優(yōu)先級(jí)的圓括號(hào)運(yùn)算符和用于變量下標(biāo)或地址表達(dá)式的方括號(hào)運(yùn)算符等。4.1.3偽指令語句偽指令語句(又稱指示性語句)通過各種偽操作命令,為匯編程序提供一些信息,在匯編過程中實(shí)現(xiàn)數(shù)據(jù)定義、分配存儲(chǔ)區(qū)、段定義、過程定義等功能。使用偽指令語句的目的是正確地把可執(zhí)行的指令性語句翻譯成相應(yīng)的機(jī)器指令代碼。本節(jié)介紹在匯編語言源程序中常用的一些匯編偽指令語句。1.符號(hào)定義偽指令語句符號(hào)定義偽指令有“EQU”等值偽指令和“=”偽指令兩種。(1)“EQU”等值偽指令格式:符號(hào)名EQU表達(dá)式功能:符號(hào)定義偽指令指給一個(gè)標(biāo)識(shí)符號(hào)賦予一個(gè)常量、表達(dá)式或其他符號(hào)名,是一種等值偽操作命令。例如:HUNDEREQU100;定義符號(hào)常量HUNDER替代100NUMEQUHUNDER*2;定義NUM替代數(shù)值表達(dá)式HUNDER*2AEQUAX;定義符號(hào)A替代AX2.?dāng)?shù)據(jù)定義偽指令語句數(shù)據(jù)定義偽指令的作用是為數(shù)據(jù)分配一定的存儲(chǔ)單元,并為這些存儲(chǔ)單元的起始單元定義一個(gè)變量名。(1)定義字節(jié)變量偽指令格式:[變量名]DB表達(dá)式或數(shù)據(jù)項(xiàng)表功能:將表達(dá)式或數(shù)據(jù)項(xiàng)表的數(shù)據(jù)按字節(jié)依次連續(xù)地存放到以[變量名]開始的存儲(chǔ)單元中。存儲(chǔ)單元的地址是遞增的。例如:ADB30H,31H,32H,33H,34H;定義從變量A開始的連續(xù)10個(gè)字節(jié)單元(數(shù)組)DB35H,36H,37H,38H,39H;A~A+9單元依次存放30H~39HBDB100DUP(?);定義從變量B開始的100個(gè)字節(jié)單元,內(nèi)容不定CDB64H;定義變量C單元內(nèi)容為64HSDB'ABCDEF';定義變量S(數(shù)組S)為連續(xù)6個(gè)字節(jié)單元,存放字符串3.程序分段定義偽指令語句(1)段定義偽指令格式:段名SEGMENT[定位類型,][組合類型,][類別名]…指令語句序列…段名ENDS功能:定義數(shù)據(jù)段、代碼段、堆棧段、附件段。段名用來指出為該段分配的存儲(chǔ)器起始地址。3個(gè)參數(shù)任選,其作用解釋如下。①定位類型。定位類型表示某段裝入內(nèi)存時(shí),對(duì)段的起始邊界的要求。若定位類型為BYTE,表示本段起始單元可以從任一地址開始,段間不留空隙。若定位類型為WORD,表示本段起始單元是一個(gè)偶地址。若定位類型為PARA,表示本段起始單元地址一定能被16整除(系統(tǒng)默認(rèn)定位類型)。若定位類型為PAGE,表示本段起始單元地址一定能被256整除。②組合類型。組合類型表示多個(gè)程序模塊連接時(shí),本模塊與其他模塊的同名段的組合類型。若組合類型為NONE,表示本段與其他段無組合關(guān)系(系統(tǒng)默認(rèn)組合類型)。若組合類型為PUBLIC,表示本段和其他同名同類段重新連接成一個(gè)新邏輯段。若組合類型為COMMON,表示把兩個(gè)段設(shè)置成相同的起始地址。若組合類型為STACK,表示本段為堆棧段,把所有同名段連接成一個(gè)段,自動(dòng)初始化SS和SP。③類別名。類別名是用單引號(hào)標(biāo)識(shí)的字符串,連接時(shí)把類別名相同的所有段存放在連續(xù)的存儲(chǔ)區(qū)內(nèi)。

(2)ASSUME段分配偽指令格式:ASSUME段寄存器:段名,[段寄存器:段名,][段寄存器:段名]功能:通知匯編程序設(shè)置CS、DS、SS、ES為哪些段的段基址寄存器。該指令只說明段名和段寄存器的關(guān)系,并未把段基址裝入對(duì)應(yīng)的寄存器。段寄存器DS、ES、SS的裝入一般由程序?qū)崿F(xiàn),而CS的裝入是系統(tǒng)自動(dòng)完成的。4.定位操作偽指令語句(1)定位偽指令格式:ORG數(shù)值表達(dá)式功能:指出ORG后面的指令語句或數(shù)據(jù)區(qū)從數(shù)值表達(dá)式(地址偏移量)所確定的存儲(chǔ)單元開始存放。例如:CSEGSEGMENTORG2000H;從2000H開始存放“HELLO”D1DB'HELLO'CSEGENDS(2)當(dāng)前位置計(jì)數(shù)器$$表示當(dāng)前地址,即在匯編時(shí)為程序分配下一個(gè)存儲(chǔ)單元的偏移地址。它可以在表達(dá)式中使用。

例如:D1DB'abcdefghijk'LENEQU$-D1;LEN為字符串長度4.1.5完整的匯編語言源程序結(jié)構(gòu)下面給出的是一個(gè)簡單的完整匯編語言源程序及程序注釋。DATASEGMENT

;定義數(shù)據(jù)段開始A1DW0012HA2DW0034HSUMDW0HDATAENDS

;數(shù)據(jù)段結(jié)束STACKSEGMENTPARASTACK'STACK';定義堆棧段開始DB100DUP(?)STACKENDS

;堆棧段結(jié)束CODESEGMENT

;定義代碼段開始ASSUMECS:CODE,DS:DATA,SS:STACK;說明CODE為代碼段,DATA為數(shù)據(jù)段,STACK為堆棧段START:MOVAX,DATAMOVDS,AX;賦數(shù)據(jù)段基址

MOVAX,STACK

MOVSS,AXMOVAX,A1;功能指令段MOVBX,A2MOVCL,8ROLAX,CLADDAX,BXMOVSUM,AX;將和存入SUM單元MOVAH,4CH;返回INT21HCODEENDS

;代碼段結(jié)束ENDSTART

;結(jié)束匯編該程序的功能為將A1單元的低8位與A2單元的低8位裝配在一起存入SUM單元。完整的匯編語言源程序的一般結(jié)構(gòu)如下。①匯編語言源程序必須以SEGMENT和ENDS定義段結(jié)構(gòu),整個(gè)程序是由存儲(chǔ)段組成的。80x86宏匯編語言規(guī)定,源程序至少包含一個(gè)代碼段。一般情況下,源程序可根據(jù)需要由代碼段、數(shù)據(jù)段、堆棧段和附加段組成。每個(gè)段在程序中的位置沒有限制。本例中,源程序定義了數(shù)據(jù)段(段名為DATA)、堆棧段(段名為STACK)、代碼段(段名為CODE)。②程序中需要處理和存儲(chǔ)的數(shù)據(jù)應(yīng)存儲(chǔ)在數(shù)據(jù)段,指令存儲(chǔ)在代碼段。③代碼段內(nèi)用ASSUME

偽指令說明段寄存器為某一段的段基址,并通過傳送指令填充數(shù)據(jù)段、附加段(需要時(shí))基址。代碼段基址由系統(tǒng)自動(dòng)填充。④代碼段內(nèi)第一條可執(zhí)行指令應(yīng)設(shè)置標(biāo)號(hào)(這里為START)。⑤實(shí)現(xiàn)功能指令段從MOVAX,A1開始,至MOVSUM,AX結(jié)束。⑥指令段最后兩條指令為DOS系統(tǒng)功能調(diào)用(INT21H),返回DOS。⑦源程序最后的END語句表示匯編程序到此為止,并指出該程序執(zhí)行的啟動(dòng)地址從START開始。4.280x86宏匯編性語句的增強(qiáng)與擴(kuò)充(1)定義代碼段格式:.CODE功能:說明其下程序?yàn)榇a段內(nèi)容。(2)定義數(shù)據(jù)段格式:.DATA/DATA?/CONST功能:說明其下程序(如變量定義)為數(shù)據(jù)段內(nèi)容。在源程序中,可以多次使用.DATA定義數(shù)據(jù)段;.DATA?表示其下程序是未進(jìn)行初始化的數(shù)據(jù)段;CONST表示其下程序是常量數(shù)據(jù)段。(3)定義堆棧段格式:STACK[長度]功能:說明其下程序?yàn)槎褩6巍iL度表示堆棧段的存儲(chǔ)字節(jié)數(shù),默認(rèn)值為1KB;若段中的數(shù)據(jù)不確定,則以DUP(?)來定義。3.簡化代碼偽指令格式1:.STARTUP功能:該偽指令位于代碼段的開始,自動(dòng)對(duì)DS、SS、SP進(jìn)行初始化。格式2:.EXIT0功能:該偽指令位于代碼段的結(jié)束,用于返回DOS。該指令與下面指令的功能完全相同:MOVAH,4CHINT21H4.3匯編語言程序設(shè)計(jì)基礎(chǔ)及應(yīng)用4.3.1程序設(shè)計(jì)步驟及技術(shù)匯編語言是面向CPU編程的語言。匯編語言程序設(shè)計(jì)除了應(yīng)具有一般程序設(shè)計(jì)的特征外,還應(yīng)具有其自身的特殊性。1.程序設(shè)計(jì)步驟匯編語言程序設(shè)計(jì)一般經(jīng)過以下步驟。①分析問題,明確任務(wù)要求。對(duì)于復(fù)雜的問題,還要將需解決的問題抽象成數(shù)學(xué)模型,即用數(shù)學(xué)表達(dá)式來描述。②確定算法,即根據(jù)實(shí)際問題和指令系統(tǒng)的特點(diǎn),確定完成這一任務(wù)需經(jīng)歷的步驟。③根據(jù)所選擇的算法,確定內(nèi)存單元的分配(使用哪些存儲(chǔ)器單元;使用哪些寄存器;程序運(yùn)行中的中間數(shù)據(jù)及結(jié)果存放在哪些單元),以利于提高程序的效率和運(yùn)行速度。然后制定出解決問題的步驟和順序,畫出程序的流程圖。④根據(jù)流程圖編寫源程序。⑤上機(jī)對(duì)源程序進(jìn)行匯編、連接、仿真、調(diào)試、運(yùn)行。2.程序設(shè)計(jì)技術(shù)在進(jìn)行匯編語言程序設(shè)計(jì)時(shí),程序應(yīng)采用順序、選擇和循環(huán)3種基本結(jié)構(gòu)。

而實(shí)現(xiàn)基本結(jié)構(gòu)的指令語句也有多種不同的形式,因此,在執(zhí)行速度、所占內(nèi)存空間、易讀性和可維護(hù)性等方面有所不同。因此,在進(jìn)行程序設(shè)計(jì)時(shí),應(yīng)注意以下事項(xiàng)和技巧。①把要解決的問題轉(zhuǎn)化成一個(gè)個(gè)具有一定獨(dú)立性的功能模塊,各模塊盡量采用子程序完成其功能。②力求少用無條件轉(zhuǎn)移指令,盡量采用循環(huán)結(jié)構(gòu)。③對(duì)主要的程序段要精心設(shè)計(jì)。如果在一個(gè)重復(fù)執(zhí)行100次的循環(huán)程序中多用了2條指令,或者每次循環(huán)執(zhí)行時(shí)間多用了2個(gè)機(jī)器周期,則整個(gè)循環(huán)就可能要多執(zhí)行200條指令或多執(zhí)行200個(gè)機(jī)器周期,從而使整個(gè)程序運(yùn)行速度大大降低。④一般情況下,數(shù)據(jù)應(yīng)定義在數(shù)據(jù)段,代碼應(yīng)定義在代碼段。程序中應(yīng)根據(jù)問題的復(fù)雜程度設(shè)置訪問數(shù)據(jù)段的尋址方式。尋址方式越復(fù)雜,指令執(zhí)行速度就越慢,但解決復(fù)雜問題的能力越強(qiáng),用簡單尋址方式能解決的問題,就不要用復(fù)雜尋址方式。⑤能用8位數(shù)據(jù)解決的問題就不要使用16位數(shù)據(jù)。⑥在中斷處理程序中,要保護(hù)好現(xiàn)場(包括標(biāo)志寄存器的內(nèi)容),中斷結(jié)束前要恢復(fù)現(xiàn)場。⑦累加器是信息傳遞的樞紐,在調(diào)用子程序時(shí),一般應(yīng)通過累加器傳送子程序的參數(shù),通過累加器向主程序傳送返回參數(shù)。若需保護(hù)累加器的內(nèi)容時(shí),應(yīng)先把累加器的內(nèi)容推入堆棧或存入其他寄存器單元,再調(diào)用子程序。⑧為了保證程序運(yùn)行得安全可靠,應(yīng)考慮使用軟件抗干擾技術(shù),如數(shù)字濾波技術(shù)、指令冗余技術(shù)、軟件陷阱技術(shù)。用匯編語言程序?qū)崿F(xiàn)這些技術(shù),不需要增加硬件成本,可靠性高、穩(wěn)定性好、方便靈活。在用匯編語言編寫程序的過程中,對(duì)于初學(xué)者來說是會(huì)遇到困難的,程序設(shè)計(jì)者只有通過實(shí)踐,不斷積累經(jīng)驗(yàn),才能編寫出較高質(zhì)量的程序。4.3.2順序程序設(shè)計(jì)在所有的程序結(jié)構(gòu)中,順序結(jié)構(gòu)是最簡單的一種,表示在程序中按順序依次執(zhí)行語句,如圖4-3所示?!纠?-4】設(shè)有多項(xiàng)式f(x)=5x3+4x2-3x+21,編程計(jì)算自變量x=6時(shí),函數(shù)f(6)的值??梢园焉鲜睫D(zhuǎn)化成f(x)=[(5x+4)x-3]x+21的形式,以簡化運(yùn)算。DATASEGMENTXDW6RESUDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;設(shè)置DSMOVAX,5MULX;5*X→DX,AXADDAX,4;5X+4→AXMULX;(5X+4)X→DX,AXSUBAX,3;(5X+4)X-3→AXMULX;((5X+4)X-3)X→DX,AXADDAX,21;((5X+4)X-3)+21→AXMOVRESU,AX;保存運(yùn)算結(jié)果MOVAX,4C00H;返回系統(tǒng)INT21HCODEENDSENDSTART4.3.3選擇程序設(shè)計(jì)在設(shè)計(jì)程序時(shí),有時(shí)要根據(jù)條件進(jìn)行不同的處理,計(jì)算機(jī)可根據(jù)給定的條件,進(jìn)行判斷并轉(zhuǎn)向相應(yīng)的處理程序,這種程序結(jié)構(gòu)稱為選擇結(jié)構(gòu)?!纠?-5】比較兩個(gè)無符號(hào)數(shù)(字節(jié)變量A、B)的大小,將其大數(shù)存入MAX單元,流程如圖4-4所示。采用兩操作數(shù)比較指令,根據(jù)指令執(zhí)行結(jié)果對(duì)標(biāo)志位CF的影響,判斷數(shù)據(jù)的大小。源程序如下。DATASEGMENTADB89HBDB98HMAXDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;設(shè)置DSMOVAL,ACMPAL,B;A-B影響標(biāo)志位比較大小JNCNEXT;無借位轉(zhuǎn)至NEXTMOVAL,BNEXT:MOVMAX,AL;大數(shù)存入MAXMOVAH,4CHINT21HCODEENDSENDSTART4.3.4循環(huán)程序設(shè)計(jì)在設(shè)計(jì)程序時(shí),有時(shí)某一程序段要反復(fù)執(zhí)行多次,可以通過循環(huán)結(jié)構(gòu)實(shí)現(xiàn)其操作。計(jì)算機(jī)可根據(jù)循環(huán)操作的條件進(jìn)行判斷。若滿足條件,繼續(xù)執(zhí)行循環(huán)程序,周而復(fù)始,直到條件不滿足時(shí),結(jié)束循環(huán)程序執(zhí)行下一條語句。循環(huán)程序一般包括以下5個(gè)部分。①初始化部分:設(shè)置循環(huán)初始值及循環(huán)體中使用的數(shù)據(jù)初始值等。②循環(huán)體部分:循環(huán)程序要實(shí)現(xiàn)的功能一般應(yīng)重復(fù)執(zhí)行多次。③修改部分:對(duì)循環(huán)體中參加運(yùn)算的數(shù)據(jù)或循環(huán)條件進(jìn)行修改。④控制部分:控制循環(huán)程序按設(shè)定的循環(huán)次數(shù)或條件進(jìn)行正常循環(huán)或結(jié)束循環(huán)。⑤結(jié)果處理:在需要時(shí),對(duì)循環(huán)程序處理數(shù)據(jù)結(jié)果進(jìn)行處理。源程序1(使用轉(zhuǎn)移指令實(shí)現(xiàn)循環(huán))如下。DATASEGMENTRESULTDW?CNEQU100DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVCX,1LP:ADDAX,CXINCCXCMPCX,CNJBELP;使用轉(zhuǎn)移指令實(shí)現(xiàn)循環(huán)MOVRESULT,AXMOVAH,4CHINT21HCODEENDSENDSTART【例4-6】要求用循環(huán)程序?qū)崿F(xiàn)s=1+2+3+4+…+100,將結(jié)果存入RESULT單元。循環(huán)結(jié)構(gòu)流程如圖4-5所示。源程序2(使用循環(huán)指令實(shí)現(xiàn)循環(huán))如下。DATASEGMENTRESULTDW?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVSI,1MOVCX,100LP:ADDAX,SIINCSILOOPLP;循環(huán)指令:CX←(CX)-1,若CX≠0,則轉(zhuǎn)至標(biāo)號(hào)LPMOVRESULT,AXMOVAH,4CHINT21HCODEENDSENDSTART【例4-7】對(duì)數(shù)據(jù)段STRING單元的字符串,以“#”為結(jié)束標(biāo)志,統(tǒng)計(jì)其長度并將結(jié)果存放在LEN單元。源程序如下。DATASEGMENTSTRINGDB"ABCDEFG12345987689H#"STR2DB'HELLO'LENDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;設(shè)置DSMOVSI,OFFSETSTRINGMOVDX,0LOP:MOVAL,[SI]CMPAL,'#'JZLOP1;結(jié)束轉(zhuǎn)至LOP1INCDLINCSIJMPLOP;無條件轉(zhuǎn)至LOP,判斷下一個(gè)字符LOP1:MOVLEN,DXMOVAH,4CHINT21HCODEENDSENDSTART【例4-8】對(duì)數(shù)據(jù)段STRING單元中以“#”為結(jié)束標(biāo)志的字符串中數(shù)字字符的個(gè)數(shù)進(jìn)行統(tǒng)計(jì),將結(jié)果存放在NUMLEN單元中。采用模型方式編程格式的源程序如下。.DATASTRINGDB"ABCDEFG12345987689H#"NUMLENDW?.CODE.STARTUPMOVSI,OFFSETSTRING;獲取字符串的地址,SI指向首字符MOVDX,0;對(duì)計(jì)數(shù)器清0LOP:MOVAL,[SI]CMPAL,'#'JZNEXT;遇到字符串結(jié)束符#,轉(zhuǎn)至NEXTCMPAL,'0'JBNOC;遇到0以下的字符,不計(jì)數(shù),轉(zhuǎn)至NOCCMPAL,'9'JANOC;遇到9以上的字符,不計(jì)數(shù),轉(zhuǎn)至NOCINCDX;對(duì)0~9的字符計(jì)數(shù),轉(zhuǎn)至NOCNOC:INCSI;修改字符指針JMPLOP;無條件轉(zhuǎn)至LOP,判斷下一個(gè)字符NEXT:MOVNUMLEN,DX;存放結(jié)果.EXIT0END4.3.5子程序設(shè)計(jì)為了實(shí)現(xiàn)模塊化程序設(shè)計(jì),往往把具有某一功能的程序段設(shè)計(jì)成一個(gè)獨(dú)立的程序模塊。在需要使用該程序模塊時(shí),可由主程序或其他程序調(diào)用一次或多次,每次執(zhí)行結(jié)束后再返回原來的程序繼續(xù)執(zhí)行,這樣的程序模塊稱為子程序(或稱過程)。子程序可以由過程定義偽指令定義,子程序調(diào)用和返回可以通過指令系統(tǒng)的相關(guān)指令實(shí)現(xiàn)。1.過程定義偽指令偽指令格式:過程名PROC類型子程序體RET過程名ENDP功能:用來定義一個(gè)過程并賦予過程名。若類型為FAR,則為段間調(diào)用和段間返回,即調(diào)用程序和子程序不在同一代碼段內(nèi);若類型為NEAR(或默認(rèn)),則為段內(nèi)調(diào)用和段內(nèi)返回,即調(diào)用程序和子程序在同一代碼段內(nèi)。在代碼段內(nèi)定義延時(shí)子程序:DELAYPROC

FAR

;該子程序可以被段間調(diào)用MOVCX,8A00HLOP:MOVAX,2000HLOP1:DECAXNOPNOPJNZLOP1LOOPLOPRETDELAYENDP一般情況下,調(diào)用程序正在使用的數(shù)據(jù)(如AX等)在子程序運(yùn)行結(jié)束返回后仍需繼續(xù)使用。為此,在調(diào)用子程序前需要對(duì)現(xiàn)場數(shù)據(jù)進(jìn)行保護(hù),返回時(shí)再恢復(fù)現(xiàn)場。這種操作可以在調(diào)用程序完成后進(jìn)行,也可以在執(zhí)行子程序體之前先將有關(guān)寄存器的內(nèi)容推入堆棧,當(dāng)子程序執(zhí)行結(jié)束返回主程序之前,再將其內(nèi)容彈入相應(yīng)的寄存器中。例如:S1PROCNEARPUSHAXPUSHCX子程序體POPCXPOPAXRETS1ENDP在定義子程序時(shí)應(yīng)注意以下方面。①子程序可以在代碼段內(nèi)直接定義,應(yīng)位于可執(zhí)行指令段的最前或最后,但不能插在指令段中間。②若子程序?yàn)镹EAR屬性,則RET指令被匯編為段內(nèi)返回指令,這樣的子程序可以不用過程定義語句,而直接以標(biāo)號(hào)作為子程序的入口。2.子程序調(diào)用與返回指令在已定義子程序的基礎(chǔ)上,程序中可以通過子程序調(diào)用指令調(diào)用該子程序。(1)子程序調(diào)用指令格式:CALL過程名功能:將當(dāng)前調(diào)用程序的斷點(diǎn)CS:IP壓入堆棧保存,然后將子程序地址送入CS:IP,轉(zhuǎn)去執(zhí)行子程序。(2)子程序返回指令格式:RET4.3.6DOS功能調(diào)用及應(yīng)用示例8086可以處理256類中斷,指令中通過中斷類型號(hào)n獲取中斷處理程序的地址,用戶可以直接調(diào)用它們(詳見第7章)。其中軟中斷指令I(lǐng)NT21H(n=21H)為DOS功能調(diào)用,為程序員提供80多個(gè)常用子(功能)程序,每個(gè)子程序賦予一個(gè)功能號(hào),在調(diào)用前將相應(yīng)子程序的功能號(hào)送入累加器的高8位AH中。下面主要介紹INT21H指令的功能和應(yīng)用。DOS功能調(diào)用可在匯編語言程序中直接調(diào)用,調(diào)用步驟如下。①在AH寄存器中設(shè)置調(diào)用子程序的功能號(hào),如AH=4CH。②根據(jù)所調(diào)用的功能號(hào)設(shè)置入口參數(shù)到特定的寄存器中(部分調(diào)用不帶參數(shù))。③執(zhí)行系統(tǒng)功能調(diào)用INT21H指令,轉(zhuǎn)入子程序入口。④子程序運(yùn)行完畢后,得到出口參數(shù)?!纠?-10】功能號(hào)AH=02H,功能:將寄存器DL中的ASCII字符送至顯示器顯示。入口參數(shù):AH=02H,DL的內(nèi)容為字符的ASCII。指令段如下:MOVDL,'A';欲顯示字符MOVAH,2INT21H;顯示器顯示字符“A”【例4-11】功能號(hào)AH=9,功能:將DX的內(nèi)容為當(dāng)前數(shù)據(jù)區(qū)起始地址的字符串送至顯示器顯示,字符串以“$”為結(jié)束標(biāo)志。設(shè)字符串地址為BUF。入口參數(shù):DS:DX為字符串的首地址。程序段如下。LEADX,BUF;BUF為字符串首地址MOVAH,9INT21H【例4-12】某中斷源使用的類型號(hào)n=60H,其中斷處理程序入口地址為INT60H,把它設(shè)置在中斷向量表中。在DOS功能調(diào)用中將AH=25H的功能為設(shè)置中斷向量表,其參數(shù)如下。設(shè)置中斷向量:AH=25H。入口參數(shù):AL=中斷類型號(hào);DS:DX=中斷處理程序的入口地址(要求段地址存入DS,偏移量存入DX)。程序段如下。PUSHDSMOVAX,SEGINT60H;將段基址送入AXMOVDS,AXMOVDX,OFFSETINT60H;將偏移地址送入DXMOVAL,60H;將中斷類型號(hào)送入ALMOVAH,25HINT21H;25H功能調(diào)用POPDS有關(guān)DOS功能調(diào)用其他功能號(hào)的用法參考附錄C4.3.7ROMBIOS中斷調(diào)用及應(yīng)用示例BIOS(BasicI/OSystem)即基本輸入輸出系統(tǒng)。在80x86微機(jī)系統(tǒng)中,BIOS被固化在以0FE000H開始的8KB的ROM區(qū),又稱ROMBIOS。ROMBIOS以中斷方式向用戶提供底層服務(wù)軟件。1.主要功能①驅(qū)動(dòng)系統(tǒng)中所配置的常用外設(shè)(即驅(qū)動(dòng)程序),如顯示器、鍵盤、打印機(jī)、磁盤驅(qū)動(dòng)器、通信接口等。②開機(jī)自檢,引導(dǎo)裝入。③提供時(shí)間、內(nèi)存容量及設(shè)備配置情況等參數(shù)。計(jì)算機(jī)上電時(shí),BIOS自動(dòng)調(diào)入內(nèi)存。2.調(diào)用方法使用BIOS中斷調(diào)用給用戶編程帶來很大便利,程序員不必了解I/O接口的結(jié)構(gòu)和組成的細(xì)節(jié),可直接用指令設(shè)置參數(shù),通過指令I(lǐng)NTn調(diào)用。BIOS中斷處理程序的調(diào)用步驟如下。①將功能號(hào)送入寄存器AH中。②設(shè)置入口參數(shù)。③通過INTn指令調(diào)用BIOS處理程序,n為中斷類型號(hào)。④分析出口參數(shù)及狀態(tài)。部分BIOS中斷調(diào)用見表4-3。例【4-13】BIOS中斷調(diào)用INT16H功能分析。INT16H為鍵盤中斷調(diào)用,其中斷處理程序有3種功能,功能號(hào)為00、01、02。①00號(hào)功能調(diào)用(從鍵盤讀入1個(gè)字符)。指令段如下:MOVAH,00HINT16H;等待(識(shí)別)鍵盤輸入②01號(hào)功能調(diào)用(讀鍵盤緩沖區(qū)的字符)。指令段如下:MOVAH,01HINT16H執(zhí)行后,若ZF=0,表示有鍵按下,輸入字符的ASCII存放在AL中。③02號(hào)功能調(diào)用(讀取特殊功能鍵的狀態(tài))。指令段如下:MOVAH,02HINT16H執(zhí)行后,將特殊功能鍵的狀態(tài)存放在AL中。4.4匯編語言程序的上機(jī)過程及仿真

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論