匯編語言程序設(shè)計(南通大學(xué))(陳繼紅)_第1頁
匯編語言程序設(shè)計(南通大學(xué))(陳繼紅)_第2頁
匯編語言程序設(shè)計(南通大學(xué))(陳繼紅)_第3頁
匯編語言程序設(shè)計(南通大學(xué))(陳繼紅)_第4頁
匯編語言程序設(shè)計(南通大學(xué))(陳繼紅)_第5頁
已閱讀5頁,還剩234頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章匯編語言程序設(shè)計4.1匯編語言概述

4.2匯編語言程序?qū)崿F(xiàn)

4.3匯編語言程序設(shè)計方法及應(yīng)用4.4匯編語言程序設(shè)計舉例

匯編語言〔AssemblyLanguage〕是一種采用指令助記符、符號地址、標(biāo)號、偽指令等符號編寫程序的程序設(shè)計語言。用匯編語言編寫的程序稱為匯編語言源程序〔SourceProgram〕。一般情況下,一個助記符對應(yīng)一條機(jī)器指令,所以匯編語言也是面向機(jī)器的語言。4.1匯編語言概述源程序的結(jié)構(gòu)與組成【例題4.1】實現(xiàn):123+456→sum的源程序

CODE SEGMENT;語句6

ASSUMECS:CODE,DS:DATAMAINPROCFAR;語句8START:PUSHDS;語句9

……….;

RET;語句17MAINENDP;語句18CODEENDS;語句19數(shù)據(jù)段代碼段DATASEGMENT;語句1ADW123;語句2BDW456;語句3SUMDW?;語句4DATAENDS;語句5ENDSTART

;語句20★[名字]指令/偽指令[操作數(shù)1[,操作數(shù)2…]]★段=∑語句1.源程序組成★源程序=∑段段一個匯編語言源程序中,代碼段是不可缺少的,其它段〔數(shù)據(jù)段、堆棧堆、附加段〕視具體情況而定。該程序共有2個段:行1~行5為一段、行6~行19為一段DATA、CODE分別為2個段的名字。每一段有明顯的起始語句與結(jié)束語句,這些語句稱為“段定義〞語句。代碼段的第一個語句ASSUME(本例中行7),用于明確段與段存放器的關(guān)系。本程序中DATA是數(shù)據(jù)段、CODE是代碼段。段:數(shù)據(jù)段、堆棧段、附加段、代碼段語句

源程序由語句組成。匯編語言源程序語句可以分為:

指令語句偽指令語句宏指令語句語句:★指令性語句,由CPU執(zhí)行,如:語句8~語句17?!镏甘拘哉Z句,指示匯編,如語句1、5、6、19、20。名字:段名,如:DATA、CODE

變量名,如:A、B、SUM

過程名,如:MAIN

標(biāo)號名,如:START名字匯編語言源程序中的變量名、標(biāo)號、常量名、段名、宏名等統(tǒng)稱為“名字〞。

段名,如:DATA、CODE

變量名,如:A、B、SUM

過程名,如:MAIN

標(biāo)號名,如:START1)組成名字的合法字符有:●字母〔不分大小寫〕;●數(shù)字0~9;●特殊符號〔“?〞,“:〞,“@〞,“_〞,“$〞〕。2)名字以字母開頭。3)不能把保存字用作名字。(1).名字命名規(guī)那么(2).名字屬性1)變量名2)段名:該段起始位置的段地址值

段屬性:變量所代表的數(shù)據(jù)區(qū)所在段的段基址;偏移量:變量所代表的數(shù)據(jù)區(qū)首字節(jié)所在段內(nèi)偏移地址;類型:BYTE、WORD、DWORD、DQ、DT長度:變量所代表的數(shù)據(jù)區(qū)中數(shù)據(jù)元素的個數(shù)。規(guī)模:變量所代表的數(shù)據(jù)區(qū)中數(shù)據(jù)所占空間大小,以字節(jié)計。3)過程名或標(biāo)號名4)常量名:代表一常數(shù)段屬性:過程起始位置或標(biāo)號處段地址值偏移量:過程起始位置或標(biāo)號處偏移地址值類型:NEAR、FAR用于程序跳轉(zhuǎn)4.1.2匯編語言偽指令1.數(shù)據(jù)定義偽指令

[變量名]數(shù)據(jù)定義偽指令操作數(shù)1[,操作數(shù)2…]

DB、DW、DD、DQ、DT字節(jié)、字、雙字、4字、5字的變量。(1)數(shù)字常量:十進(jìn)制、八進(jìn)制、十六進(jìn)制、二進(jìn)制等,缺省形式是十進(jìn)制;(2)字符常量,用單引號括起來,被存儲的是該字符的ASCII碼;(3)符號常量,必須是預(yù)先已定義的符號;(4)符號“?〞,表示預(yù)留空間,內(nèi)容不定;

(5)DUP,表示內(nèi)容重復(fù)的數(shù)據(jù)。具體形式為:次數(shù)DUP(被重復(fù)的內(nèi)容)操作數(shù):【例】D_ADB10,‘A’,‘BC’D_BDW1234HD_CDQ5678H

D_A

0AH

41H

42H

43H

D_B

34H

12H

D_C

78H

56H

0

0

0

0

0D_C+7

0

(1)DB定義的數(shù)據(jù),每個數(shù)據(jù)元素占據(jù)1個存儲單元;

DW定義的數(shù)據(jù),每個數(shù)據(jù)元素占據(jù)2個存儲單元;(2)字?jǐn)?shù)據(jù)存儲時,低字節(jié)存儲在低地址單元中,高字節(jié)存儲在高地址單元中;(3)字符被存放時為它的ASCII碼,

例‘A’的ASCII碼為41H;(4)符號地址具有以下關(guān)系:

D_B=D_A+3D_D=D_B+2=D_A+6

注:ORG100HD_EDB3DUP(?)EVEND_FDWD_ED_GDB2DUP(1,3,4)D_HDW$+2變量內(nèi)容偏移地址D_E?100

?101

?102103D_F00H10401H105D_G1106310741081109310A410BD_H0EH10C01H10D下一個存儲位置從偶地址開始己定義變量,取該變量偏移地址代表當(dāng)前偏移地址2.符號定義偽指令(1)EQU格式:名字EQU表達(dá)式

例:

VBEQU64×1024;VB代表數(shù)值表達(dá)式的值

AEQU7BEQUA-2注意:

1.如果表達(dá)式中有變量,應(yīng)在該語句前給出該變量的定義;

