G第4章匯編語(yǔ)言設(shè)計(jì)_第1頁(yè)
G第4章匯編語(yǔ)言設(shè)計(jì)_第2頁(yè)
G第4章匯編語(yǔ)言設(shè)計(jì)_第3頁(yè)
G第4章匯編語(yǔ)言設(shè)計(jì)_第4頁(yè)
G第4章匯編語(yǔ)言設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩84頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

4.1.1概述一、匯編語(yǔ)言的基本概念1、機(jī)器語(yǔ)言:由0、1代碼所組成的語(yǔ)言。面向機(jī)器,同一組代碼對(duì)不同的計(jì)算機(jī)表示不同的含義。2、匯編語(yǔ)言:由助記符表示的語(yǔ)言。面向機(jī)器。3、高級(jí)語(yǔ)言:用一些接近人們書寫習(xí)慣的英語(yǔ)和數(shù)學(xué)表達(dá)式形式的句子編寫程序。這種語(yǔ)言不面向機(jī)器,而是面向過(guò)程、面向?qū)ο??!?.1MASM宏匯編程序第四章匯編語(yǔ)言程序設(shè)計(jì)1二、匯編語(yǔ)言程序的結(jié)構(gòu)形式例:在屏幕上顯示字符串“GoodMorning!”DATA SEGMENT ;數(shù)據(jù)段MES DB‘GoodMorning!’ DB0DH,0AH,’$’DATA ENDSSTACK SEGMENT ;堆棧段ST1 DB200DUP(?)STACK ENDS2CODE SEGMENT ;代碼段MAIN PROCFAR ASSUMECS:CODE,DS:DATA,SS:STACK

START: MOVAX,STACK MOVSS,AX

PUSHDS ;保護(hù)PSP段地址 MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVDX,OFFSETMES MOVAH,9 INT21H

