版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章80x86匯編語言及程序設(shè)計4.1匯編語言的基本語法4.280x86宏匯編指示性語句的增強與擴充4.3匯編語言程序設(shè)計基礎(chǔ)及應(yīng)用4.1匯編語言的基本語法4.1.1匯編語言概述1.匯編語言及特征匯編語言是一種采用助記符表示的機器語言指令,即用助記符來表示指令的操作碼和操作數(shù),用標(biāo)號或符號代表地址、常量或變量。助記符一般是英文單詞的縮寫,因此,相對于機器語言來說,使用匯編語言編寫的程序便于記憶、閱讀,使用方便。用匯編語言編寫的程序,產(chǎn)生的目標(biāo)代碼短、執(zhí)行速度快,可以直接控制系統(tǒng)硬件,具有高級語言不可替代的作用。學(xué)習(xí)匯編語言也是理解和掌握計算機工作原理和過程的主要途徑。但使用匯編語言編寫程序,程序員必須熟悉系統(tǒng)硬件結(jié)構(gòu),且其功能描述不如高級語言直觀,編程效率較低。匯編語言作為一種計算機語言,必然由程序員和計算機都能識別的符號、功能代碼及語法約定來描述。匯編語言主要包括:指令語句、偽指令語句和詞法(語法)。(1)指令語句指令語句是指第3章介紹的由匯編指令構(gòu)成的語句,是計算機可以執(zhí)行的語句。一條指令語句必產(chǎn)生一條相應(yīng)的目標(biāo)代碼,在用匯編語言編寫的源程序中,程序的主要功能是通過指令語句來實現(xiàn)的。(2)偽指令語句偽指令語句是指為了方便用戶設(shè)計程序,由偽指令提供給匯編程序完成的一些操作。偽指令又稱匯編控制指令,它是控制匯編過程的一些命令,即程序員通過偽指令設(shè)置匯編程序進行匯編時的一些操作,主要包括源程序存放的起始地址、定義存儲段及過程等。因此,偽指令不產(chǎn)生機器語言的目標(biāo)代碼,它是匯編語言程序中的不可執(zhí)行語句。(3)詞法詞法用于規(guī)定程序中允許使用的符號、運算符、表達式及程序的結(jié)構(gòu)要求等。程序員必須按照詞法約定編寫程序2.匯編程序用匯編語言編寫的程序稱為源程序。源程序必須翻譯成用機器語言表示的目標(biāo)代碼(亦稱目標(biāo)程序),計算機才能執(zhí)行。其編譯工作可由匯編程序自動完成。匯編程序的功能就是將用匯編語言編寫的源程序翻譯成用機器語言表示的目標(biāo)程序,這一過程稱為匯編(編譯)。3.匯編語言語句語句是程序的基本組成部分,匯編語言源程序中主要包括指令語句、偽指令語句和宏指令語句。(1)指令語句指令語句格式由以下幾個部分組成:[標(biāo)識符:]操作碼[目的操作數(shù)][,源操作數(shù)][;注釋]例如:LOP:MOVAL,DATA1;雙操作數(shù)指令,標(biāo)號LOP為指令地址ADDAL,[2000H];雙操作數(shù)指令DECAL;單操作數(shù)指令NOP;無操作數(shù)指令一條語句應(yīng)在一行內(nèi)完成。(2)偽指令語句偽指令語句格式:[標(biāo)識符]偽操作符[操作數(shù)][;注釋]其中,[]中的項表示可選項。標(biāo)識符:根據(jù)偽指令作用的不同,可以是變量名、段名、過程名及符號常量等。偽操作符:又稱定義符/偽指令助記符,表示偽操作功能,如定義變量名、段名、過程名及符號常量等。標(biāo)識符與偽操作符之間用空格分隔。操作數(shù):又稱偽指令參數(shù),根據(jù)不同的偽指令,可以有一個或多個。例如:DATA1DB30H,31H,32H;定義字節(jié)變量DATA1開始的3個連續(xù)存儲單元DATA2DB33H;定義字節(jié)變量DATA2單元DW1234H;定義字存儲單元PIEQU3.14;定義符號常量(3)宏指令語句宏指令語句是由若干條指令語句形成的語句體。一條宏指令語句的功能相當(dāng)于若干條指令語句的功能。4.1.2匯編語言的數(shù)據(jù)、標(biāo)識符和表達式數(shù)據(jù)是匯編語言語句中操作數(shù)的基本組成部分。匯編語言所能識別的數(shù)據(jù)有常量、變量和標(biāo)識符,并通過不同的運算符組成表達式,以實現(xiàn)對數(shù)據(jù)的加工。1.常量在程序中,數(shù)據(jù)固定不變的值稱為常量。(1)數(shù)值常量數(shù)值常量的表示形式有二進制數(shù)、八進制數(shù)、十六進制數(shù)、十進制數(shù),其后分別跟字母B、O、H、D(十進制數(shù)可省略D)。十六進制數(shù)以A~F開頭時,前面加數(shù)字0,以避免和操作碼混淆。
例如:0010111B、1234H、0FFFFH、121O。常量可以是數(shù)值,也可以是名字。用名字表示的常量稱為符號常量。在編程時,符號常量可使用偽指令“EQU”進行定義。例如:CNTEQU100;CNT為符號常量,等值100(2)字符串常量字符串常量是由包含在引號中的若干個字符組成的。字符串在計算機中存儲的是相應(yīng)字符的ASCII。如“A”的值是41H,“AB”的值是4142H等。2.變量變量是在程序運行過程中可隨時改變的量,它實際上是存儲器的某一個數(shù)據(jù)存儲單元。對變量的訪問就是對這個存儲單元的訪問。在程序中是通過變量名的形式來實現(xiàn)對存儲單元的操作的。變量名被稱為存放數(shù)據(jù)的存儲單元的符號地址。變量有以下3個屬性。①段屬性:指變量所表示的存儲單元所在段的段基址。②偏移地址屬性:指變量所表示的存儲單元地址與段基址之間的偏移量。③類型屬性:指變量占用存儲單元的字節(jié)數(shù)。變量可分為字節(jié)變量、字變量和雙字變量。字節(jié)變量為1個字節(jié)單元,類型為BYTE;字變量為2個字節(jié)單元,類型為WORD;雙字變量為4個字節(jié)單元,類型為DWORD。3.標(biāo)識符標(biāo)識符就是符號名稱,標(biāo)識符在源程序中可以表示標(biāo)號、變量、常量、過程名、段名等。標(biāo)識符必須是大小寫英文字母、數(shù)字及一些特殊符號的組合指令語句中的標(biāo)號表示該指令的符號地址,它可作為轉(zhuǎn)移類指令的操作數(shù),以確定程序轉(zhuǎn)移的目標(biāo)地址。標(biāo)號有以下3個屬性。①標(biāo)號所在段必定是代碼段。②標(biāo)號所在地址與段基址之間的偏移量為16位無符號數(shù)。③當(dāng)標(biāo)號只允許作為段內(nèi)轉(zhuǎn)移或調(diào)用指令的目標(biāo)地址時,類型為NEAR;當(dāng)標(biāo)號可作為段間轉(zhuǎn)移或調(diào)用指令的目標(biāo)地址時,類型為FAR。偽指令語句中的標(biāo)識符可作為常量、變量名等數(shù)據(jù)參加運算,也可作為段名及過程名等4.運算符和表達式用運算符把常量、變量或標(biāo)識符組合起來的式子就是表達式,由匯編程序在匯編時對其進行運算,得到的是運算結(jié)果數(shù)據(jù)。運算符主要包括算術(shù)運算符、邏輯運算符、關(guān)系運算符、分析運算符和屬性運算符5種類型。(1)算術(shù)運算符算術(shù)運算符包括+(加)、-(減)、*(乘)、/(除)、MOD(模除),參加運算的數(shù)和運算結(jié)果均為整數(shù)。例如,用匯編語言描述的程序為:MOVAL,10H*2;在匯編時完成源操作數(shù)10H*2ADDAL,7MOD2;在匯編時完成7MOD2=1(2)邏輯運算符邏輯運算符包括AND(與)、OR(或)、XOR(異或)、NOT(非),其作用是對操作數(shù)進行按位操作,其結(jié)果不影響標(biāo)志位。必須注意到,邏輯運算符與邏輯運算指令中的助記符完全相同,但由邏輯運算符組成的表達式只能作為指令的操作數(shù)部分,在匯編時完成邏輯運算,其結(jié)果自然不影響標(biāo)志位;邏輯運算指令中,邏輯運算助記符出現(xiàn)在指令的操作碼部分,在執(zhí)行目標(biāo)代碼(指令)時完成邏輯運算,其結(jié)果影響狀態(tài)標(biāo)志位。(3)關(guān)系運算符關(guān)系運算符包括EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)共6種,該運算符可實現(xiàn)兩個數(shù)據(jù)的比較運算。若關(guān)系成立,結(jié)果為全1(邏輯真),否則為全0(邏輯假)。(4)分析運算符分析運算符的運算對象必須為變量或標(biāo)號,運算符總是加在運算對象之前。它可以將變量或標(biāo)號的屬性(如段、偏移量、類型)分離出來①SEG運算符。根據(jù)SEG運算符組成的表達式可以得到該變量或標(biāo)號所在段的段基址。例如:MOVBX,SEGDATA②OFFSET運算符。根據(jù)OFFSET運算符組成的表達式可以得到該變量或標(biāo)號在段內(nèi)的偏移地址。例如:MOVSI,OFFSETSOURCE在該例中,倘若變量SOURCE在數(shù)據(jù)段內(nèi)的偏移地址是1200H,則該指令執(zhí)行的結(jié)果為(SI)=1200H。該指令與指令LEASI,SOURCE等價。③TYPE運算符。根據(jù)TYPE運算符組成的表達式可以得到該變量或標(biāo)號的類型屬性。當(dāng)其加在標(biāo)號之前時,可以得到這個標(biāo)號的類型屬性。④LENGTH運算符。根據(jù)LENGTH運算符組成的表達式可以得到分配給變量的連續(xù)單元的個數(shù)(也稱為數(shù)組)。該運算符只針對用DUP重復(fù)操作符定義的數(shù)組產(chǎn)生正確結(jié)果。例如:DATA1DW20HDUP(0)MOVAL,LENGTHDATA1;匯編后為MOVAL,20H⑤SIZE運算符。根據(jù)SIZE運算符組成的表達式可以得到分配給變量所占有的總字節(jié)數(shù)。(5)屬性運算符變量、標(biāo)號或地址表達式的屬性可以用一些運算符來修改。①PTR運算符。PTR運算符用來指定或臨時修改某個變量、標(biāo)號或地址表達式的類型或距離屬性,它們原來的屬性不變。類型可以是:BYTE、WORD、DWORD、NEAR或FAR。例如:DATADB12H,34H,56,78HINCBYTEPTR[DI];指明目的操作數(shù)為字節(jié)類型MOVAX,WORDPTRDATA;臨時修改DATA為字類型,(AX)=3412HJMPDWORDPTR[BX];指明為段間轉(zhuǎn)移②段前綴“:”運算符。該運算符的作用是指定變量、標(biāo)號或地址表達式所在的段。例如:MOVAX,ES:[BX];用附加段ES取代默認的數(shù)據(jù)段DS③SHORT運算符。SHORT運算符用于說明轉(zhuǎn)移指令的目標(biāo)地址的屬性,取值范圍為-128~127。例如:JMPSHORTLP另外,還有用于改變運算符優(yōu)先級的圓括號運算符和用于變量下標(biāo)或地址表達式的方括號運算符等。4.1.3偽指令語句偽指令語句(又稱指示性語句)通過各種偽操作命令,為匯編程序提供一些信息,在匯編過程中實現(xiàn)數(shù)據(jù)定義、分配存儲區(qū)、段定義、過程定義等功能。使用偽指令語句的目的是正確地把可執(zhí)行的指令性語句翻譯成相應(yīng)的機器指令代碼。本節(jié)介紹在匯編語言源程序中常用的一些匯編偽指令語句。1.符號定義偽指令語句符號定義偽指令有“EQU”等值偽指令和“=”偽指令兩種。(1)“EQU”等值偽指令格式:符號名EQU表達式功能:符號定義偽指令指給一個標(biāo)識符號賦予一個常量、表達式或其他符號名,是一種等值偽操作命令。例如:HUNDEREQU100;定義符號常量HUNDER替代100NUMEQUHUNDER*2;定義NUM替代數(shù)值表達式HUNDER*2AEQUAX;定義符號A替代AX2.?dāng)?shù)據(jù)定義偽指令語句數(shù)據(jù)定義偽指令的作用是為數(shù)據(jù)分配一定的存儲單元,并為這些存儲單元的起始單元定義一個變量名。(1)定義字節(jié)變量偽指令格式:[變量名]DB表達式或數(shù)據(jù)項表功能:將表達式或數(shù)據(jù)項表的數(shù)據(jù)按字節(jié)依次連續(xù)地存放到以[變量名]開始的存儲單元中。存儲單元的地址是遞增的。例如:ADB30H,31H,32H,33H,34H;定義從變量A開始的連續(xù)10個字節(jié)單元(數(shù)組)DB35H,36H,37H,38H,39H;A~A+9單元依次存放30H~39HBDB100DUP(?);定義從變量B開始的100個字節(jié)單元,內(nèi)容不定CDB64H;定義變量C單元內(nèi)容為64HSDB'ABCDEF';定義變量S(數(shù)組S)為連續(xù)6個字節(jié)單元,存放字符串3.程序分段定義偽指令語句(1)段定義偽指令格式:段名SEGMENT[定位類型,][組合類型,][類別名]…指令語句序列…段名ENDS功能:定義數(shù)據(jù)段、代碼段、堆棧段、附件段。段名用來指出為該段分配的存儲器起始地址。3個參數(shù)任選,其作用解釋如下。①定位類型。定位類型表示某段裝入內(nèi)存時,對段的起始邊界的要求。若定位類型為BYTE,表示本段起始單元可以從任一地址開始,段間不留空隙。若定位類型為WORD,表示本段起始單元是一個偶地址。若定位類型為PARA,表示本段起始單元地址一定能被16整除(系統(tǒng)默認定位類型)。若定位類型為PAGE,表示本段起始單元地址一定能被256整除。②組合類型。組合類型表示多個程序模塊連接時,本模塊與其他模塊的同名段的組合類型。若組合類型為NONE,表示本段與其他段無組合關(guān)系(系統(tǒng)默認組合類型)。若組合類型為PUBLIC,表示本段和其他同名同類段重新連接成一個新邏輯段。若組合類型為COMMON,表示把兩個段設(shè)置成相同的起始地址。若組合類型為STACK,表示本段為堆棧段,把所有同名段連接成一個段,自動初始化SS和SP。③類別名。類別名是用單引號標(biāo)識的字符串,連接時把類別名相同的所有段存放在連續(xù)的存儲區(qū)內(nèi)。
(2)ASSUME段分配偽指令格式:ASSUME段寄存器:段名,[段寄存器:段名,][段寄存器:段名]功能:通知匯編程序設(shè)置CS、DS、SS、ES為哪些段的段基址寄存器。該指令只說明段名和段寄存器的關(guān)系,并未把段基址裝入對應(yīng)的寄存器。段寄存器DS、ES、SS的裝入一般由程序?qū)崿F(xiàn),而CS的裝入是系統(tǒng)自動完成的。4.定位操作偽指令語句(1)定位偽指令格式:ORG數(shù)值表達式功能:指出ORG后面的指令語句或數(shù)據(jù)區(qū)從數(shù)值表達式(地址偏移量)所確定的存儲單元開始存放。例如:CSEGSEGMENTORG2000H;從2000H開始存放“HELLO”D1DB'HELLO'CSEGENDS(2)當(dāng)前位置計數(shù)器$$表示當(dāng)前地址,即在匯編時為程序分配下一個存儲單元的偏移地址。它可以在表達式中使用。
例如:D1DB'abcdefghijk'LENEQU$-D1;LEN為字符串長度4.1.5完整的匯編語言源程序結(jié)構(gòu)下面給出的是一個簡單的完整匯編語言源程序及程序注釋。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),整個程序是由存儲段組成的。80x86宏匯編語言規(guī)定,源程序至少包含一個代碼段。一般情況下,源程序可根據(jù)需要由代碼段、數(shù)據(jù)段、堆棧段和附加段組成。每個段在程序中的位置沒有限制。本例中,源程序定義了數(shù)據(jù)段(段名為DATA)、堆棧段(段名為STACK)、代碼段(段名為CODE)。②程序中需要處理和存儲的數(shù)據(jù)應(yīng)存儲在數(shù)據(jù)段,指令存儲在代碼段。③代碼段內(nèi)用ASSUME
偽指令說明段寄存器為某一段的段基址,并通過傳送指令填充數(shù)據(jù)段、附加段(需要時)基址。代碼段基址由系統(tǒng)自動填充。④代碼段內(nèi)第一條可執(zhí)行指令應(yīng)設(shè)置標(biāo)號(這里為START)。⑤實現(xiàn)功能指令段從MOVAX,A1開始,至MOVSUM,AX結(jié)束。⑥指令段最后兩條指令為DOS系統(tǒng)功能調(diào)用(INT21H),返回DOS。⑦源程序最后的END語句表示匯編程序到此為止,并指出該程序執(zhí)行的啟動地址從START開始。4.280x86宏匯編性語句的增強與擴充(1)定義代碼段格式:.CODE功能:說明其下程序為代碼段內(nèi)容。(2)定義數(shù)據(jù)段格式:.DATA/DATA?/CONST功能:說明其下程序(如變量定義)為數(shù)據(jù)段內(nèi)容。在源程序中,可以多次使用.DATA定義數(shù)據(jù)段;.DATA?表示其下程序是未進行初始化的數(shù)據(jù)段;CONST表示其下程序是常量數(shù)據(jù)段。(3)定義堆棧段格式:STACK[長度]功能:說明其下程序為堆棧段。長度表示堆棧段的存儲字節(jié)數(shù),默認值為1KB;若段中的數(shù)據(jù)不確定,則以DUP(?)來定義。3.簡化代碼偽指令格式1:.STARTUP功能:該偽指令位于代碼段的開始,自動對DS、SS、SP進行初始化。格式2:.EXIT0功能:該偽指令位于代碼段的結(jié)束,用于返回DOS。該指令與下面指令的功能完全相同:MOVAH,4CHINT21H4.3匯編語言程序設(shè)計基礎(chǔ)及應(yīng)用4.3.1程序設(shè)計步驟及技術(shù)匯編語言是面向CPU編程的語言。匯編語言程序設(shè)計除了應(yīng)具有一般程序設(shè)計的特征外,還應(yīng)具有其自身的特殊性。1.程序設(shè)計步驟匯編語言程序設(shè)計一般經(jīng)過以下步驟。①分析問題,明確任務(wù)要求。對于復(fù)雜的問題,還要將需解決的問題抽象成數(shù)學(xué)模型,即用數(shù)學(xué)表達式來描述。②確定算法,即根據(jù)實際問題和指令系統(tǒng)的特點,確定完成這一任務(wù)需經(jīng)歷的步驟。③根據(jù)所選擇的算法,確定內(nèi)存單元的分配(使用哪些存儲器單元;使用哪些寄存器;程序運行中的中間數(shù)據(jù)及結(jié)果存放在哪些單元),以利于提高程序的效率和運行速度。然后制定出解決問題的步驟和順序,畫出程序的流程圖。④根據(jù)流程圖編寫源程序。⑤上機對源程序進行匯編、連接、仿真、調(diào)試、運行。2.程序設(shè)計技術(shù)在進行匯編語言程序設(shè)計時,程序應(yīng)采用順序、選擇和循環(huán)3種基本結(jié)構(gòu)。
而實現(xiàn)基本結(jié)構(gòu)的指令語句也有多種不同的形式,因此,在執(zhí)行速度、所占內(nèi)存空間、易讀性和可維護性等方面有所不同。因此,在進行程序設(shè)計時,應(yīng)注意以下事項和技巧。①把要解決的問題轉(zhuǎn)化成一個個具有一定獨立性的功能模塊,各模塊盡量采用子程序完成其功能。②力求少用無條件轉(zhuǎn)移指令,盡量采用循環(huán)結(jié)構(gòu)。③對主要的程序段要精心設(shè)計。如果在一個重復(fù)執(zhí)行100次的循環(huán)程序中多用了2條指令,或者每次循環(huán)執(zhí)行時間多用了2個機器周期,則整個循環(huán)就可能要多執(zhí)行200條指令或多執(zhí)行200個機器周期,從而使整個程序運行速度大大降低。④一般情況下,數(shù)據(jù)應(yīng)定義在數(shù)據(jù)段,代碼應(yīng)定義在代碼段。程序中應(yīng)根據(jù)問題的復(fù)雜程度設(shè)置訪問數(shù)據(jù)段的尋址方式。尋址方式越復(fù)雜,指令執(zhí)行速度就越慢,但解決復(fù)雜問題的能力越強,用簡單尋址方式能解決的問題,就不要用復(fù)雜尋址方式。⑤能用8位數(shù)據(jù)解決的問題就不要使用16位數(shù)據(jù)。⑥在中斷處理程序中,要保護好現(xiàn)場(包括標(biāo)志寄存器的內(nèi)容),中斷結(jié)束前要恢復(fù)現(xiàn)場。⑦累加器是信息傳遞的樞紐,在調(diào)用子程序時,一般應(yīng)通過累加器傳送子程序的參數(shù),通過累加器向主程序傳送返回參數(shù)。若需保護累加器的內(nèi)容時,應(yīng)先把累加器的內(nèi)容推入堆?;虼嫒肫渌拇嫫鲉卧?,再調(diào)用子程序。⑧為了保證程序運行得安全可靠,應(yīng)考慮使用軟件抗干擾技術(shù),如數(shù)字濾波技術(shù)、指令冗余技術(shù)、軟件陷阱技術(shù)。用匯編語言程序?qū)崿F(xiàn)這些技術(shù),不需要增加硬件成本,可靠性高、穩(wěn)定性好、方便靈活。在用匯編語言編寫程序的過程中,對于初學(xué)者來說是會遇到困難的,程序設(shè)計者只有通過實踐,不斷積累經(jīng)驗,才能編寫出較高質(zhì)量的程序。4.3.2順序程序設(shè)計在所有的程序結(jié)構(gòu)中,順序結(jié)構(gòu)是最簡單的一種,表示在程序中按順序依次執(zhí)行語句,如圖4-3所示?!纠?-4】設(shè)有多項式f(x)=5x3+4x2-3x+21,編程計算自變量x=6時,函數(shù)f(6)的值??梢园焉鲜睫D(zhuǎn)化成f(x)=[(5x+4)x-3]x+21的形式,以簡化運算。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;保存運算結(jié)果MOVAX,4C00H;返回系統(tǒng)INT21HCODEENDSENDSTART4.3.3選擇程序設(shè)計在設(shè)計程序時,有時要根據(jù)條件進行不同的處理,計算機可根據(jù)給定的條件,進行判斷并轉(zhuǎn)向相應(yīng)的處理程序,這種程序結(jié)構(gòu)稱為選擇結(jié)構(gòu)?!纠?-5】比較兩個無符號數(shù)(字節(jié)變量A、B)的大小,將其大數(shù)存入MAX單元,流程如圖4-4所示。采用兩操作數(shù)比較指令,根據(jù)指令執(zhí)行結(jié)果對標(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è)計在設(shè)計程序時,有時某一程序段要反復(fù)執(zhí)行多次,可以通過循環(huán)結(jié)構(gòu)實現(xiàn)其操作。計算機可根據(jù)循環(huán)操作的條件進行判斷。若滿足條件,繼續(xù)執(zhí)行循環(huán)程序,周而復(fù)始,直到條件不滿足時,結(jié)束循環(huán)程序執(zhí)行下一條語句。循環(huán)程序一般包括以下5個部分。①初始化部分:設(shè)置循環(huán)初始值及循環(huán)體中使用的數(shù)據(jù)初始值等。②循環(huán)體部分:循環(huán)程序要實現(xiàn)的功能一般應(yīng)重復(fù)執(zhí)行多次。③修改部分:對循環(huán)體中參加運算的數(shù)據(jù)或循環(huán)條件進行修改。④控制部分:控制循環(huán)程序按設(shè)定的循環(huán)次數(shù)或條件進行正常循環(huán)或結(jié)束循環(huán)。⑤結(jié)果處理:在需要時,對循環(huán)程序處理數(shù)據(jù)結(jié)果進行處理。源程序1(使用轉(zhuǎn)移指令實現(xiàn)循環(huán))如下。DATASEGMENTRESULTDW?CNEQU100DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVCX,1LP:ADDAX,CXINCCXCMPCX,CNJBELP;使用轉(zhuǎn)移指令實現(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)指令實現(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)號LPMOVRESULT,AXMOVAH,4CHINT21HCODEENDSENDSTART【例4-7】對數(shù)據(jù)段STRING單元的字符串,以“#”為結(jié)束標(biāo)志,統(tǒng)計其長度并將結(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,判斷下一個字符LOP1:MOVLEN,DXMOVAH,4CHINT21HCODEENDSENDSTART【例4-8】對數(shù)據(jù)段STRING單元中以“#”為結(jié)束標(biāo)志的字符串中數(shù)字字符的個數(shù)進行統(tǒng)計,將結(jié)果存放在NUMLEN單元中。采用模型方式編程格式的源程序如下。.DATASTRINGDB"ABCDEFG12345987689H#"NUMLENDW?.CODE.STARTUPMOVSI,OFFSETSTRING;獲取字符串的地址,SI指向首字符MOVDX,0;對計數(shù)器清0LOP:MOVAL,[SI]CMPAL,'#'JZNEXT;遇到字符串結(jié)束符#,轉(zhuǎn)至NEXTCMPAL,'0'JBNOC;遇到0以下的字符,不計數(shù),轉(zhuǎn)至NOCCMPAL,'9'JANOC;遇到9以上的字符,不計數(shù),轉(zhuǎn)至NOCINCDX;對0~9的字符計數(shù),轉(zhuǎn)至NOCNOC:INCSI;修改字符指針JMPLOP;無條件轉(zhuǎn)至LOP,判斷下一個字符NEXT:MOVNUMLEN,DX;存放結(jié)果.EXIT0END4.3.5子程序設(shè)計為了實現(xiàn)模塊化程序設(shè)計,往往把具有某一功能的程序段設(shè)計成一個獨立的程序模塊。在需要使用該程序模塊時,可由主程序或其他程序調(diào)用一次或多次,每次執(zhí)行結(jié)束后再返回原來的程序繼續(xù)執(zhí)行,這樣的程序模塊稱為子程序(或稱過程)。子程序可以由過程定義偽指令定義,子程序調(diào)用和返回可以通過指令系統(tǒng)的相關(guān)指令實現(xiàn)。1.過程定義偽指令偽指令格式:過程名PROC類型子程序體RET過程名ENDP功能:用來定義一個過程并賦予過程名。若類型為FAR,則為段間調(diào)用和段間返回,即調(diào)用程序和子程序不在同一代碼段內(nèi);若類型為NEAR(或默認),則為段內(nèi)調(diào)用和段內(nèi)返回,即調(diào)用程序和子程序在同一代碼段內(nèi)。在代碼段內(nèi)定義延時子程序:DELAYPROC
FAR
;該子程序可以被段間調(diào)用MOVCX,8A00HLOP:MOVAX,2000HLOP1:DECAXNOPNOPJNZLOP1LOOPLOPRETDELAYENDP一般情況下,調(diào)用程序正在使用的數(shù)據(jù)(如AX等)在子程序運行結(jié)束返回后仍需繼續(xù)使用。為此,在調(diào)用子程序前需要對現(xiàn)場數(shù)據(jù)進行保護,返回時再恢復(fù)現(xiàn)場。這種操作可以在調(diào)用程序完成后進行,也可以在執(zhí)行子程序體之前先將有關(guān)寄存器的內(nèi)容推入堆棧,當(dāng)子程序執(zhí)行結(jié)束返回主程序之前,再將其內(nèi)容彈入相應(yīng)的寄存器中。例如:S1PROCNEARPUSHAXPUSHCX子程序體POPCXPOPAXRETS1ENDP在定義子程序時應(yīng)注意以下方面。①子程序可以在代碼段內(nèi)直接定義,應(yīng)位于可執(zhí)行指令段的最前或最后,但不能插在指令段中間。②若子程序為NEAR屬性,則RET指令被匯編為段內(nèi)返回指令,這樣的子程序可以不用過程定義語句,而直接以標(biāo)號作為子程序的入口。2.子程序調(diào)用與返回指令在已定義子程序的基礎(chǔ)上,程序中可以通過子程序調(diào)用指令調(diào)用該子程序。(1)子程序調(diào)用指令格式:CALL過程名功能:將當(dāng)前調(diào)用程序的斷點CS:IP壓入堆棧保存,然后將子程序地址送入CS:IP,轉(zhuǎn)去執(zhí)行子程序。(2)子程序返回指令格式:RET4.3.6DOS功能調(diào)用及應(yīng)用示例8086可以處理256類中斷,指令中通過中斷類型號n獲取中斷處理程序的地址,用戶可以直接調(diào)用它們(詳見第7章)。其中軟中斷指令I(lǐng)NT21H(n=21H)為DOS功能調(diào)用,為程序員提供80多個常用子(功能)程序,每個子程序賦予一個功能號,在調(diào)用前將相應(yīng)子程序的功能號送入累加器的高8位AH中。下面主要介紹INT21H指令的功能和應(yīng)用。DOS功能調(diào)用可在匯編語言程序中直接調(diào)用,調(diào)用步驟如下。①在AH寄存器中設(shè)置調(diào)用子程序的功能號,如AH=4CH。②根據(jù)所調(diào)用的功能號設(shè)置入口參數(shù)到特定的寄存器中(部分調(diào)用不帶參數(shù))。③執(zhí)行系統(tǒng)功能調(diào)用INT21H指令,轉(zhuǎn)入子程序入口。④子程序運行完畢后,得到出口參數(shù)?!纠?-10】功能號AH=02H,功能:將寄存器DL中的ASCII字符送至顯示器顯示。入口參數(shù):AH=02H,DL的內(nèi)容為字符的ASCII。指令段如下:MOVDL,'A';欲顯示字符MOVAH,2INT21H;顯示器顯示字符“A”【例4-11】功能號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】某中斷源使用的類型號n=60H,其中斷處理程序入口地址為INT60H,把它設(shè)置在中斷向量表中。在DOS功能調(diào)用中將AH=25H的功能為設(shè)置中斷向量表,其參數(shù)如下。設(shè)置中斷向量:AH=25H。入口參數(shù):AL=中斷類型號;DS:DX=中斷處理程序的入口地址(要求段地址存入DS,偏移量存入DX)。程序段如下。PUSHDSMOVAX,SEGINT60H;將段基址送入AXMOVDS,AXMOVDX,OFFSETINT60H;將偏移地址送入DXMOVAL,60H;將中斷類型號送入ALMOVAH,25HINT21H;25H功能調(diào)用POPDS有關(guān)DOS功能調(diào)用其他功能號的用法參考附錄C4.3.7ROMBIOS中斷調(diào)用及應(yīng)用示例BIOS(BasicI/OSystem)即基本輸入輸出系統(tǒng)。在80x86微機系統(tǒng)中,BIOS被固化在以0FE000H開始的8KB的ROM區(qū),又稱ROMBIOS。ROMBIOS以中斷方式向用戶提供底層服務(wù)軟件。1.主要功能①驅(qū)動系統(tǒng)中所配置的常用外設(shè)(即驅(qū)動程序),如顯示器、鍵盤、打印機、磁盤驅(qū)動器、通信接口等。②開機自檢,引導(dǎo)裝入。③提供時間、內(nèi)存容量及設(shè)備配置情況等參數(shù)。計算機上電時,BIOS自動調(diào)入內(nèi)存。2.調(diào)用方法使用BIOS中斷調(diào)用給用戶編程帶來很大便利,程序員不必了解I/O接口的結(jié)構(gòu)和組成的細節(jié),可直接用指令設(shè)置參數(shù),通過指令I(lǐng)NTn調(diào)用。BIOS中斷處理程序的調(diào)用步驟如下。①將功能號送入寄存器AH中。②設(shè)置入口參數(shù)。③通過INTn指令調(diào)用BIOS處理程序,n為中斷類型號。④分析出口參數(shù)及狀態(tài)。部分BIOS中斷調(diào)用見表4-3。例【4-13】BIOS中斷調(diào)用INT16H功能分析。INT16H為鍵盤中斷調(diào)用,其中斷處理程序有3種功能,功能號為00、01、02。①00號功能調(diào)用(從鍵盤讀入1個字符)。指令段如下:MOVAH,00HINT16H;等待(識別)鍵盤輸入②01號功能調(diào)用(讀鍵盤緩沖區(qū)的字符)。指令段如下:MOVAH,01HINT16H執(zhí)行后,若ZF=0,表示有鍵按下,輸入字符的ASCII存放在AL中。③02號功能調(diào)用(讀取特殊功能鍵的狀態(tài))。指令段如下:MOVAH,02HINT16H執(zhí)行后,將特殊功能鍵的狀態(tài)存放在AL中。4.4匯編語言程序的上機過程及仿真
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智慧校園宿管員綜合服務(wù)聘用合同范本4篇
- 個性化服務(wù)協(xié)議模板 2024全新出爐版B版
- 2025年度教育機構(gòu)場地租賃及設(shè)施共建合同4篇
- 2025年度新能源汽車充電樁研發(fā)與運營合同3篇
- 二零二五版智能法律助手APP下載與法律服務(wù)套餐協(xié)議3篇
- 專業(yè)空調(diào)安裝協(xié)議2024年細則版A版
- 2024美發(fā)行業(yè)專屬勞動協(xié)議樣例版
- 二零二四外幣資金借貸風(fēng)險監(jiān)控及應(yīng)對策略合同3篇
- 專項商鋪投資預(yù)訂協(xié)議:2024認籌細則
- 二零二四商鋪物業(yè)管理與設(shè)施升級改造合同2篇
- 2024年石家莊正定國際機場改擴建工程合同
- 2025年度愛讀書學(xué)長定制化閱讀計劃合同2篇
- 江西省港口集團有限公司招聘筆試沖刺題2025
- 河南省信陽市浉河區(qū)9校聯(lián)考2024-2025學(xué)年八年級上學(xué)期12月月考地理試題(含答案)
- 火災(zāi)安全教育觀后感
- 農(nóng)村自建房屋安全協(xié)議書
- 快速康復(fù)在骨科護理中的應(yīng)用
- 國民經(jīng)濟行業(yè)分類和代碼表(電子版)
- ICU患者外出檢查的護理
- 公司收購設(shè)備合同范例
- 廣東省潮州市2023-2024學(xué)年高二上學(xué)期語文期末考試試卷(含答案)
評論
0/150
提交評論