2.EQU語句不能給某一變量重復(fù)定義;

3.VB、A、B不占用內(nèi)存(2)等號=格式:名字=表達(dá)式功能:與EQU根本相同,區(qū)別是它可以對同一個名字重新定義。例:COUNT=10MOVAL,COUNT;…COUNT=5;可重復(fù)定義…例:ABCDW?

A1EQUBYTEPTRABC;A1是ABC的第一個字節(jié)

A2EQUBYTEPTRABC+1或A2EQUA1+1MOVAL,A1MOVAH,A2例,可以如下處置:③

MOVAX,WORDPTROPER1+1;AX=3402HMOVAL,BYTEPTROPER2;AL=34HMOVAL,BYTEPTROPER2+1;AL=12H

例:

OPER1DB1,2OPER2DW1234H,5678H

…MOVAX,OPER1+1MOVAL,OPER2;這里類型不匹配(3)LABEL格式:變量/標(biāo)號LABEL類型功能:定義變量或標(biāo)號的類型,而變量或標(biāo)號的段屬性和偏移屬性由該語句所處的位置確定。變量的類型有:BYTE、WORD、DWORD、DQ、DT;標(biāo)號的類型有:NEAR、FAR?!纠坷肔ABEL使同一個數(shù)據(jù)區(qū)有一個以上的類型及相關(guān)屬性。AREAWLABELWORD;AREAW與AREAB指向相同的數(shù)據(jù)區(qū),AREAW類型為字,而

AREAB類型為字節(jié)AREABDB100DUP(?)……MOVAX,1234HMOVAREAW,AX;(AREAW)=1234H……MOVBL,AREAB;BL=34H

3.段定義偽指令段名SEGMENT[定位類型][組合類型][‘類別’]

…段名ENDSBYTE:××××××××××××××××B,即段可以從任何地址開始;WORD:×××××××××××××××0B,即段的起始地址必須為偶地址;PARA:××××××××××××0000B,即段從節(jié)(PARAGRAPH)邊界開始,每16個字節(jié)為1小段,所以,其起始地址必為16的倍數(shù)。PAGE:××××××××00000000B,即段從頁邊界開始,每256個字節(jié)為1頁,所以,其起始地址必為256的倍數(shù)。*定位類型:說明段的起始地址應(yīng)有怎樣的邊界值:*組合類型:說明程序連接時的段合并方法

1PUBLIC:將同類別名段組裝在一起形成一個邏輯段;2STACK:與PUBLIC一樣,只用于堆棧段。在匯編及連接后,系統(tǒng)自動為SS及SP分配值,在可執(zhí)行程序中,SP初值指向棧底。3COMMON:同名段從同一個內(nèi)存地址開始裝入。所以,各個邏輯段將發(fā)生覆蓋。連接以后,該段長度取決于同名段中最長的那個,而內(nèi)容有效的是最后裝入的那個。4MEMORY:與PUBLIC同義,只不過MEMORY定義的段裝在所有同名段的最后。假設(shè)連接時出現(xiàn)多個MEMORY,那么最先遇到的段按組合類型MEMORY處理,其他段組合類型按PUBLIC處理。5PRIVATE:不組合,該段與其它段邏輯上不發(fā)生關(guān)系,即使同名,各段擁有各自的段基值。[缺省值]6ATexp:段地址為表達(dá)式exp的值(長度為16位)。此項不能用于代碼段。

當(dāng)幾個程序模塊進(jìn)行連接時,其中具有相同類別名的段,按出現(xiàn)的先后順序被裝入連續(xù)的內(nèi)存區(qū)。沒有類別名的段,與其它無類別名的段一起連續(xù)裝入內(nèi)存。類別:類別的作用是在連接時決定各邏輯段的裝入順序。類別名必須用單引號括起來。ASSUME段存放器名:段名[,段存放器名:段名…]ASSUME:用于明確段與段存放器的關(guān)系說明:該偽指令出現(xiàn)在碼段中;本偽指令只是指示各邏輯段使用段存放器的情況,并沒有對段存放器的內(nèi)容進(jìn)行賦值。DS、ES的值必須在程序段中用指令語句進(jìn)行賦值,而CS、SS由系統(tǒng)負(fù)責(zé)設(shè)置,程序中也可對SS進(jìn)行賦值,但不允許對CS賦值。例:ASSUMEDS:DSEG,CS:CSEG,ES:ESEG,SS:SESG例:ASSUMECS:CODE,DS:DATA,ES:DATA*【例】按下面要求,寫出程序框架數(shù)據(jù)段從0E000H開始,其中有100字節(jié)的數(shù)組,其類型屬性既是字又是字節(jié);2.堆棧段從小段開始,段組名為STACK;3.代碼段中指定段存放器,主程序從1000H開始,給有關(guān)段存放器賦值;4.程序結(jié)束。DSEGSEGMENTAT0E000HD_BYTEDB100DUP(?)D_WORDEQUWORDPTRD_BYTEDSEGENDSSSEGSEGMENTPARA‘STACK’DB200DUP(?)SSEGENDSCSEGSEGMENTORG1000HASSUMECS:CSEG,DS:DSEG,SS:SSEGMAINPROCFARXORAX,AXPUSHAXPUSHDSMOVAX,DSEGMOVDS,AX

……RETMAINENDPCSEGENDSENDMAIN4.模塊定義和結(jié)束偽指令⑴NAME格式:NAME模塊名功能:為源程序的目標(biāo)程序指定一個模塊名。如果程序中沒有NAME偽指令,那么匯編程序?qū)ITLE偽指令定義的標(biāo)題名前6個字符作為模塊名;如果程序中既沒有NAME,又沒有TITLE,那么匯編程序?qū)⒃闯绦虻奈募鳛槟繕?biāo)程序的模塊名。格式:END[標(biāo)號]功能:表示源程序的結(jié)束。標(biāo)號指示程序開始執(zhí)行的起始地址。如果多個程序模塊相連接,那么只有主程序要使用標(biāo)號,其它子模塊只用END而不必指定標(biāo)號。⑵END5、其它偽指令⑴對準(zhǔn)偽指令EVEN格式:EVEN功能:使下一個分配地址為偶地址。說明:在8086中,一個字的地址最好為偶地址。因為8086CPU同樣的存取一個字,如果地址是偶地址,需要一個讀或?qū)懼芷?,如果是奇地址,需?個讀或?qū)懼芷?。所以,該偽指令常用于字定義語句之前。格式:ORG表達(dá)式表達(dá)式取值范圍為:0~65535,無符號數(shù)功能:指定其后的程序段或數(shù)據(jù)塊所存放的起始地址的偏移量。⑵定位偽指令ORG格式:RADIX表達(dá)式表達(dá)式取值為2~16內(nèi)任何整數(shù)。功能:指定匯編程序使用的默認(rèn)數(shù)制。缺省為十進(jìn)制?!纠?MOVBX,0FFH;十六進(jìn)制數(shù)要加后綴