RET;返回到PSP開始處MAIN ENDPCODE ENDSEND START3PSP說(shuō)明 用連接程序?qū)δ繕?biāo)程序(OBJ文件)進(jìn)行連接和定位時(shí),操作系統(tǒng)為每個(gè)程序建立了一個(gè)程序段前綴PSP,其長(zhǎng)度為256字節(jié)。主要用于存放所要執(zhí)行程序的有關(guān)信息,同時(shí)也提供了程序與操作系統(tǒng)的接口。在PSP的開始處(偏移地址0000H)安排了一條指令I(lǐng)NT20H。執(zhí)行該指令即可返回到DOS。DOS在建立了程序段前綴PSP后,就將要執(zhí)行的程序從磁盤裝入內(nèi)存。在定位時(shí),代碼段在PSP之后,然后是數(shù)據(jù)段、堆棧段。在程序開始時(shí),DS指向PSP所在段。ES也不指向用戶的附加段,因此,在程序開始處,用指令將DS、ES、SS等指向用戶所設(shè)計(jì)的段。(其中SS段可省略)45三、匯編語(yǔ)言的語(yǔ)句格式1、指令性語(yǔ)句是執(zhí)行語(yǔ)句,以機(jī)器指令作基礎(chǔ),與機(jī)器指令相對(duì)應(yīng)。匯編程序可將它翻譯成目標(biāo)代碼(機(jī)器指令)。CPU可以執(zhí)行。指令性語(yǔ)句只能出現(xiàn)在代碼段中。語(yǔ)句格式:標(biāo)號(hào):指令助記符操作數(shù),操作數(shù);注釋2、指示性語(yǔ)句(偽指令語(yǔ)句)是說(shuō)明性語(yǔ)句。它沒有對(duì)應(yīng)的目標(biāo)代碼。匯編程序匯編源程序時(shí)對(duì)偽指令語(yǔ)句進(jìn)行處理。它完成對(duì)數(shù)據(jù)的定義、段塊定義、存儲(chǔ)區(qū)分配等操作,完成匯編控制。語(yǔ)句格式:名字偽指令助記符操作數(shù),操作數(shù);注釋64.1.2MASM宏匯編程序 匯編語(yǔ)言彌補(bǔ)了機(jī)器語(yǔ)言的不足,它用助記符來(lái)書寫指令,地址、數(shù)據(jù)也可以用符號(hào)表示,與機(jī)器語(yǔ)言相比,編寫、閱讀、修改都比較方便,但它不能直接運(yùn)行,必須將它翻譯成機(jī)器語(yǔ)言CPU才能運(yùn)行。執(zhí)行翻譯工作的程序,稱為匯編程序。不同匯編程序?qū)?yīng)的匯編語(yǔ)言語(yǔ)法、程序結(jié)構(gòu)、書寫方式、偽指令等都不同。一、基本匯編程序ASM 匯編程序是最早也是最成熟的一種系統(tǒng)軟件,它除了能夠?qū)R編語(yǔ)言源程序翻譯成機(jī)器語(yǔ)言程序這一主要功能外,還能夠根據(jù)用戶的要求自動(dòng)分配存儲(chǔ)區(qū)域,包括程序區(qū)、數(shù)據(jù)區(qū)、暫存區(qū)等;自動(dòng)把各種進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù),把字符轉(zhuǎn)換成ASCII7碼,計(jì)算表達(dá)式的值等;自動(dòng)對(duì)源程序進(jìn)行檢查,給出錯(cuò)誤信息,如非法格式、未定義的助記符、標(biāo)號(hào)、漏掉操作數(shù)等。具有這些功能的匯編程序稱為基本匯編ASM(Assembler),能完成這種編譯的程序稱為基本匯編程序。二、宏匯編程序MASM 在基本匯編的基礎(chǔ)上,進(jìn)一步允許在源程序中把一個(gè)指令序列定義為一條宏指令,并包含有大量偽指令的匯編程序,叫做宏匯編MASM(MacroAssembler)。它包含全部基本匯編ASM的功能,還增加了宏指令、結(jié)構(gòu)、記錄等高級(jí)匯編語(yǔ)言功能。能完成這種編譯的程序稱為宏匯編程序。8§4.2匯編語(yǔ)言基本語(yǔ)法4.2.1語(yǔ)法基礎(chǔ)一、字符集匯編語(yǔ)言程序中允許出現(xiàn)的字符為:英文字母:A~Z,a~z數(shù)字字符:0~9其它字符:+-*/()?…[]@<>.二、保留字保留字是由系統(tǒng)規(guī)定的,有特定含義的專用名字。匯編語(yǔ)言中的保留字有:寄存器的名字:AX、BX、CX、DX、SP、BP、SI、DI、IP、CS、DS、ES、SS指令助記符:MOV、PUSH、POP、ADD、SUB、MUL、…偽指令符:DB、DW、ASSUEM、EQU、LABEL、PROC等一些特殊的運(yùn)算符與操作符:LT、EQ、OR、HIGH、SEG、OFFSET、PTR等94.2.2語(yǔ)句格式一般形式:[標(biāo)識(shí)符]助記符[操作數(shù)1,操作數(shù)理2][:注釋]例:START:MOVAX,DATAXDB1,2一、助記符助記符是語(yǔ)句的主體,對(duì)指令語(yǔ)句它是機(jī)器指令的助記符(指令的符號(hào)),對(duì)于偽指令它是偽指令符。二、標(biāo)識(shí)符1、標(biāo)號(hào):用于指令語(yǔ)句中,代表相應(yīng)語(yǔ)句的符號(hào)地址。位于代碼段內(nèi),它具有三個(gè)屬性:段值(SEGMENT):標(biāo)號(hào)所在的段的段基址。段內(nèi)偏移地址(OFFSET):標(biāo)號(hào)地址與所在段的段首地址之間的偏移地址的字節(jié)數(shù)。10類型(TYPE):指在轉(zhuǎn)移指令中標(biāo)號(hào)可轉(zhuǎn)移的距離。NEAR:近標(biāo),本段內(nèi)引用,地址指針為2字節(jié);FAR:遠(yuǎn)標(biāo),可在其它段內(nèi)引用,地址指針為4字節(jié)。如果定義一個(gè)標(biāo)號(hào)緊跟冒號(hào),則表示此標(biāo)號(hào)為近標(biāo)。2、變量變量是存儲(chǔ)區(qū)中數(shù)據(jù)區(qū)的名字,一方面代表所表示的值,另一方面代表相應(yīng)的存儲(chǔ)空間的地址。用作存儲(chǔ)器操作數(shù),直接尋址。它位于DS、ES段內(nèi)。也具有三種屬性:段值(SEGMENT):標(biāo)號(hào)所在的段的段基址。段內(nèi)偏移地址(OFFSET):變量地址與所在段的段首地址之間的偏移地址的字節(jié)數(shù)。類型(TYPE):指變量中每個(gè)元素所包含的字節(jié)數(shù)。類型有:字節(jié)(BYTE)、字(WORD)以及雙字(DWORD)等。113、常量常量在匯編時(shí)已有確定的值。它沒有屬性。常量在程序中可以直接出現(xiàn)。二進(jìn)制常量以B結(jié)尾,八進(jìn)制以Q結(jié)尾,十六進(jìn)制數(shù)以H結(jié)尾。十進(jìn)制以D結(jié)尾(一般不寫)。字符串常量用單引號(hào)表示。對(duì)于經(jīng)常使用的常量,可以定義為符號(hào)常量。如: PI EQU3 PORT=218H三、操作數(shù)操作數(shù)是指尋址方式中所允許的數(shù)據(jù)類型。包括:常量、變量、標(biāo)號(hào)、寄存器名以及表達(dá)式等。

四、注釋以分號(hào)表示,用來(lái)說(shuō)明一條指令或一段程序的功能,它可以省略。匯編程序?qū)Ψ痔?hào)后的內(nèi)容不匯編。加注釋是為了讓程序容易讀懂。124.2.3MASM中的表達(dá)式

