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

下載本文檔

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

文檔簡介

第4章匯編語言程序設計4.1匯編語言概述

4.2匯編語言程序實現

4.3匯編語言程序設計方法及應用4.4匯編語言程序設計舉例

匯編語言〔AssemblyLanguage〕是一種采用指令助記符、符號地址、標號、偽指令等符號編寫程序的程序設計語言。用匯編語言編寫的程序稱為匯編語言源程序〔SourceProgram〕。一般情況下,一個助記符對應一條機器指令,所以匯編語言也是面向機器的語言。4.1匯編語言概述源程序的結構與組成【例題4.1】實現:123+456→sum的源程序

CODE SEGMENT;語句6

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

……….;

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

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

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

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

變量名,如:A、B、SUM

過程名,如:MAIN

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

段名,如:DATA、CODE

變量名,如:A、B、SUM

過程名,如:MAIN

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

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

[變量名]數據定義偽指令操作數1[,操作數2…]

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

(5)DUP,表示內容重復的數據。具體形式為:次數DUP(被重復的內容)操作數:【例】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定義的數據,每個數據元素占據1個存儲單元;

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

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

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

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

?101

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

例:

VBEQU64×1024;VB代表數值表達式的值

AEQU7BEQUA-2注意:

1.如果表達式中有變量,應在該語句前給出該變量的定義;

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

3.VB、A、B不占用內存(2)等號=格式:名字=表達式功能:與EQU根本相同,區(qū)別是它可以對同一個名字重新定義。例:COUNT=10MOVAL,COUNT;…COUNT=5;可重復定義…例: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格式:變量/標號LABEL類型功能:定義變量或標號的類型,而變量或標號的段屬性和偏移屬性由該語句所處的位置確定。變量的類型有:BYTE、WORD、DWORD、DQ、DT;標號的類型有:NEAR、FAR。【例】利用LABEL使同一個數據區(qū)有一個以上的類型及相關屬性。AREAWLABELWORD;AREAW與AREAB指向相同的數據區(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的倍數。PAGE:××××××××00000000B,即段從頁邊界開始,每256個字節(jié)為1頁,所以,其起始地址必為256的倍數。*定位類型:說明段的起始地址應有怎樣的邊界值:*組合類型:說明程序連接時的段合并方法

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

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

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

MOVBX,178;十進制數不要加后綴

RADIX16;設置16進制為默認數制

MOVAX,0FF;十六進制數不要加后綴

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

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

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

關系運算符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〕算術運算符〔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〕關系運算符關系運算符兩邊的操作數必須是兩個數值或同一段中兩個存儲單元地址,運算結果應為邏輯值,結果為真,表示為0FFFFH;結果為假,那么表示為0。例:AEQU80HBEQU88HMOVAL,AEQBMOVAH,ANEBMOVBL,ALTBMOVBH,AGTB

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

DB:1,DW:2,DD:4,DQ:8,DT:10。標號類型值:NEAR:-1,FAR:-2?!纠繑祿x如下:DATASEGMENTAT2000HBUF1DB0,1,2,3,4,5,6,7,8,9BUF2DW5DUP(0)DATAENDS那么:SEGBUF1=2000HSEGBUF2=2000HOFFSETBUF1=0000HOFFSETBUF2=000AHTYPEBUF1=1TYPEBUF2=2LENGTHBUF1=1LENGTHBUF2=5SIZEBUF1=1SIZEBUF2=10(5)屬性運算符

屬性運算符用來建立或改變已定義變量、內存操作數或標號的類型屬性。屬性運算符有:

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

INCBYTEPTR[BX];正確

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

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

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

SHORT標號返回值:偏移量在-128~+127范圍內的標號。說明:用于JMP指令。即:JMPSHORT標號,指明是短轉移。4)其它字節(jié)別離運算符HIGH、LOW格式:HIGH表達式LOW表達式返回值:表達式值的高字節(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í)行。好的注釋,使程序容易讀懂、便于維護。對編程者而言,注釋項是一種“備忘錄〞。寫注釋時,要注意注釋不僅是對指令自身功能的說明,而更應從整體上說明該語句或一組語句所起的作用。

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

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

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

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

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

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

匯編語言程序實現匯編程序返回DOS方法1.標準方法

MAINPROCFARPUSHDSMOVAX,0PUSHAX

……RETMAINENDP

2.DOS功能調用方法

……MOVAH,4CHINT21H

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

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

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