MOVBX,178;十進(jìn)制數(shù)不要加后綴

RADIX16;設(shè)置16進(jìn)制為默認(rèn)數(shù)制

MOVAX,0FF;十六進(jìn)制數(shù)不要加后綴

MOVBX,178D;十進(jìn)制數(shù)要加后綴⑶基數(shù)控制偽指令RADIX4.1.3匯編語句與運算符1、語句格式:[名字]操作[操作數(shù)][;注釋]常量、變量和表達(dá)式組成由常量、變量和運算符組成

算法運算符+、-、*、/、MOD

邏輯運算符AND、OR、NOT、XOR

關(guān)系運算符EQ、NE、LT、GT、LT、LE、GE

分析運算符SEG、OFFSET、TYPE、LENGTH、SIZE

屬性運算符PTR、THIS、SHORT

其它LOW、HIGH2、運算符例1)ARRAYDW1*2+3-4,56HMOVAX,ARRAY;匯編后為:MOVAX,12)MOVAL,7FHMOD2;匯編后為:MOVAL,13)MOVAH,15/4;匯編后為:MOVAH,3〔1〕算術(shù)運算符〔2〕邏輯運算符例1:MOVAH,11110000BMOVAL,NOTAH;MOVAL,00001111BMOVBL,AHORAL;MOVBL,11111111BMOVBH,AHXORAL;MOVBH,11111111B例2:從端口86H讀取一個字節(jié),高位屏蔽后從端口6送出。

PORTEQU86HINAL,PORTAND1AL,0FH;AND1為邏輯指令

MOVDX,PORTAND20FH;AND2為匯編運算符

OUTDX,AL〔3〕關(guān)系運算符關(guān)系運算符兩邊的操作數(shù)必須是兩個數(shù)值或同一段中兩個存儲單元地址,運算結(jié)果應(yīng)為邏輯值,結(jié)果為真,表示為0FFFFH;結(jié)果為假,那么表示為0。例:AEQU80HBEQU88HMOVAL,AEQBMOVAH,ANEBMOVBL,ALTBMOVBH,AGTB

MOVCL,ALEBMOVCH,AGEB〔4〕分析/數(shù)值返回運算符SEG變量或標(biāo)號返回變量或標(biāo)號的段地址OFFSET變量或標(biāo)號返回變量或標(biāo)號的偏移量TYPE變量或標(biāo)號LENGTH變量SIZE變量返回變量或標(biāo)號的類型值返回DUP定義的數(shù)據(jù)占據(jù)的單元數(shù);非DUP定義的數(shù)據(jù),返回1。返回DUP定義的數(shù)據(jù)占據(jù)的字節(jié)數(shù);非DUP定義的數(shù)據(jù),返回類型值。變量類型值:

DB:1,DW:2,DD:4,DQ:8,DT:10。標(biāo)號類型值:NEAR:-1,F(xiàn)AR:-2?!纠繑?shù)據(jù)定義如下:DATASEGMENTAT2000HBUF1DB0,1,2,3,4,5,6,7,8,9BUF2DW5DUP(0)DATAENDS那么:SEGBUF1=2000HSEGBUF2=2000HOFFSETBUF1=0000HOFFSETBUF2=000AHTYPEBUF1=1TYPEBUF2=2LENGTHBUF1=1LENGTHBUF2=5SIZEBUF1=1SIZEBUF2=10(5)屬性運算符

屬性運算符用來建立或改變已定義變量、內(nèi)存操作數(shù)或標(biāo)號的類型屬性。屬性運算符有:

PTR、THIS、SHORT1〕PTR類型PTR變量/標(biāo)號典型應(yīng)用之一:重新指定變量類型例:數(shù)據(jù)定義如下:BUFWDW1234H,5678H那么以下指令合法:MOVAX,BUFW;臨時改變BUFW的字屬性為字節(jié)屬性MOVAL,BYTEPTRBUFW典型應(yīng)用之二:指定內(nèi)存操作數(shù)的類型例:INC[BX];匯編將指示出錯

INCBYTEPTR[BX];正確

INCWORDPTR[BX][SI];正確分析:在存放器間接尋址、存放器相對尋址、基址變址尋址或相對基址變址尋址等內(nèi)存尋址方式中,往往很難判斷出操作數(shù)的類型屬性,應(yīng)對操作數(shù)類型加以說明。典型應(yīng)用之三:與EQU一起定義一個新的變量變量或標(biāo)號EQU類型PTR

例:BUFWDW1234H,5678HBUFBEQUBYTEPTRBUFW;BUFB的類型屬性為字節(jié),其它屬性與BUFW一樣?!璏OVAX,BUFW;AX=1234HMOVAL,BUFB;AL=34H2)THIS格式:THIS類型可以像PTR一樣建立一個指定類型的地址操作數(shù),該操作數(shù)的段地址和偏移地址與下一個存儲單元地址相同。

例:BUFB EQUTHISBYTEBUFWDW1234H,5678H…….MOVAX,BUFW;AX=1234HMOVBL,BUFB;BL=34HBUFB的偏移地址和BUFW完全相同,但它是字節(jié)類型;而BUFW那么是字類型。3)SHORT格式:

SHORT標(biāo)號返回值:偏移量在-128~+127范圍內(nèi)的標(biāo)號。說明:用于JMP指令。即:JMPSHORT標(biāo)號,指明是短轉(zhuǎn)移。4)其它字節(jié)別離運算符HIGH、LOW格式:HIGH表達(dá)式LOW表達(dá)式返回值:表達(dá)式值的高字節(jié)或低字節(jié)【例】CONSTEQU0ABCDHMOVAH,HIGHCONST;AH=0ABHMOVCL,LOWCONST;CL=0CDH運算符的優(yōu)先級優(yōu)先級運算符1()、[]、<>2LENGTH、SIZE、WIDTH、3PTR、OFFSET、SEG、TYPE、THIS4HIGH、LOW5*、/、MOD6+、-7EQ、NE、LT、LE、GE、GE8NOT9AND10OR、XOR11SHORT3.注釋項注釋項用來說明一段程序或一條或幾條指令的功能,此項為可選項,不會影響程序的執(zhí)行。好的注釋,使程序容易讀懂、便于維護(hù)。對編程者而言,注釋項是一種“備忘錄〞。寫注釋時,要注意注釋不僅是對指令自身功能的說明,而更應(yīng)從整體上說明該語句或一組語句所起的作用。