表達(dá)式由運(yùn)算對(duì)象及運(yùn)算符所組成。在匯編時(shí)由匯編程序?qū)λM(jìn)行運(yùn)算。運(yùn)算的結(jié)果作為一個(gè)語(yǔ)句的操作數(shù)去使用。運(yùn)算對(duì)象可以是常數(shù)、變量或標(biāo)號(hào),運(yùn)算結(jié)果可以是一個(gè)常數(shù)字,也可以是一個(gè)存儲(chǔ)器的地址,在此地址中存放了數(shù)據(jù)(稱為變量)或指令(稱為標(biāo)號(hào))。MASM中使用了6類運(yùn)算符:算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符數(shù)值返回運(yùn)算符修改屬性運(yùn)算符其它運(yùn)算符。131415一、算術(shù)運(yùn)算符主要的算術(shù)運(yùn)算有:+、-、*、/、MOD、SHL、SHR例:源程序指令格式如下:DAEQU300MOVAX,DA-80MOVBX,DAMOD100MOVCX,DA/100 MOVDH,01100100BSHR2匯編時(shí),計(jì)算表達(dá)式形成指令為:DAEQU300MOVAX,220MOVBX,0MOVCX,3MOVDH,19H16二、邏輯運(yùn)算符邏輯運(yùn)算有:AND(與)、OR(或)、XOR(異或)、NOT(非)4種。邏輯運(yùn)算符與邏輯運(yùn)算指令一樣,也是按位運(yùn)算,它只能對(duì)常數(shù)進(jìn)行運(yùn)算,得到的結(jié)果也是常數(shù)。邏輯運(yùn)算符作為操作數(shù),處理是在匯編期間完成的,而邏輯指令作為指令助記符,它是在程序執(zhí)行期間完成的。例: MOVAL,56H ANDAL,34HAND12H匯編時(shí),計(jì)算表達(dá)式形成指令為: MOVAL,56H ANDAL,10H17三、關(guān)系運(yùn)算符關(guān)系運(yùn)算符有:EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)。關(guān)系運(yùn)算符的兩個(gè)操作數(shù)必須是數(shù)據(jù),或是同一段內(nèi)的兩個(gè)存儲(chǔ)單元的地址。進(jìn)行關(guān)系運(yùn)算的比較操作后,結(jié)果是一個(gè)數(shù)值,若結(jié)果為真,輸出全是1,即0FFH或0FFFFH。若結(jié)果為假,輸出全是0。關(guān)系運(yùn)算符一般與邏輯運(yùn)算符組合起來(lái)使用。例:MOVAX,10HGT16ADDBL,6EQ0110B相當(dāng)于:MOVAX,0ADDBL,0FFH以上三種運(yùn)算符也叫做數(shù)值表達(dá)式。18四、數(shù)值返回運(yùn)算符(分析運(yùn)算符)用于分析一個(gè)存儲(chǔ)器操作數(shù)的屬性,并返回某個(gè)參數(shù)值。

1、SEG格式:SEG變量或標(biāo)號(hào)。功能:獲取變量或標(biāo)號(hào)的段地址(段基值)。如:MOVAX,SEGDATA1MOVDS,AX等價(jià)于:MOVAX,DATAMOVDS,AX其中DATA1為DATA段內(nèi)定義的一個(gè)變量名。如圖所示DATA=6000H

60000H數(shù)據(jù)段DATA1192、OFFSET格式:OFFSET變量或標(biāo)號(hào)功能:返回變量或標(biāo)號(hào)的偏移地址。如: MOVBX,OFFSETDA1等價(jià)于:LEABX,DA1如圖數(shù)據(jù)段,DA1的偏移為2000H因此,BX=2000H

