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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

4.1.1概述一、匯編語言的基本概念1、機器語言:由0、1代碼所組成的語言。面向機器,同一組代碼對不同的計算機表示不同的含義。2、匯編語言:由助記符表示的語言。面向機器。3、高級語言:用一些接近人們書寫習慣的英語和數(shù)學表達式形式的句子編寫程序。這種語言不面向機器,而是面向過程、面向對象?!?.1MASM宏匯編程序第四章匯編語言程序設計1二、匯編語言程序的結構形式例:在屏幕上顯示字符串“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 ;保護PSP段地址 MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVDX,OFFSETMES MOVAH,9 INT21H

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

四、注釋以分號表示,用來說明一條指令或一段程序的功能,它可以省略。匯編程序對分號后的內容不匯編。加注釋是為了讓程序容易讀懂。124.2.3MASM中的表達式

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

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

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

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

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

ASSUME作為偽指令放在代碼段的開始。也可用ASSUME段寄存器:NOTHING來取消前面所定義的段名。注意:ASSUME放在可執(zhí)行程序開始位置的前面,指明段寄存器與段名之間的關系,但并未給段寄存器賦初值(CS除外)。程序中用戶需要用指令將段名傳送到對應的段寄存器中。例 兩個16位無符號二進制數(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 ;保護PSP段地址

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

宏指令的一般格式為:

宏指令名MACRO[形式參量表]宏體ENDM例如: SHIFTMACRO MOVCL,4 SALAL,Cl ENDM50二、MODEL指令在編寫匯編語言程序中,有兩中方式可以采用:一種采用完整的段定義方式;另一種則用模型的方式。格式:.MODEL模式選擇符功能:指明簡化段所使用的內存模式,指示數(shù)據(jù)與代碼允許使用的長度。模式選擇符:SMALL,MEDIUM,COMPACT,LARGE。SMALL:小模式,所有的數(shù)據(jù)在一物理段中,所有代碼存放在另一物理段中。代碼段與數(shù)據(jù)段均為近程,不與高級語言連接時一般為SMALL模式。515253;Z4L48.ASM.MODELSMALL.STACK100H.DATALIST1 DB100DUP(0BH)LIST2 DB100DUP(?).CODE.STARTUP CLD LEASI,LIST1 LEADI,LIST2 MOVCX,100例48:將從LIST1開始的100個字節(jié)的數(shù)傳送到LIST2的單元。LP1: MOVAL,[SI] MOVDS:[DI],AL INCSI INCDI LOOPLP1.EXIT0 END544.4.1匯編語言程序設計概述1.編寫源程序在弄清問題的要求,確定方案后,匯編語言程序設計者便可依據(jù)前面的指令系統(tǒng)和匯編語言的規(guī)定,逐個模塊地編寫匯編語言源程序。2.源程序輸入微型機在編輯軟件EDIT.EXE或其他編輯軟件的支持下,將源程序輸入到計算機中。通常,匯編語言源程序的擴展名為ASM。3.匯編利用匯編程序(或宏匯編程序)(ASM或MASM)對匯編語言源程序進行匯編,產(chǎn)生擴展名為OBJ的可重定位的目的代碼。§4.4匯編語言程序設計554.連接利用連接程序(LINK)可將一個或多個擴展名為OBJ文件進行連接,生成擴展名為擴展名為EXE的可執(zhí)行文件。5.調試對于稍大一些的程序來說,經(jīng)過上述步驟所獲得的.EXE可執(zhí)行文件,在運行過程中難免無錯。調試匯編程序最常用的工具是動態(tài)調試程序DEBUG。564.4.2程序設計的基本方法一、順序結構程序設計例1:求兩個數(shù)的平均值,這兩個數(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 ;進位送AH MOVBL,2 DIVBL ;求平均值 MOVZ,AL RETMAIN ENDPCODE ENDS ENDMAIN58例2:內存中TABLE開始存放0~9的平方值,通過人機對話,當任意給定一個數(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號功能調用,鍵入數(shù)送AL ANDAL,0FH MOVBX,OFFSETTABLE MOVAH,0 ADDBX,AX MOVAL,[BX] ;查表得輸入數(shù)的平方 MOVAH,4CH INT21HCODE ENDS ENDSTART60利用條件轉移指令,使程序執(zhí)行到某一指令后,根據(jù)條件是否滿足,來改變程序執(zhí)行的次序。在程序設計中經(jīng)常會遇到各種判斷和比較,例如“相等”和“不相等”;“正”和“負”;“大于”和“小于”;“滿足條件”和“不滿足條件”等等,這些判斷和比較在程序中都可以組成各種不同的邏輯框,并產(chǎn)生相應的分支程序。二、分支結構程序設計611、簡單分支結構6263例4.57:有8個加工子入口地址分別為P1、P2,…,P8。編程實現(xiàn)檢測鍵盤輸入命令,使系統(tǒng)分別轉向8個程序,加工子程序。 MOVAH,1 INT21H ;DOS系統(tǒng)調用01,AL返回鍵值 CMPAL,‘1’ ;‘1’轉移到P1 JEP1 CMPAL,‘2’ ;‘2’轉移到P2 JEP2 … CMPAL,‘8’ ;‘8’轉移到P8 JEP8 JMPSTP1:…方式1(逐一比較法):部分程序Z44L6F1.ASM2、多分支結構64方式2(用跳轉表實現(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:設有首地址為BUFFER的數(shù)組,已按升序排好,字組的長度為(=10),在該數(shù)組中查找數(shù)M(為80),若找到則從數(shù)組中刪除,若找不到則將它插入到正確的位置。且變化后的數(shù)組長度在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ù)器 MOVDX,CX;初始化DX,保留個數(shù) MOVDI,OFFSETBUFFER CLD REPNESCASW;用重復串掃描指令查找 JEDEL ;找到,轉刪除 DECDX ;個數(shù)減1,找存放位置 MOVSI,DX ADDSI,DX;地址指針指向最后一個數(shù)L1: CMPAX,BUFFER[SI];與[SI]的內容比較67 JLL2 MOVBUFFER[SI+2],AX;比SI所指單元內容大,存放 JMPL3L2: MOVBX,BUFFER[SI] MOVBUFFER[SI+2],BX ;數(shù)組下移一位 SUBSI,2;修改地址指針 JMPL1L3: ADDDX,2 ;因為DX前面減了1,故應加2 JMPNEXT1DEL: JCXZNEXT ;CX=0,表明最后一個是要找的數(shù)DEL1: MOVBX,[DI]MOV[DI-2],BXADDDI,2LOOPDEL1NEXT:DECDXNEXT1:RET ;程序結束,返回到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ù)就會前移一個字,將80刪除。69循環(huán)結構就是對同一種操作重復多次,這種程序有兩種結構形式:(a)先執(zhí)行,后判斷進入循環(huán)后至少執(zhí)行一次循環(huán)體,再判斷循環(huán)結束條件。一般用于循環(huán)次數(shù)固定的程序。(b)先判斷,后執(zhí)行進入循環(huán)體后,先判斷循環(huán)結束條件,再決定是否執(zhí)行循環(huán)體。可能循環(huán)體一次也不執(zhí)行。一般用于循環(huán)次數(shù)不確定的程序。三、循環(huán)結構程序設計701、用已知次數(shù)控制循環(huán)例:從BUF開始的10個連續(xù)單元中存放有10個無符號字節(jié)數(shù),找出其中的最大者送入YY單元中。DATA SEGMENTXX DB71,32,43,64,195,06,87,19,108,08N=$-XX ;當前的地址-XX的地址為個數(shù) YY DB? ;存放最大值DATAENDS71324364195687191088初始化時先取出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 ;高于等于轉移 MOVAL,[SI]LOP2: DECCX JNZLOP1 MOVYY,AL MOVAH,4CH INT21HCODE ENDS ENDSTART722、用條件控制循環(huán)由于無法確定循環(huán)次數(shù),但可以用條件來確定循環(huán)是否結束。例:從自然數(shù)1開始計數(shù),直到累加和大于1000為止,統(tǒng)計被累加的自然數(shù)的個數(shù),并把統(tǒng)計的個數(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 ;不高于轉移 MOVN,CX ;累加次數(shù)送N單元 MOVSUM,AX RETMAIN ENDPCODE ENDS ENDSTART74例:在以BUF為首址的字節(jié)存儲單元區(qū)中存放有N個無符號數(shù),試編程將它們從小到大排序。(冒泡法)排序方法:將第一個數(shù)與其后的N-1個數(shù)比較,如果后面的數(shù)小于第一個數(shù),則將它們互換,否則繼續(xù)比較。N-1次后,N個數(shù)中的最小數(shù)放在第一個存儲單元中。余下的N-1個中,經(jīng)過N-2次比較后,第二小者放在第二個單元中?!詈髢蓚€存儲單元中的數(shù)比較1次后,從小到大的順序就實現(xiàn)了。N個數(shù),共比較(N-1)+(N-2)+…+2+1次。3、多重循環(huán)多重循環(huán):循環(huán)體內再套循環(huán)。常見類型:數(shù)組訪問,排序。75209010807040503060209010807040503060109020807040503060該數(shù)送AL與下一個比較小則交換76109020807040503060102090807040503060102030405060708090不在參加第2遍比較第1遍比較的結果第2遍比較的結果第8遍比較的結果不在參加第3遍比較77DATA SEGMENTBUF DB20H,90H,10H,80H,70H DB40H,50H,30H,60HN=$-BUF ;個數(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;低于等于轉移78 XCHG[BUF+DI-1],AL;高于交換 MOV[BUF+SI-1],ALNEXT: INCDI ;(DI)+1DI CMPDI,N JBELOP2 ;低于等于轉移 INCSI ;(SI)+1SI CMPSI,N-1 JBELOP1 ;低于等于轉移 MOVAH,4CH INT21HCODE ENDS ENDSTART79四、子程序結構程序設計子程序是具有一定的功能,能被多次調用的程序。1、子程序定義與調用①定義:過程名PROC[NEAR/FAR] 程序正文 RET 過程名ENDP②調用:CALL過程名80CODE SEGMENT ASSUMECS:CODEMAIN PROCFARSTART: PUSHDS MOVAX,0 PUSHAX

CALLOUTPUT

RETMAIN ENDPOUTPUT PROCNEAR MOVDL,‘M’ MOVAH,2 INT21H RETOUTPUT ENDPCODE ENDS ENDSTART例1:段內直接調用子程序,顯示符“M”。81例2:段間調用,顯示符“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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論