在循環(huán)程序的開始都有初始化程序,設(shè)置有關(guān)工作單元的初值:

MOVCX,100;將100送入CX MOVSI,0100H;將0100送入SI MOVDI,0200H;將0200送入DI這樣注釋沒有說明它們在程序中的真正作用,應(yīng)改為:

MOVCX,100;循環(huán)計數(shù)器CX置初值

MOVSI,0100H;源數(shù)據(jù)區(qū)指針SI置初值

MOVDI,0200H;目標(biāo)數(shù)據(jù)區(qū)指針DI置初值例多個模塊之間的參數(shù)傳送:局部符號:在本模塊中定義,在本模塊中引用的符號外部符號:在某一模塊中定義,在另一模塊中引用的符號

PUBLIC符號EXTRN符號:類型

extrnproadd:far…………code1segmentstart:……callfarptrproadd

……code1endsendstart;proadd1.asmpublicproadd…………code2segmentproaddprocfar……retproaddendpcode2endsend;proadd2.asm*、PUBLIC與EXTRN

例:;proadd1.asmextrnproadd:fardatasegmentcommonarydw1,2,3,4,5,6,7,8,9,10countdw10sumdw?dataendscode1segmentmainprocfarassumecs:code1,ds:datastart:movax,datamovds,ax

callfarptrproadd

movah,4chint21hmainendpcode1endsendstart;proadd2.asmpublicproadddatasegmentcommonarydw1,2,3,4,5,6,7,8,9,10countdw10sumdw?dataends

code2segmentproaddprocfarassumecs:code2,ds:data

movax,datamovds,ax

pushaxpushcxpushsileasi,arymovcx,countxorax,axnext:addax,[si]addsi,2loopnextmovsum,ax

popsipopcxpopax

retproaddendpcode2endsend4.2

匯編語言程序?qū)崿F(xiàn)匯編程序返回DOS方法1.標(biāo)準(zhǔn)方法

MAINPROCFARPUSHDSMOVAX,0PUSHAX

……RETMAINENDP

2.DOS功能調(diào)用方法

……MOVAH,4CHINT21H

4.3.1概述4.3.2順序結(jié)構(gòu)程序設(shè)計4.3.3分支結(jié)構(gòu)程序設(shè)計4.3.4循環(huán)結(jié)構(gòu)程序設(shè)計4.3.5子程序設(shè)計4.3.6*宏定義與使用4.3.7系統(tǒng)功能調(diào)用4.3匯編語言程序設(shè)計方法及應(yīng)用(1)分析問題包括找出條件、問題特點、問題中的規(guī)律并歸納出數(shù)學(xué)模型。注意:有些問題不一定非要寫出數(shù)學(xué)模型,或者根本寫不出數(shù)學(xué)模型。但是,當(dāng)有了一個數(shù)學(xué)模型之后,就可使用很多行之有效的計算方法。(2)確定算法指根據(jù)人們在解決實際問題時的邏輯思維中的常規(guī)推理,去找算法。如果已有數(shù)學(xué)模型,可以直接或間接利用一些現(xiàn)有的計算方法。1.程序設(shè)計步驟4.3.1概述(3)繪制流程圖采用流程圖:(1)使解題思路清淅,有利于理解和編制程序;(2)有利于修改程序和減少錯誤等;(3)對于一個復(fù)雜的問題,可以畫多級流程圖,先畫出粗框圖,再逐步求精,畫出細(xì)框圖。

流程圖是程序算法的圖形描述,即用圖形的方式把解決問題的先后次序和程序的邏輯結(jié)構(gòu)直觀地、形象地描述出來;(4)分配存儲空間及工作單元(包括存放器)8088/8086存儲器結(jié)構(gòu)要求存儲空間分段使用。因此,數(shù)據(jù)段、堆棧段、代碼段以及附加段要按需要分別定義。工作單元即可以設(shè)置在數(shù)據(jù)段或附加段中的某些存儲單元,也可以設(shè)置在CPU內(nèi)部的數(shù)據(jù)存放器中。

根據(jù)流程圖和確定的算法逐條語句地編寫程序,注意不同的機(jī)器有不同的指令系統(tǒng)。(5)編寫程序(6)靜態(tài)檢查看程序是否具有所要求的功能;程序是否清晰易讀;選用指令是否適宜;程序語法和格式上是否有錯;指令中引用的符號、標(biāo)號和變量是否認(rèn)義正確;程序執(zhí)行流程是否符合算法和流程圖等等;適當(dāng)考慮字節(jié)數(shù)要少,執(zhí)行速度要快等。(7)運行調(diào)試靜態(tài)檢查可以發(fā)現(xiàn)一些問題,但畢竟還受到個人主觀因素的影響。只有在機(jī)上運行通過并且結(jié)論正確的程序,才是正確的程序。事實上,即使一個非常有經(jīng)驗的程序員,也不能說程序一編就成功,特別是一些復(fù)雜的程序,必須經(jīng)過調(diào)試、修改、再調(diào)試、再修改,反復(fù)屢次之后,才能得到一個比較滿意的程序。【例】編程實現(xiàn)在100個無符號字節(jié)整數(shù)的數(shù)組中找出最大數(shù)。(1)分析問題本例中,有100個整數(shù)的數(shù)組,可以把它看作一個集合,記作{S}。在此集合中找出最大數(shù),記為max{S}。(2)確定解決問題的算法人工方法:首先從第一個數(shù)據(jù)開始,一邊看一邊比較兩個數(shù)的大小,看到較大數(shù)就記下,將較小數(shù)丟掉;再將此較大數(shù)與下一個數(shù)進(jìn)行比較,始終將比較大的數(shù)記下,一直將數(shù)組中的數(shù)兩兩比較完畢,就能找到最大數(shù)。首先,建立一個數(shù)據(jù)指針指向數(shù)據(jù)區(qū)的首地址,將第一個數(shù)取到某個存放器中(例AL),與下一個數(shù)相比較,假設(shè)下一個數(shù)大,就將它存到AL中,替換掉原來的數(shù);然后調(diào)整數(shù)據(jù)指針,將AL的數(shù)與此指針?biāo)傅臄?shù)進(jìn)行比較,再重復(fù)上述步驟,兩兩比較下去,直到比較完畢,結(jié)果AL中留下最大數(shù)。(3)算法、流程圖開始初始化取第一個數(shù)到寄存器與下一個數(shù)比較