在DOS的9號(hào)功能調(diào)用中經(jīng)常用到此運(yùn)算符。60000H數(shù)據(jù)段DATA162000H203、TYPE格式:TYPE變量或標(biāo)號(hào)功能:TYPE加在變量前,返回變量類型屬性。TYPE加在標(biāo)號(hào)前,返回標(biāo)號(hào)的距離屬性值。214、LENGTH格式:LENGTH變量功能:依據(jù)數(shù)據(jù)定義偽指令后第一個(gè)表達(dá)式的形式而定。當(dāng)偽指令為NDUP(?)時(shí),取N;否則取1。225、SIZE格式:SIZE變量功能:SIZE加在變量前,取變量所包含的總字節(jié)數(shù)。算式:SIZE=LENGTH*TYPE。23五、修改屬性運(yùn)算符修改屬性運(yùn)算符也叫綜合運(yùn)算符、合成運(yùn)算符、屬性定義符等。1、段操作符格式:段前綴:變量或地址表達(dá)式功能:段前綴由段寄存器CS、DS、ES、SS之一加“:”,用來(lái)臨時(shí)表示某個(gè)變量或地址被修改段前綴的段寄存器對(duì)的段基址中(段超越)。例:MOVAX,ES:[BX] ;段超越到ES段中2、PTR格式:類型/距離PTR變量或標(biāo)號(hào)功能:將PTR左邊的類型屬性賦給右邊的變量或標(biāo)號(hào)。用來(lái)臨時(shí)指定或修改變量或標(biāo)號(hào)的類型屬性。PTR本身不分配存儲(chǔ)單元,僅給已分配的存儲(chǔ)單元賦予新的屬性。以保證運(yùn)算時(shí)操作數(shù)類型的匹配。常與類型BYTE、WORD、NEAR、FAR等連用。24例4-13:N1DB45H,36HN2DW1122H,3344HLO:MOVAX,WORDPTRN1MOVBL,BYTEPTRN2執(zhí)行結(jié)果:AX=3645H,BL=22H例4-14:MOV[BX],10H此指令將立即數(shù)10H送入BX間址指定的存儲(chǔ)單元,但由于10H既可以是10H,也可以是0010H,所以匯編時(shí)認(rèn)為錯(cuò)誤。一般用BYTE或WORD指定:MOV[BX],BYTEPTR10H ;[BX]←10H MOVWORDPTR[BX],10H ;[BX]←00H,[BX+1]←10H253、THIS格式:變量/標(biāo)號(hào)EQUTHIS類型/距離功能:將EQUTHIS右邊的類型/距離屬性,賦給左邊的變量/標(biāo)號(hào),它的段地址和偏移地址與下一個(gè)存儲(chǔ)單元的相同。例:FIRSTEQUTHISBYTETABLEDW1234H,5678HFIRST的偏移地址與TABLE的偏移地址相同,區(qū)別在于FIRST為字節(jié)類型,而TABLE為字類型。執(zhí)行下列指令后,AX=1234H,BL=34HMOVAX,TABLEMOVBL,F(xiàn)IRST264、SHORT格式:SHORT標(biāo)號(hào)功能:用來(lái)說(shuō)明轉(zhuǎn)移指令中目標(biāo)地址的屬性,目標(biāo)地址與本指令的下一條指令的地址的距離在﹣128~+127之間,即限制在短轉(zhuǎn)移范圍內(nèi)。短標(biāo)號(hào)可以用在條件轉(zhuǎn)移指令中,使用短標(biāo)號(hào)的指令比使用近標(biāo)號(hào)的指令少一個(gè)字節(jié)。275、HIGH和LOW格式:HIGH變量/標(biāo)號(hào)格式:LOW變量/標(biāo)號(hào)功能:字節(jié)分離符,對(duì)一個(gè)數(shù)或地址表達(dá)式,HIGH從中分離出高位字節(jié),LOW從中分離出低位字節(jié)。例:K1EQU0ABCDHK2EQU1234HMOVAH,HIGHK1MOVBL,LOWK2等價(jià)于:MOVAH,0ABHMOVBL,34H28六、其它運(yùn)算符其它運(yùn)算符有(),[],<>,·,MASK和WIDTH等6種。1、園括號(hào)()圓括號(hào)用來(lái)改變運(yùn)算符的優(yōu)先級(jí)別,()中的運(yùn)算符具有最高優(yōu)先級(jí)。2、方括號(hào)[]主要用來(lái)表示地址表達(dá)式或多重變量的下標(biāo)值。29七、運(yùn)算符的優(yōu)先級(jí)如果一個(gè)表達(dá)式同時(shí)具有多個(gè)運(yùn)算符,則按以下規(guī)則運(yùn)算:①優(yōu)先級(jí)高的先運(yùn)算,優(yōu)先級(jí)低的后運(yùn)算。②優(yōu)先級(jí)相同時(shí)按表達(dá)式中從左到右的順序運(yùn)算。③括號(hào)可以提高運(yùn)算符的優(yōu)先級(jí),括號(hào)內(nèi)的運(yùn)算總是在相鄰的運(yùn)算之前進(jìn)行。各種運(yùn)算符的優(yōu)先級(jí)如下表:(數(shù)字越小,優(yōu)先級(jí)越高)30運(yùn)算符優(yōu)先級(jí)次序表優(yōu)先級(jí)運(yùn)算符1()[]〈〉·LENGTH,WIDTH,SIZE,MASK2PTR,OFFSET,SEG,TYPE,THIS,CS:,DS:,ES:,SS:3HIGH,LOW4*,/,MOD,SHL,SHR5+,-6EQ,NE,LT,LE,GT,GE7NOT8AND9OR,XOR10SHORT31格式1:變量名助記符操作數(shù),操作數(shù),…;注釋格式2:變量名助記符號(hào)nDUP(操作數(shù),操作數(shù)…);注釋用來(lái)定義一個(gè)變量的類型并分配存儲(chǔ)單元??少x初值也可不賦初值(用?代替)。常用符號(hào):DBDWDDDFDQDT定義字節(jié):1246810分配原則:低字(節(jié))低地址,高字(節(jié))高地址。在格式2中,n必須是正整數(shù),表示括號(hào)中的操作數(shù)的重復(fù)次數(shù),DUP后面必須帶括號(hào)?!?.3指示性語(yǔ)句4.3.1數(shù)據(jù)定義偽指令32333435用偽指令DW和DD可以將變量或標(biāo)號(hào)的偏移地址存入存儲(chǔ)器,當(dāng)用DD來(lái)定義時(shí),原變量或標(biāo)號(hào)的偏移地址存入低位字中,原變量或標(biāo)號(hào)的段地址存入高位字中。36例:(接上頁(yè))DATASEGMENTXDW120PAR1DB‘AB’PAR2DW‘AB’ONEDWPAR1TWODWADR2THREEDDADR3DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXADR2:MOVAX,0ADR3:MOVBX,1HLTCODEENDSENDSSTART374.3.2表達(dá)式賦值語(yǔ)句一、賦值語(yǔ)句EQU格式:符號(hào)名EQU表達(dá)式功能:用于給變量、標(biāo)號(hào)、常數(shù)、表達(dá)式等定義一個(gè)符號(hào)名。功能就是在程序中給符號(hào)名賦予表達(dá)式意義。同樣的符號(hào)名不能重復(fù)定義。例:CR EQU0DHA1 EQUCR+02HPORT EQU218HC1 EQUADD;加法指令賦給符號(hào)名C1可以用PURGE可以解除某個(gè)符號(hào)名的賦值。PURGE C1;C1不再代替ADD。38二、等于語(yǔ)句=格式:符號(hào)名=表達(dá)式功能:“=”與EQU語(yǔ)句具有相同的功能,區(qū)別在于EQU不允許對(duì)同一符號(hào)名重新定義,而“=”則可以重新定義。例: N=100 MOVAX,N N=N-20 MOVCX,N ;若換成EQU則出錯(cuò)。39三、LABEL格式:名稱LABEL類型功能:為L(zhǎng)ABEL語(yǔ)句下一行語(yǔ)句所使用的變量或標(biāo)號(hào)取一別名并賦給新的類型。其中變量的類型為BYTE、WORD、DWORD等,標(biāo)號(hào)的類型為NEAR、FAR。例: X LABELWORD M DB12H,34H MOVAL,M;AL=12H MOVBX,X;BX=3412HLABEL相當(dāng)于EQUTHIS。404.3.3段定義語(yǔ)句一、段定義語(yǔ)句SEGMENT…ENDS格式:段名SEGMENT定位類型組合類型‘類別’ .邏輯段正文 段名ENDS功能:將一個(gè)邏輯段定義為一個(gè)整體。段名:是邏輯段的標(biāo)識(shí)符,不能省略。它確定了邏輯段在存儲(chǔ)器中的物理地址?!岸蚊鸖EGMENT”和“段名ENDS”的段名必須一致。任何一個(gè)邏輯段必須以SEGMENT開始,以ENDS結(jié)束。