下一個數大?取大數到寄存器調整修改工作單元

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

ARRAYDBX1,X2……

COUNTDW$-ARRAY;計算數據個數DSEGENDSSSEGSEGMENTPARASTACK‘STACK’

;定義堆棧段

SDATDB50DUP(?)TOPEQULENGTHSDATSSEGENDS

CSEGSEGMENT;定義代碼段

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

START:PUSHDS;為返回DOS作準備

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

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

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

ADB37H;被轉換數

BDB?;安排結果保存空間

CDB?

B1DB?;保存中間結果

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

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

MOVCL,4 SHRAL,CL MOVB,AL ORAL,30H;高4位,轉換成ASCII碼

MOVB1,AL;保存高4位的轉換結果

MOVAL,A;取出低位BCD碼

ANDAL,0FH MOVC,AL ORAL,30H;低位BCD碼,轉換成ASCII碼

MOVC1,AL;保存低4位的轉換結果 RET;返回DOSMAINENDPCODEENDS ENDSTARTP97:閱讀下面程序,指出運行結果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分支程序設計分支程序結構:跳轉的實現在8088/8086指令系統(tǒng)中,判斷的依據主要是運算結果及運算標志存放器中的狀態(tài)位。實現跳轉的指令是無條件跳轉指令:JMPlabel與條件跳轉指令:Jccshort-label雙分支程序雙分支程序有以下五個局部組成:⑴產生條件的語句:如算術運算指令、比較指令、移位指令等,通過它們影響標志存放器狀態(tài)位ZF、CF、OF、SF等,為條件測試作準備。⑵條件測試語句:利用條件轉移指令進行測試。⑶定向:根據判斷的條件,決定程序的不同走向,在兩種可能轉移方向中選擇其一。⑷順序控制圖:無論選擇哪個方向,都必須保證執(zhí)行分支段程序后,程序順序執(zhí)行下去。⑸標號:在分支程序段前設置標號,以便于轉移。S1:…………;程序段1,產生條件

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

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

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

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

MOVSI,BN;取產品編號

ADDSI,SI;計算偏移量

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

JMP[BX];分支跳轉

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

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

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

MOVDL,0 ;結果初值

NEXT:MOVAL,[BX];取數據

ADDAL,0JNSPLUS;是正數,轉去PLUSINCDL;是負數,負數個數+1PLUS:INCBX;調整數據指針

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

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

MOVCX,16MOVDL,0 ;置結果計數器初值BB1: AND AX,AX ;AX=0否

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

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

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

INC DL ;CF=1,結果計數器加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)的運行和結束。常用循環(huán)控制條件〔方法〕:〔1〕計數控制——循環(huán)次數,每循環(huán)一次加/減1?!?〕條件控制——循環(huán)次數未知,須根據條件控制循環(huán)。〔3〕狀態(tài)控制——根據事先設置或實時檢測的狀態(tài)來控制循環(huán)。*【例】統(tǒng)計字符串STRING中空格的個數。數據定義為:DSEGSEGMENTSTRINGDB‘Wherethereisawill,’

DB‘thereisaway.$’

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

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

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

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

LOOP1:MOVAL,[SI]CMPAL,‘%’JZDONEINCBYTEPTRMEMINCSILOOPLOOP1DONE:MOVAX,4C00HINT21HCODEENDSENDSTART*邏輯尺【例4.10】設在數據組X和Y中各存在有10個數據元素。試編寫程序計算: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并把結果存入數組Z中。

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

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

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

…RET

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

MAINPROCFAR

……

CALLSUB1

……

RET

SUB1PROCNEAR

……

CALLSUB2

……

RET

SUB2PROCNEAR

……

RET

SUB2ENDP

SUB1ENDP

MAINENDPCODEENDS

FAR子程序書寫形式CODE1SEGMENTASSUME……

MAINPROCFAR

……

CALLSUB

……

RET

MAINENDPCODE1ENDSCODE2

SEGMENTASSUME……

SUBPROCFAR

……

RET

SUBENDPCODE2ENDSCALL指令段內調用直接尋址間接尋址CALLproc-nameCALLdisp16①IP←IP+偏移量

②IP入棧;例:CALLSUB1尋址方式格式操作注:段內調用,CS不變

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

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

例:CALLfar[BX]遠過程名RET指令段內:RETRETexpIP出棧①IP出棧②SP←SP+exp

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

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

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

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

溫馨提示

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

評論

0/150

提交評論