下一個數(shù)大?取大數(shù)到寄存器調(diào)整修改工作單元

查找結(jié)束?結(jié)束YNNY(4)存儲設(shè)計及數(shù)據(jù)定義把數(shù)組存放在數(shù)據(jù)段中,并設(shè)置50個字節(jié)堆棧空間。利用BX存放器作數(shù)據(jù)指針,用CX作計數(shù)器,用AL暫存較大數(shù)。DSEGSEGMENT;定義數(shù)據(jù)段

ARRAYDBX1,X2……

COUNTDW$-ARRAY;計算數(shù)據(jù)個數(shù)DSEGENDSSSEGSEGMENTPARASTACK‘STACK’

;定義堆棧段

SDATDB50DUP(?)TOPEQULENGTHSDATSSEGENDS

CSEGSEGMENT;定義代碼段

ASSUMECS:CSEG,DS:DSEG,SS:SSEGMAINPROCFAR;定義過程

START:PUSHDS;為返回DOS作準(zhǔn)備

MOVAX,0PUSHAXMOVAX,DSEGMOVDS,AX;設(shè)置DSMOVAX,SSEGMOVSS,AX;設(shè)置SSMOVAX,TOPMOVSP,AX;設(shè)置SP初值

MOVBX,OFFSETARRAY;設(shè)置數(shù)據(jù)區(qū)指針首地址MOVCX,COUNT;設(shè)置計數(shù)器初值DECCX;設(shè)置比較次數(shù)MOVAL,[BX];取數(shù)入ALAGAIN:INCBX;指向數(shù)據(jù)區(qū)下一個數(shù)據(jù)CMPAL,[BX];兩數(shù)比較JAENEXT;AL≥[BX],轉(zhuǎn)NEXTMOVAL,[BX];否那么,把較大數(shù)取入ALNEXT:DECCX;全部數(shù)據(jù)比較完否?JNZAGAIN;否,轉(zhuǎn)AGAINRET;全部比較完畢,返回DOSMAINENDPCSEGENDSENDSTART匯編語言的根本結(jié)構(gòu):2.結(jié)構(gòu)化程序設(shè)計4.3.2順序結(jié)構(gòu)程序設(shè)計BCA順序結(jié)構(gòu)

順序結(jié)構(gòu)程序又稱簡單程序。這種結(jié)構(gòu)的程序中無程序跳轉(zhuǎn)指令、無循環(huán)指令,所有指令按其書寫順序逐條順序執(zhí)行,程序的執(zhí)行路徑從上到下只有一條。因此,順序程序的設(shè)計只要依照步驟寫出相應(yīng)的指令即可?!纠}4.3】將存儲單元A中2個壓縮BCD數(shù)拆成2個非壓縮的BCD碼,低位BCD數(shù)存入C中,高位BCD數(shù)存于B中,并將對應(yīng)的ASCII碼存入C1及B1中。分析:將1個字節(jié)中的兩位BCD碼分開,即分別取出其高4位和低4位。得到低位BCD碼的方法是:屏蔽高4位、保存低4位。得到高位BCD碼的方法是:邏輯右移4位,左邊移入4個0。由未組合的BCD碼轉(zhuǎn)為ASCII碼,只要加30H或“OR30H〞。DATASEGMENT;數(shù)據(jù)定義

ADB37H;被轉(zhuǎn)換數(shù)

BDB?;安排結(jié)果保存空間

CDB?

B1DB?;保存中間結(jié)果

C1DB?;保存中間結(jié)果DATAENDS流程圖及編碼CODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:PUSHDSMOVAX,0PUSHAX;保存返回地址

MOVAX,DATAMOVDS,AX;設(shè)置DS MOVAL,A;取出高位BDC碼

MOVCL,4 SHRAL,CL MOVB,AL ORAL,30H;高4位,轉(zhuǎn)換成ASCII碼

MOVB1,AL;保存高4位的轉(zhuǎn)換結(jié)果

MOVAL,A;取出低位BCD碼

ANDAL,0FH MOVC,AL ORAL,30H;低位BCD碼,轉(zhuǎn)換成ASCII碼

MOVC1,AL;保存低4位的轉(zhuǎn)換結(jié)果 RET;返回DOSMAINENDPCODEENDS ENDSTARTP97:閱讀下面程序,指出運行結(jié)果DATASEGMENTBLOCKDW0ABCDHBUFFDD?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA

START:MOVAX,DATAMOVDS,AXMOVDX,BLOCKMOVAX,DXANDAX,0F0FHANDDX,0F0F0HMOVCL,4SHRDX,CLLEABX,BUFMOV[BX+0],ALMOV[BX+1],DLMOV[BX+2],AHMOV[BX+3],DHMOVAX,4C00HINT21HCODEENDSENDSTART4.3.3分支程序設(shè)計分支程序結(jié)構(gòu):跳轉(zhuǎn)的實現(xiàn)在8088/8086指令系統(tǒng)中,判斷的依據(jù)主要是運算結(jié)果及運算標(biāo)志存放器中的狀態(tài)位。實現(xiàn)跳轉(zhuǎn)的指令是無條件跳轉(zhuǎn)指令:JMPlabel與條件跳轉(zhuǎn)指令:Jccshort-label雙分支程序雙分支程序有以下五個局部組成:⑴產(chǎn)生條件的語句:如算術(shù)運算指令、比較指令、移位指令等,通過它們影響標(biāo)志存放器狀態(tài)位ZF、CF、OF、SF等,為條件測試作準(zhǔn)備。⑵條件測試語句:利用條件轉(zhuǎn)移指令進(jìn)行測試。⑶定向:根據(jù)判斷的條件,決定程序的不同走向,在兩種可能轉(zhuǎn)移方向中選擇其一。⑷順序控制圖:無論選擇哪個方向,都必須保證執(zhí)行分支段程序后,程序順序執(zhí)行下去。⑸標(biāo)號:在分支程序段前設(shè)置標(biāo)號,以便于轉(zhuǎn)移。S1:…………;程序段1,產(chǎn)生條件

……JccBRANCH;條件測試,并定向

…………;分支程序段1……