1、定位類型412、組合類型NONE、PUBLIC、COMMON、AT表達(dá)式、STACK和MEMORY等6種表明本段同其它段的組合關(guān)系。3、類別名典型的有:DATA、CODE和STACK等3種,連接時(shí)類別名相同的段存放在連續(xù)的存儲(chǔ)區(qū)中。42二、段分配語(yǔ)句ASSUME8086中允許設(shè)置多個(gè)邏輯段,但只允許4個(gè)邏輯段同時(shí)有效。ASSUME用來(lái)將它們分別定義成代碼段、數(shù)據(jù)段、附加段和堆棧段。格式:ASSUMECS:段名,DS:段名,ES:段名,SS:段名功能:定義4個(gè)邏輯段,明確段寄存器與指名段的關(guān)系。

ASSUME作為偽指令放在代碼段的開始。也可用ASSUME段寄存器:NOTHING來(lái)取消前面所定義的段名。注意:ASSUME放在可執(zhí)行程序開始位置的前面,指明段寄存器與段名之間的關(guān)系,但并未給段寄存器賦初值(CS除外)。程序中用戶需要用指令將段名傳送到對(duì)應(yīng)的段寄存器中。例 兩個(gè)16位無(wú)符號(hào)二進(jìn)制數(shù)相乘的程序。43DATA SEGMENTD1 DW1234HD2 DW5678HP1 DW?P2 DW?DATA ENDSSTACK SEGMENT DB100DUP(?)STACK ENDS44CODE SEGMENTMAIN PROCFAR ASSUMECS:CODE,DS:DATA,SS:STACKSTART: MOVAX,STACK MOVSS,AX PUSHDS ;保護(hù)PSP段地址

MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AXL1: MOVAX,D1 MULD2 MOVP1,AX MOVP2,DX RET ;返回到PSP開始處MAIN ENDPCODE ENDS ENDSTART454.3.4過(guò)程定義偽指令在程序設(shè)計(jì)中,可將具有一定功能的程序段看成為一個(gè)過(guò)程(相當(dāng)于一個(gè)子程序),它可以被別的程序調(diào)用。一個(gè)過(guò)程由偽指令PROC和ENDP來(lái)定義。格式:過(guò)程名PROC[NEAR]/FAR過(guò)程正文RETN過(guò)程名ENDP功能:定義一個(gè)過(guò)程,其它程序可以用CALL指令調(diào)用它。過(guò)程名:是給所定義的過(guò)程取的名字。它是主程序調(diào)用的目的操作數(shù),即子程序的入口地址。它像標(biāo)號(hào)一樣具有三種屬性:段屬性、偏移地址屬性、距離屬性[NEAR/FAR]。RETN:返回指令,其中N表示返回時(shí)所丟棄的字節(jié)數(shù)(偶數(shù))。464.3.5程序開始和結(jié)束語(yǔ)句一、NAME格式:NAME程序名功能:為源程序目標(biāo)模塊賦名字。二、ORG格式:ORG表達(dá)式功能:給匯編程序設(shè)置位置指針,指定下面語(yǔ)句的起始偏移地址。說(shuō)明:一般情況下,段定義語(yǔ)句(SEGMENT)指出了段的起點(diǎn),偏移地址為0。段內(nèi)各個(gè)語(yǔ)句或數(shù)據(jù)的地址由段地址開始依次類推可確定。而用ORG指令則可以指定將指令或數(shù)據(jù)從某個(gè)地址開始存放。47三、END格式:END標(biāo)號(hào)功能:標(biāo)記匯編源程序結(jié)束。說(shuō)明:放在源程序的最后一行,表示匯編程序到此結(jié)束。如果缺省,則會(huì)出問(wèn)題。另外,在多模塊程序設(shè)計(jì)中,只有主模塊才需要加標(biāo)號(hào),而其他模塊則不能加標(biāo)號(hào)。標(biāo)號(hào)是程序中第一條可執(zhí)行指令的標(biāo)號(hào),常用BEGIN、START表示,可缺省。如缺省,則用過(guò)程名。48例2:用ORG改變數(shù)據(jù)段地址。DATA SEGMENT