JMPS2;順序控制BRANCH:…………;分支程序段2……S2:……程序段1條件測試分支1分支2YNS2BRANCH圖4.11雙分支程序組成【例題4.4】比較兩個無符號字節(jié)數(shù),把大數(shù)存入MAX單元。CSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEG;給數(shù)據(jù)段地址附值MOVDS,AXMOVAL,NUMBER;取第一個數(shù)CMPAL,NUMBER+1;與第二個數(shù)JNCBRANCH;假設(shè)第一個數(shù)>第二個數(shù),轉(zhuǎn)BRANCHMOVAL,NUMBER+1;否那么,第二個數(shù)大BRANCH:MOVMAX,AL;保存較大數(shù)MOVAH,4CHINT21HCSEGENDSENDSTART;匯編結(jié)束DSEGSEGMENTNUMBERDB32h,54hMAXDB?DSEGENDS數(shù)據(jù)定義碼段多分支程序設(shè)計多分支結(jié)構(gòu)中,條件有多個。這些條件之間存在兩種情況:一是所有條件中只可能有一個條件成立,稱為“相異性條件〞;二是所有條件中可能有兩個以上甚至所有條件都成立,稱“相容性條件〞。對于相異性條件,要保證各個條件所對應(yīng)的分支程序段互斥執(zhí)行,即對特定的輸入,只能選擇分支程序中的一個運行。對于相容性條件,注意條件判定的次序,一旦找到成立的條件后,就執(zhí)行相應(yīng)的程序段,其后的條件是否成立,就不進(jìn)行判斷了。多分支程序設(shè)計方法

設(shè)計多分支程序的關(guān)鍵是如何按條件對多分支進(jìn)行判斷,從而根據(jù)不同的條件,轉(zhuǎn)移到不同的入口去執(zhí)行。常用方法有三種:轉(zhuǎn)移表法地址表法邏輯分解法。⑴轉(zhuǎn)移表法轉(zhuǎn)移表法也稱為跳轉(zhuǎn)表法,其設(shè)計思想是:把轉(zhuǎn)移到各分支的轉(zhuǎn)移指令預(yù)先依次存放在一張表中,此表稱為“跳轉(zhuǎn)表〞,如圖4.13所示;分支選擇時,先計算實現(xiàn)該分支的跳轉(zhuǎn)指令在跳轉(zhuǎn)表中的地址x;然后通過一個JMPx指令,跳轉(zhuǎn)到該處,實現(xiàn)分支選擇,如圖4.14所示。跳轉(zhuǎn)表【例題4.5】設(shè)一監(jiān)控程序,有10個編號分別為0~9控制命令鍵,如啟動、執(zhí)行、復(fù)位等,按下任一命令鍵相當(dāng)于發(fā)出一條鍵盤命令,而這些命令功能的實現(xiàn)由10個子程序完成,這些子程序的入口地址為ADR0~ADR9。采用轉(zhuǎn)移表法,首先將JMPADR0~JMPADR9的10條跳轉(zhuǎn)到10個子程序的指令存于跳轉(zhuǎn)表中。如果按鍵號為X,因每條跳轉(zhuǎn)指令長度為3個字節(jié),那么按鍵X對應(yīng)的命令子程序的跳轉(zhuǎn)命令在跳轉(zhuǎn)表中的偏移量是3X。設(shè)X已送入存放器AL,由X實現(xiàn)轉(zhuǎn)向相應(yīng)命令子程序的程序如下:MOVAH,0MOVBL,ALADDAL,AL;求2XADDAL,BL;求3X,即位移量MOVBX,OFFSETBRA_TAB;設(shè)BRA_TAB為表首ADDBX,AXJMPBX⑵地址表法如果把上述跳轉(zhuǎn)表中的跳轉(zhuǎn)指令換成各分支程序的入口地址,即為地址表。地址表法指:多分支跳轉(zhuǎn)時通過采用間接尋址方式,從地址表中找到分支入口地址實現(xiàn)分支選擇?!纠}4.6】某工廠有8種產(chǎn)品的加工程序R0~R7分別存放在以ADR0~ADR7為首地址的內(nèi)存區(qū)域,這8個首地址連續(xù)存放在以BASE為首地址的地址表內(nèi),如下圖。從圖知:偏移量=產(chǎn)品編號×2表地址=表基地址+偏移量根據(jù)產(chǎn)品編號,選擇加工程序的局部代碼如下:DSEGSEGMENTBASEDWADR0,ADR1,ADR2,ADR3,ADR4,ADR5,ADR6,ADR7;地址表BNDW?;產(chǎn)品編號DSEGENDSCSEGSEGMENT

MOVSI,BN;取產(chǎn)品編號

ADDSI,SI;計算偏移量

MOVBX,BASE[SI];計算表地址

JMP[BX];分支跳轉(zhuǎn)

RETSTARTENDPCSEGENDSENDBEGIN⑶邏輯分解法邏輯分解法的思路是將多分支結(jié)構(gòu)按條件的先后依次分解成一串雙分支結(jié)構(gòu),然后使用雙分支的實現(xiàn)方法進(jìn)行程序設(shè)計。此方法多用于相容性條件的多分支程序。【例題4.7】假設(shè)存放器AL中存放了當(dāng)前外部中斷請求的情況。AL中的每一位D7~D0對應(yīng)一個中斷源的中斷請求,共8個INT7~I(xiàn)NT0。假設(shè)有中斷請求INTi,對應(yīng)位Di為1;無中斷請求,對應(yīng)位為0,并設(shè)某一刻系統(tǒng)只能響應(yīng)一個中斷請求。由于系統(tǒng)中可能會同時出現(xiàn)多個中斷請求(即AL中同時有多位為1),因此必須對中斷請求設(shè)置優(yōu)先級。假定優(yōu)先級順序與數(shù)據(jù)位低到高的順序一致,即D0上中斷請求最高,D7上中斷請求最低,處理流程如下圖。在進(jìn)行條件測試時,通過對存放器AL移位,依次檢測各位,程序為:……RORAL,1;取D0位JCR0;檢測D0位RORAL,1;取D1位JCR1;檢測D1位RORAL,1;取D2位JCR2;檢測D2位……RORAL,1;取D7位JCR7;檢測D7位……【例】編程實現(xiàn)以下函數(shù)的功能,其中X、Y為無符號字節(jié)數(shù)?!捕喾种А沉鞒虉D(AL)=X(BL)=Y開始(AL)=(BL)?Z=0YZ=1Y(AL)>(BL)?NZ=-1N結(jié)束PUSH DSSUB AX,AXPUSH AXMOV AX,DATMOV DS,AXCMP AL,BLJE C1 JA C2EXT: MOVZ,AL RETMOV AL,X MOV BL,YC1:MOV AL,0JMP EXTC2:MOV AL,1JMP EXTMOVAL,-1CMPAL,BL JEC1 JAC2 MOVAL,-1 JMP EXTC2: MOV AL,1 JMP EXTC1:MOV AL,0EXT:MOVZ,AL RETMainendpCSEGENDSENDSTARTSk41.asmDATASEGMENTXDB56hYDB88HZDB?DATAENDSCSEGSEGMENTASSUMECS:CSEG,DS:DATAMainprocfarSTART: PUSH DS SUBAX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AL,X MOV BL,Y循環(huán)結(jié)構(gòu)程序設(shè)計(1)初始化局部這是循環(huán)的準(zhǔn)備局部,為程序操作、地址指針、循環(huán)計數(shù)、結(jié)束條件等設(shè)置初始值。(2)循環(huán)體,包括以下3個局部:循環(huán)工作局部這是循環(huán)程序的主體,完成程序的根本操作,循環(huán)多少次,這局部語句就執(zhí)行多少次。循環(huán)修改局部修改循環(huán)工作局部的變量地址等,這保證每次重復(fù)時,參加執(zhí)行的數(shù)據(jù)能發(fā)生有規(guī)律的變化。循環(huán)控制局部保證循環(huán)條件滿足時進(jìn)入循環(huán);循環(huán)結(jié)束條件不滿足時,退出循環(huán),執(zhí)行循環(huán)體外的后續(xù)語句。(3)循環(huán)結(jié)束局部完成循環(huán)結(jié)束后的處理,如數(shù)據(jù)分析、結(jié)果的存放等。循環(huán)程序典型結(jié)構(gòu)零次或先判斷后執(zhí)行先判斷循環(huán)條件是否滿足。當(dāng)循環(huán)條件滿足時,執(zhí)行循環(huán)體;當(dāng)循環(huán)條件不滿足時,執(zhí)行結(jié)束局部。這種結(jié)構(gòu)的循環(huán),有可能循環(huán)體一次也得不到執(zhí)行非零次或先執(zhí)行后判斷循環(huán)體至少執(zhí)行一次后,才判別循環(huán)條件循環(huán)程序典型結(jié)構(gòu)【例】(P100)統(tǒng)計BUFF緩沖區(qū)數(shù)據(jù)中負(fù)數(shù)的個數(shù)。

數(shù)據(jù)段定義如下:DATA SEGMENTBUFF DB-1,-3,5,6,9,… ;定義若干字節(jié)帶符號數(shù)CUNT EQU $-BUF F ;計算數(shù)據(jù)塊長度MEM DB ? ;定義存放結(jié)果單元DATA ENDS〔1〕先執(zhí)行后判斷DATASEGMENTBUFFDB-1,-3,5,6,9,0,78; 定義帶符號數(shù)CUNTEQU$-BUFF;計算數(shù)據(jù)塊長度MEMDB?;定義存放結(jié)果單元DATAENDSCSEGSEGMENTASSUMECS:CSEG,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETBUFF;建立數(shù)據(jù)指針

MOVCX,CUNT ;設(shè)置循環(huán)次數(shù)

MOVDL,0 ;結(jié)果初值

NEXT:MOVAL,[BX];取數(shù)據(jù)

ADDAL,0JNSPLUS;是正數(shù),轉(zhuǎn)去PLUSINCDL;是負(fù)數(shù),負(fù)數(shù)個數(shù)+1PLUS:INCBX;調(diào)整數(shù)據(jù)指針

LOOPNEXT;CX-1≠0,繼續(xù)循環(huán)

MOVMEM,DLMOVAH,4CHINT21HCSEGENDSENDSTART;匯編結(jié)束【例】P100AX存放器中有一個16位的二進(jìn)制數(shù),編程統(tǒng)計其中1的個數(shù),結(jié)果存放在CX存放器中。控制循環(huán)體的條件是:當(dāng)AX內(nèi)容為全0,不必再繼續(xù)統(tǒng)計?!?〕先判斷后執(zhí)行循環(huán)體可能一次都不執(zhí)行。關(guān)鍵程序如下:

MOVCX,16MOVDL,0 ;置結(jié)果計數(shù)器初值BB1: AND AX,AX ;AX=0否

JZ EXIT ;是,退出循環(huán)

SAL AX,1 ;否,AX的最高位移至CF中

JNC ZERO ;CF=0,轉(zhuǎn)ZERO繼續(xù)循環(huán)

INC DL ;CF=1,結(jié)果計數(shù)器加1ZERO:LOOP BB1 EXIT: 方法二:每位和1“與〞,不等0那么為1。 MOV CX,16 MOV DX,0001HAA: TEST AX,DX JZ LOP : ;Di=1LOP: SHR AX,1 LOOP AA方法三:LOP: TEST AX,0FFFFH JZ STOP JNS SHIFT ;查SF INC CXSHIFT:SHL AX,1 JMP LOP STOP:HLT3.循環(huán)控制方法每個循環(huán)程序必須選擇一個循環(huán)控制條件,來控制循環(huán)的運行和結(jié)束。常用循環(huán)控制條件〔方法〕:〔1〕計數(shù)控制——循環(huán)次數(shù),每循環(huán)一次加/減1?!?〕條件控制——循環(huán)次數(shù)未知,須根據(jù)條件控制循環(huán)?!?〕狀態(tài)控制——根據(jù)事先設(shè)置或?qū)崟r檢測的狀態(tài)來控制循環(huán)。*【例】統(tǒng)計字符串STRING中空格的個數(shù)。數(shù)據(jù)定義為:DSEGSEGMENTSTRINGDB‘Wherethereisawill,’

DB‘thereisaway.$’

RESULTDW?DSEGENDS被統(tǒng)計的字符串開設(shè)結(jié)果存放單元CSEGSEGMENTASSUMEDS:DSEG,CS:CSEGSTART:MOVAX,DATAMOVDS,AX給數(shù)據(jù)段段地址附值取數(shù)空格?累計計數(shù)器加1修改地址指針結(jié)束符?MOVBX,OFFSETSTRINGMOVDX,0NEXT:MOVAL,[BX]CMPAL,‘$’

JZFINCMPAL,20HJNZCONTINCDXCONT:INCBXJMPNEXTFIN:MOVRESULT,DXMOVAH,4CH