ORG100HA1 DB10H,20H,30H ;A1偏移地址為100H

ORG200HA2 DW3031H,3233H ;A2的偏移地址200HDATA ENDS例1:用ORG指定代碼段地址。CODESEGMENT

ORG100H ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX …CODE ENDS494.3.6其它偽指令語(yǔ)句一、宏指令在匯編語(yǔ)言書寫的源程序中,若有的程序段要多次使用,為了簡(jiǎn)化程序書寫,該程序段可以用一條宏指令來(lái)代替,而匯編程序匯編到該宏指令時(shí),仍會(huì)產(chǎn)生源程序所需的代碼。

宏指令的一般格式為:

宏指令名MACRO[形式參量表]宏體ENDM例如: SHIFTMACRO MOVCL,4 SALAL,Cl ENDM50二、MODEL指令在編寫匯編語(yǔ)言程序中,有兩中方式可以采用:一種采用完整的段定義方式;另一種則用模型的方式。格式:.MODEL模式選擇符功能:指明簡(jiǎn)化段所使用的內(nèi)存模式,指示數(shù)據(jù)與代碼允許使用的長(zhǎng)度。模式選擇符:SMALL,MEDIUM,COMPACT,LARGE。SMALL:小模式,所有的數(shù)據(jù)在一物理段中,所有代碼存放在另一物理段中。代碼段與數(shù)據(jù)段均為近程,不與高級(jí)語(yǔ)言連接時(shí)一般為SMALL模式。515253;Z4L48.ASM.MODELSMALL.STACK100H.DATALIST1 DB100DUP(0BH)LIST2 DB100DUP(?).CODE.STARTUP CLD LEASI,LIST1 LEADI,LIST2 MOVCX,100例48:將從LIST1開始的100個(gè)字節(jié)的數(shù)傳送到LIST2的單元。LP1: MOVAL,[SI] MOVDS:[DI],AL INCSI INCDI LOOPLP1.EXIT0 END544.4.1匯編語(yǔ)言程序設(shè)計(jì)概述1.編寫源程序在弄清問(wèn)題的要求,確定方案后,匯編語(yǔ)言程序設(shè)計(jì)者便可依據(jù)前面的指令系統(tǒng)和匯編語(yǔ)言的規(guī)定,逐個(gè)模塊地編寫匯編語(yǔ)言源程序。2.源程序輸入微型機(jī)在編輯軟件EDIT.EXE或其他編輯軟件的支持下,將源程序輸入到計(jì)算機(jī)中。通常,匯編語(yǔ)言源程序的擴(kuò)展名為ASM。3.匯編利用匯編程序(或宏匯編程序)(ASM或MASM)對(duì)匯編語(yǔ)言源程序進(jìn)行匯編,產(chǎn)生擴(kuò)展名為OBJ的可重定位的目的代碼?!?.4匯編語(yǔ)言程序設(shè)計(jì)554.連接利用連接程序(LINK)可將一個(gè)或多個(gè)擴(kuò)展名為OBJ文件進(jìn)行連接,生成擴(kuò)展名為擴(kuò)展名為EXE的可執(zhí)行文件。5.調(diào)試對(duì)于稍大一些的程序來(lái)說(shuō),經(jīng)過(guò)上述步驟所獲得的.EXE可執(zhí)行文件,在運(yùn)行過(guò)程中難免無(wú)錯(cuò)。調(diào)試匯編程序最常用的工具是動(dòng)態(tài)調(diào)試程序DEBUG。564.4.2程序設(shè)計(jì)的基本方法一、順序結(jié)構(gòu)程序設(shè)計(jì)例1:求兩個(gè)數(shù)的平均值,這兩個(gè)數(shù)分別在X單元和Y單元中,而平均值放在Z單元中。假定均為字節(jié)數(shù),程序如下:;Z44L1.ASMDATASEGMENTXDB95YDB87ZDB?DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA57 PUSHDS XORAX,AX PUSHAX MOVAX,DATA MOVDS,AX MOVAL,X ADDAL,Y MOVAH,0 ADCAH,0 ;進(jìn)位送AH MOVBL,2 DIVBL ;求平均值 MOVZ,AL RETMAIN ENDPCODE ENDS ENDMAIN58例2:內(nèi)存中TABLE開始存放0~9的平方值,通過(guò)人機(jī)對(duì)話,當(dāng)任意給定一個(gè)數(shù)X(0~9),查表得X的平方值,放在AL中。程序如下:;Z44L2.ASMDATA SEGMENTTABLE DB0,1,4,9,16,25,36,49,64,81BUF DB‘Pleaseinputonenumber’ DB‘(0~9):’,0DH,0AH,’$’DATA ENDS59CODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVDX,OFFSETBUF MOVAH,9 INT21H MOVAH,1 INT21H ;1號(hào)功能調(diào)用,鍵入數(shù)送AL ANDAL,0FH MOVBX,OFFSETTABLE MOVAH,0 ADDBX,AX MOVAL,[BX] ;查表得輸入數(shù)的平方 MOVAH,4CH INT21HCODE ENDS ENDSTART60利用條件轉(zhuǎn)移指令,使程序執(zhí)行到某一指令后,根據(jù)條件是否滿足,來(lái)改變程序執(zhí)行的次序。在程序設(shè)計(jì)中經(jīng)常會(huì)遇到各種判斷和比較,例如“相等”和“不相等”;“正”和“負(fù)”;“大于”和“小于”;“滿足條件”和“不滿足條件”等等,這些判斷和比較在程序中都可以組成各種不同的邏輯框,并產(chǎn)生相應(yīng)的分支程序。二、分支結(jié)構(gòu)程序設(shè)計(jì)611、簡(jiǎn)單分支結(jié)構(gòu)6263例4.57:有8個(gè)加工子入口地址分別為P1、P2,…,P8。編程實(shí)現(xiàn)檢測(cè)鍵盤輸入命令,使系統(tǒng)分別轉(zhuǎn)向8個(gè)程序,加工子程序。 MOVAH,1 INT21H ;DOS系統(tǒng)調(diào)用01,AL返回鍵值 CMPAL,‘1’ ;‘1’轉(zhuǎn)移到P1 JEP1 CMPAL,‘2’ ;‘2’轉(zhuǎn)移到P2 JEP2 … CMPAL,‘8’ ;‘8’轉(zhuǎn)移到P8 JEP8 JMPSTP1:…方式1(逐一比較法):部分程序Z44L6F1.ASM2、多分支結(jié)構(gòu)64方式2(用跳轉(zhuǎn)表實(shí)現(xiàn)多分支):Z44L6F2.ASMBASE DWP1,P2,P3,P4 DWP5,P6,P7,P8KEY DB?