INT21HCSEGENDSENDSTART初始化保存結(jié)果結(jié)束YNYN循環(huán)程序控制方法之一:計數(shù)法〔循環(huán)次數(shù)〕1.正計數(shù)法2.負(fù)計數(shù)法計數(shù)器的初值為0,每執(zhí)行一遍循環(huán),計數(shù)器加1,然后與規(guī)定的循環(huán)次數(shù)比較,假設(shè)相等,那么結(jié)束循環(huán),否那么繼續(xù)循環(huán)。計數(shù)器的初值為循環(huán)次數(shù),每執(zhí)行一遍循環(huán)體后,計數(shù)器減1,當(dāng)減為0時,結(jié)束循環(huán),否那么繼續(xù)循環(huán)。正計數(shù)法負(fù)計數(shù)法循環(huán)程序控制方法之二:條件控制

當(dāng)只知道進(jìn)入或結(jié)束循環(huán)的條件,而無法知道循環(huán)次數(shù)時,可采用條件控制法。1.精度:對于數(shù)值求解問題,有時無法得到精確解。通常的方法是,在迭代計算過程中,把本次迭代結(jié)果與前一次迭代結(jié)果相比,當(dāng)符合精度要求時,結(jié)束迭代循環(huán)。2.設(shè)置結(jié)束標(biāo)志:在數(shù)組和表格處理問題中,在數(shù)據(jù)表格末尾設(shè)置一結(jié)束標(biāo)志,作為循環(huán)結(jié)束條件。【例】〔P101〕在BLOCK內(nèi)存區(qū)中有一串字符,試編程統(tǒng)計“%〞之前的字符個數(shù)DATASEGMENTBLOCKDB‘ANDEPO%WR’COUNTEQU$-BLOCKMEMDB0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETBLOCKMOVCX,COUNT

LOOP1:MOVAL,[SI]CMPAL,‘%’JZDONEINCBYTEPTRMEMINCSILOOPLOOP1DONE:MOVAX,4C00HINT21HCODEENDSENDSTART*邏輯尺【例4.10】設(shè)在數(shù)據(jù)組X和Y中各存在有10個數(shù)據(jù)元素。試編寫程序計算:Z1=X1+Y1、Z2=X2+Y2、Z3=X3-Y3、Z4=X4-T4、Z5=X5-Y5Z6=X6+Y6、Z7=X7-Y7、Z8=X8-Y8、Z9=X9+Y9、Z10=X10+Y10并把結(jié)果存入數(shù)組Z中。

數(shù)據(jù)定義:DSEGSEGMENTXDWX1,X2,X3,X4,X5,X6,X7,X8,X9,X10YDWY1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,Y10ZDW10DUP(?)LRDW0000000011011100BDSEGENDSX1+Y1X3-Y3邏輯尺采用子程序優(yōu)點⑴簡化了程序設(shè)計過程,使程序設(shè)計時間大量節(jié)省;⑵縮短程序的長度,節(jié)省計算機(jī)匯編源程序的時間和程序的存儲單元;⑶增加程序的可讀性,便于程序修改。4.3.5子程序設(shè)計調(diào)用圖示…………CALLSUB1………………CALLSUB2……RET………………RET主程序子程序SUB1子程序SUB2主過程子過程1CALL

子過程1斷點1子過程嵌套示意圖子過程2①②③④⑤⑥④⑤RETRETCALL

子過程2斷點2⑥⑦⑧⑨子程序中斷在中斷程序中又調(diào)用子程序子程序設(shè)計中的問題主程序與子程序的連接主、子程序都存放在代碼段:CALL:斷點保護(hù),轉(zhuǎn)子程序。RET:斷點恢復(fù)。 假設(shè)主、子程序在同一代碼段,為段內(nèi)調(diào)用; 假設(shè)主、子程序各在不同的代碼段,為段間調(diào)用。子程序設(shè)計1、過程定義、過程調(diào)用過程名PROC[類型]

…RET

…過程名ENDP〔1〕.定義〔2〕.調(diào)用CALL過程名NEAR子程序書寫形式CODESEGMENTASSUME……

MAINPROCFAR

……

CALLSUB1

……

RET

SUB1PROCNEAR

……

CALLSUB2

……

RET

SUB2PROCNEAR

……

RET

SUB2ENDP

SUB1ENDP

MAINENDPCODEENDS

FAR子程序書寫形式CODE1SEGMENTASSUME……

MAINPROCFAR

……

CALLSUB

……

RET

MAINENDPCODE1ENDSCODE2

SEGMENTASSUME……

SUBPROCFAR

……

RET

SUBENDPCODE2ENDSCALL指令段內(nèi)調(diào)用直接尋址間接尋址CALLproc-nameCALLdisp16①IP←IP+偏移量

②IP入棧;例:CALLSUB1尋址方式格式操作注:段內(nèi)調(diào)用,CS不變

CALLr16/m16①IP入棧;②IP←(r16)/(m16)例:CALLBXCALLWORDPTR[BX]CALL指令段間調(diào)用直接尋址間接尋址CALLFARproc-name①CS入棧;②IP入棧;③CS←過程的段地址;④IP←過程的偏移地址。

例:CALLfarSUB1尋址方式格式操作CALLfarmem32①CS入棧;②IP入棧;③IP←(EA+1,EA)④CS←(EA+3,EA+2)

例:CALLfar[BX]遠(yuǎn)過程名RET指令段內(nèi):RETRETexpIP出棧①IP出棧②SP←SP+exp

段間:RETRETexp①IP出棧②CS出棧

①IP出棧②CS出棧③SP←SP+exp

返回類型格式操作注:返回類型由調(diào)用類型定子程序參數(shù)傳遞方法一:存放器方法二:內(nèi)存方法三:堆棧參數(shù):入口參數(shù)出口參數(shù)在子程序中被處理的數(shù)據(jù)表示子程序處理結(jié)果的數(shù)據(jù)軟延時:指利用CPU執(zhí)行指令需要消耗一定時間的特點實施的延時,常用減1循環(huán)來實現(xiàn)。例:8088CPU,主頻4.77M,每個時鐘周期為:1/4.77M=0.21μs。循環(huán)指令LOOP,當(dāng)CX不為零時,執(zhí)行循環(huán)轉(zhuǎn)移分支,占用17個時鐘周期;當(dāng)CX為零時,退出循環(huán),占用5個時鐘周期。如果CX初值是2801時,執(zhí)行指令WAIT1:LOOPWAIT1,所需時間為:(0.21×2801)×17+0.21×5≈10ms

10ms延時子程序;子程序:DELAY;功能:實現(xiàn)軟件延時,延時單位時間為10ms;入口參數(shù):BX,延時常數(shù),實際延時時間為:10*BX(ms);出口參數(shù):無DELAYPROCNEAR

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論