MOVAH,1 INT21H ANDAL,0FH MOVKEY,AL ;保留鍵值 MOVBX,OFFSETBASE MOVAH,0 ADDAL,AL ADDBX,AX ;求表地址 JMPWORDPTR[BX]P1低位P1高位P2低位P2高位P3低位P3高位P8低位P8高位BASEBASE+2BASE+3BASE+765例4.58:設(shè)有首地址為BUFFER的數(shù)組,已按升序排好,字組的長(zhǎng)度為(=10),在該數(shù)組中查找數(shù)M(為80),若找到則從數(shù)組中刪除,若找不到則將它插入到正確的位置。且變化后的數(shù)組長(zhǎng)度在DX中。DATASEGMENT;Z44L7.ASMN DW10M DW80BUFFER DW5,10,21,32,47 DW65,77,85,90,105DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA05001000210032004700650077008500900010500+0+2+4+6+8+A+C+E+10+12+1466MAINPROCFARSTART: PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVES,AX MOVAX,M;待查數(shù)送AX MOVCX,N;設(shè)置計(jì)數(shù)器 MOVDX,CX;初始化DX,保留個(gè)數(shù) MOVDI,OFFSETBUFFER CLD REPNESCASW;用重復(fù)串掃描指令查找 JEDEL ;找到,轉(zhuǎn)刪除 DECDX ;個(gè)數(shù)減1,找存放位置 MOVSI,DX ADDSI,DX;地址指針指向最后一個(gè)數(shù)L1: CMPAX,BUFFER[SI];與[SI]的內(nèi)容比較67 JLL2 MOVBUFFER[SI+2],AX;比SI所指單元內(nèi)容大,存放 JMPL3L2: MOVBX,BUFFER[SI] MOVBUFFER[SI+2],BX ;數(shù)組下移一位 SUBSI,2;修改地址指針 JMPL1L3: ADDDX,2 ;因?yàn)镈X前面減了1,故應(yīng)加2 JMPNEXT1DEL: JCXZNEXT ;CX=0,表明最后一個(gè)是要找的數(shù)DEL1: MOVBX,[DI]MOV[DI-2],BXADDDI,2LOOPDEL1NEXT:DECDXNEXT1:RET ;程序結(jié)束,返回到DOSMAIN ENDPCODE ENDS ENDSTART68050010002100320047006500770080008500900010500+0+2+4+6+8+A+C+E+10+12+14+16M=80插入的位置N=1105001000210032004700650077008500900010500+0+2+4+6+8+A+C+E+10+12+14左邊的數(shù)據(jù)如果再找M=80,大于80后面的數(shù)就會(huì)前移一個(gè)字,將80刪除。69循環(huán)結(jié)構(gòu)就是對(duì)同一種操作重復(fù)多次,這種程序有兩種結(jié)構(gòu)形式:(a)先執(zhí)行,后判斷進(jìn)入循環(huán)后至少執(zhí)行一次循環(huán)體,再判斷循環(huán)結(jié)束條件。一般用于循環(huán)次數(shù)固定的程序。(b)先判斷,后執(zhí)行進(jìn)入循環(huán)體后,先判斷循環(huán)結(jié)束條件,再?zèng)Q定是否執(zhí)行循環(huán)體??赡苎h(huán)體一次也不執(zhí)行。一般用于循環(huán)次數(shù)不確定的程序。三、循環(huán)結(jié)構(gòu)程序設(shè)計(jì)701、用已知次數(shù)控制循環(huán)例:從BUF開始的10個(gè)連續(xù)單元中存放有10個(gè)無(wú)符號(hào)字節(jié)數(shù),找出其中的最大者送入YY單元中。DATA SEGMENTXX DB71,32,43,64,195,06,87,19,108,08N=$-XX ;當(dāng)前的地址-XX的地址為個(gè)數(shù) YY DB? ;存放最大值DATAENDS71324364195687191088初始化時(shí)先取出71作為最大值存入AX與其它數(shù)比較,大者存入AX因此AX中是前面比較的最大值71CODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVAL,XX LEASI,XX MOVCX,N-1LOP1: INCSI CMPAL,[SI] JAELOP2 ;高于等于轉(zhuǎn)移 MOVAL,[SI]LOP2: DECCX JNZLOP1 MOVYY,AL MOVAH,4CH INT21HCODE ENDS ENDSTART722、用條件控制循環(huán)由于無(wú)法確定循環(huán)次數(shù),但可以用條件來(lái)確定循環(huán)是否結(jié)束。例:從自然數(shù)1開始計(jì)數(shù),直到累加和大于1000為止,統(tǒng)計(jì)被累加的自然數(shù)的個(gè)數(shù),并把統(tǒng)計(jì)的個(gè)數(shù)送入N單元,把累加和送入SUM單元。DATA SEGMENT N DB?SUM DW?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATAMAIN PROCFAR73START: PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVAX,0 MOVBX,AX MOVCX,AXLOP: INCBX ADDAX,BX INCCX CMPAX,1000 ;累加和小于1000? JBELOP ;不高于轉(zhuǎn)移 MOVN,CX ;累加次數(shù)送N單元 MOVSUM,AX RETMAIN ENDPCODE ENDS ENDSTART74例:在以BUF為首址的字節(jié)存儲(chǔ)單元區(qū)中存放有N個(gè)無(wú)符號(hào)數(shù),試編程將它們從小到大排序。(冒泡法)排序方法:將第一個(gè)數(shù)與其后的N-1個(gè)數(shù)比較,如果后面的數(shù)小于第一個(gè)數(shù),則將它們互換,否則繼續(xù)比較。N-1次后,N個(gè)數(shù)中的最小數(shù)放在第一個(gè)存儲(chǔ)單元中。余下的N-1個(gè)中,經(jīng)過(guò)N-2次比較后,第二小者放在第二個(gè)單元中?!詈髢蓚€(gè)存儲(chǔ)單元中的數(shù)比較1次后,從小到大的順序就實(shí)現(xiàn)了。N個(gè)數(shù),共比較(N-1)+(N-2)+…+2+1次。3、多重循環(huán)多重循環(huán):循環(huán)體內(nèi)再套循環(huán)。常見類型:數(shù)組訪問(wèn),排序。75209010807040503060209010807040503060109020807040503060該數(shù)送AL與下一個(gè)比較小則交換76109020807040503060102090807040503060102030405060708090不在參加第2遍比較第1遍比較的結(jié)果第2遍比較的結(jié)果第8遍比較的結(jié)果不在參加第3遍比較77DATA SEGMENTBUF DB20H,90H,10H,80H,70H DB40H,50H,30H,60HN=$-BUF ;個(gè)數(shù)DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVDX,N-1 MOVSI,1LOP1: MOVDI,SI INCDI ;(SI)+1DI MOVAL,[BUF+SI-1]LOP2: CMPAL,[BUF+DI-1] JBENEXT;低于等于轉(zhuǎn)移78 XCHG[BUF+DI-1],AL;高于交換 MOV[BUF+SI-1],ALNEXT: INCDI ;(DI)+1DI CMPDI,N JBELOP2 ;低于等于轉(zhuǎn)移 INCSI ;(SI)+1SI CMPSI,N-1 JBELOP1 ;低于等于轉(zhuǎn)移 MOVAH,4CH INT21HCODE ENDS ENDSTART79四、子程序結(jié)構(gòu)程序設(shè)計(jì)子程序是具有一定的功能,能被多次調(diào)用的程序。1、子程序定義與調(diào)用①定義:過(guò)程名PROC[NEAR/FAR] 程序正文 RET 過(guò)程名ENDP②調(diào)用:CALL過(guò)程名80CODE SEGMENT ASSUMECS:CODEMAIN PROCFARSTART: PUSHDS MOVAX,0 PUSHAX

CALLOUTPUT

RETMAIN ENDPOUTPUT PROCNEAR MOVDL,‘M’ MOVAH,2 INT21H RETOUTPUT ENDPCODE ENDS ENDSTART例1:段內(nèi)直接調(diào)用子程序,顯示符“M”。81例2:段間調(diào)用,顯示符“M”。CODE1 SEGMENT ASSUMECS:CODE1MAIN PROCFARSTART: PUSHDS MOVAX,0 PUSHAX

CALLFARPTROUTPUT RETMAIN ENDPCODE1 ENDS82CODE2 SEGMENT ASSUMECS:CODE2OUTPUT PROCFAR MOVDL,‘M’ MOVAH,2 INT21H RETOUTPUT

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論