微機原理PPT第五章 匯編語言程序設計_第1頁
微機原理PPT第五章 匯編語言程序設計_第2頁
微機原理PPT第五章 匯編語言程序設計_第3頁
微機原理PPT第五章 匯編語言程序設計_第4頁
微機原理PPT第五章 匯編語言程序設計_第5頁
已閱讀5頁,還剩77頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第5章匯編語言程序設計一、程序設計基本步驟分析問題,明確要求。建立數學模型。確定算法。畫程序流程圖。編寫程序。上機調試。1、算法(Algorithm)算法是對特定問題求解步驟的一種描述,是指令的有限序列。每一條指令表示一個或多個操作。(1)有窮性。一個算法必須在有窮步之后結束,即必須在有限時間內完成。(2)確定性。算法的每一步必須有確切的定義。算法的執行對應著的相同的輸人僅有惟一的一條路徑。(3)可行性。算法中的每一步都可以通過已經實現的基本運算的有限次執行得以實現。(4)輸入。一個算法具有零個或多個輸人,這些輸人取自特定的數據對象集合。(5)輸出。一個算法具有一個或多個輸出,這些輸出同輸人之間存在某種特定的關系。一個好的算法通常要考慮以下的要求:(1)正確。算法的執行結果應當滿足預先規定的功能和性能要求。(2)可讀。一個算法應當思路清晰、層次分明、簡單明了、易讀易懂。(3)健壯。當輸入不合法數據時,能作正當處理,不至引起嚴重后果。(4)高效。有效使用存儲空間和有較高的時間效率。2、程序流程圖程序流程圖是通過使用各種形狀的框,用來表示各種不同的操作,框內文字由人們根據操作的需要指定,應當是明確而無“歧義性”的。帶箭頭的流程線,用來表示操作的順序,即指向下一步的操作,用流程圖表示算法形象直觀、流向清楚。程序流程圖潛在的缺點:允許流程線向任意方向轉移,這可能出現“亂麻式”流程,有時使人難以看懂其來龍去脈(可用N-S結構化流程圖)。3、基本程序結構順序結構也就是順序執行結構,它是最基本、最常用的結構。所謂順序執行,就是按照程序語句行的自然順序,一條語句按一條語句地執行程序。選擇結構包括簡單選擇和多分支選擇結構,這種結構可以根據設定的條件,控制語句流程,有選擇地執行不同的語句序列。重復結構是用于在某些程序中,常常需要重復使用某一段相同的或類似的程序段,利用重復結構可簡化大量的程序行。二、順序結構程序設計及實例沒有分支、循環等轉移指令的程序,會按指令書寫的前后順利依次執行,這就是順序程序順序結構是最基本的程序結構完全采用順序結構編寫的程序并不多見例1、將內存單元DAT1中的組合BCD碼變換成兩個非組合BCD碼,存于其后面的兩個單元。

DATASEGMENTDAT1DB76H,2DUP(?)

DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETDAT1DAT1DAT1+1DAT1+2760607

MOVAL,[SI]ANDAL,0FHMOV[SI+1],ALMOVAL,[SI]ANDAL,0F0HMOVCL,4RORAL,CLMOV[SI+2],ALHLTCODEENDSENDSTART問題一:如要將2個非組合BCD碼變為組合BCD碼怎么辦?問題二:如要將1個組合BCD碼變為2個ASCⅡ碼怎么辦?問題三:如要將2個ASCⅡ碼變為組合BCD碼怎么辦?DAT1DAT1+1DAT1+2060886DAT1DAT1+1DAT1+2543435二一DAT1DAT1+1DAT1+2323552三例2、從鍵盤中鍵入0~9中的任意自然數X,求其立方值。利用查表法,構建0~9的立方表,字節變量X存放鍵入的自然數,其立方值存于下面的單元。

DATASEGMENTTABDW0H,1H,8H,27H,64H,125H,

DW216H,

343H,512H,729HXDB?

XXXDW?

DATAENDS

CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABMOVSI,OFFSETXMOVAH,1INT21HANDAL,0FHMOV[SI],AL

ADDAL,ALMOVAH,0ADDBX,AXMOVAX,[BX]MOV[SI+1],AXMOVAH,4CHINT21HCODEENDSENDSTART問題:可否直接查表指令?為什么?

三、分支程序設計及實例分支程序根據條件是真或假決定執行與否判斷的條件是各種指令,如CMP、TEST等執行后形成的狀態標志轉移指令Jcc和JMP可以實現分支控制分支結構有單分支結構雙分支結構多分支結構1、單分支結構條件成立跳轉,否則順序執行分支語句體注意選擇正確的條件轉移指令和轉移目標地址例1、從端口地址為PORT1的輸入端口輸入數值,與預定值相比,將差額的絕對值反饋給控制端口PORT2DATASEGMENTADB50H;設預定值

DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAGO:MOVAX,DATAMOVDS,AX

MOVBL,AINAL,PORT1CMPAL,BLJGLB1XCHGAL,BLLB1:SUBAL,BLOUTPORT2,ALCODEENDSENDGO問題一:求差的絕對值還有其他方法嗎?解答:一、先減,為正即為絕對值,為負,需求補。2、雙分支結構條件成立跳轉執行第2個分支語句體,否則順序執行第1個分支語句體注意:第1個分支體后一定要有一個JMP指令跳到第2個分支體后問題:分支程序中最需要注意的指令是哪一條?JMP指令例、內存單元中有一數X(8位無符號),按下式計算Y值,并將Y值存于X后面的單元

DATASEGMENTXDB42HYDW?DATAENDSY=3X+100X≧50X2-5X+20X<50CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XMOVAH,0CMPAX,50JNBLOP1MOVBX,AXMULBX

MOVDX,BXMOVCL,2SHLBX,CLADDBX,DXSUBAX,BXADDAX,20

JMPLOP2LOP1:MOVBX,AXSHLAX,1ADDAX,BXADDAX,100

LOP2:MOVY,AXHLTCODEENDSENDSTART問題一:如X是有符號數怎么辦?問題二:如X是16位數怎么辦?問題三:如X是BCD碼怎么辦?3、多分支結構多分支結構是多個條件對應各自的分支語句體,哪個條件成立就轉入相應分支體執行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YN例、將某班同學的成績按優、良、中、及格、不及格分類統計人數。設A:優(5)B:良(4)C:中(3)

D:及格(2)E:不及格(1)

DATASEGMENTADB0BDB0CDB0DDB0EDB0

DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATAMOVDS,AXMOVAH,1INT21HA1:CMPAL,‘5’JNEB1INCAJMPNEXTB1:CMPAL,‘4’JNEC1INCBJMPNEXTC1:CMPAL,‘3’JNED1INCCJMPNEXTD1:CMPAL,‘2’JNEE1INCDJMPNEXTE1:CMPAL,‘1’JNENEXTINCENEXT:MOVAH,4CHINT21HCODEENDSENDBEGIN編寫分支程序要注意的問題1、條件轉移語句的轉移范圍在-128~+127字節之間,若超出此范圍要和無條件轉移語句聯合使用例JALOP1…LOP1:JMPLOP2…LOP2:…2、分支程序編寫時要注意每個分支的出口位置,如果程序復雜,要畫流程圖或N-S結構化流程圖3、利用間接轉移的方式,可以實現動態轉移如:SWDWLM0,LM1,LM2,…….,LMn

在:CODE中可使用以下語句

MOVSI,N;N為n的2倍

JMP[SW+SI]

三、循環程序設計循環程序結構是滿足一定條件的情況下,重復執行某段程序循環結構的程序通常有3個部分:循環初始部分——為開始循環準備必要的條件,如循環次數、循環體需要的數值等循環體部分——指重復執行的程序部分,其中包括對循環條件等的修改程序段循環控制部分——判斷循環條件是否成立,決定是否繼續循環關鍵是什么?循環控制循環結構程序的設計關鍵是循環控制部分循環控制可以在進入循環之前進行,也可以在循環體后進行,于是形成兩種結構:“先判斷、后循環”結構“先循環、后判斷”結構循環結束的控制可以用循環次數,還可以用特定條件等,于是又有:計數控制循環條件控制循環先循環后判斷的循環結構

結束

初始化

循環的初始狀態

循環體

循環的工作部分及修改部分

計數控制循環條件控制循環修改部分控制條件YN1、計數控制循環計數控制循環利用循環次數作為控制條件易于采用循環指令LOOP和JCXZ實現初始化:將循環次數或最大循環次數置入CX循環體循環控制:用LOOP指令對CX減1、并判斷是否為0例1、數據塊是帶符號的8位二進制數,要求把其中的正負數分開,分別存在其后的存儲區中。

DATASEGMENTDA1DB25H,BDH,7FH,94H,65H,…,A5HDA2DB20DUP(?);正數

DA3DB20DUP(?);負數

DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXLEASI,DA1LEADI,DA2LEABX,DA3MOVCX,20GO1:LODSBTESTAL,80HJNZNEG1STOSBJMPNEXTNEG1:XCHGBX,DISTOSBXCHGBX,DINEXT:LOOPGO1

HLTCODEENDSENDSTART問題:還需要要統計正、負數的個數該如何處理?例2:內存中連續存放10個8位無符號數,計算其平均值,并將其存入其后的一個單元。DATASEGMENTDA1DB35H,7BH,64H,89H,…,A2H

10個數DA2DB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATAMOVDS,AXLEABX,DA1;LEADI,DA2;MOVCX,10;XORAX,AX;LP1:ADDAL,[BX];JNCM1;INCAH;M1:INCBX;LOOPLP1;MOVBL,10;DIVBL;MOV[DI],ALCODEENDSENDBEGIN問題一:注意高8位的處理?問題二:如是BCD碼如何處理?

個數等于10

xorax,axmov

cl,4lp1:addal,[bx]shrax,cl

daa

mov[di],al

adcah,0incbxlooplp1

個數大于10

,求累加和

xorax,axlp1:addal,[bx]

daa

xchg

al,ah

adcal,0

daa

xchg

al,ahincbxlooplp12.條件控制循環條件控制循環需要利用特定條件判斷循環是否結束條件控制循環用條件轉移指令判斷循環條件轉移指令可以指定目的標號來改變程序的運行順序,如果目的標號指向一個重復執行的語句體的開始或結束,便構成了循環控制結構顯示以0結尾的字符串 ;數據段string db'Letushaveatry!',0

;代碼段

mov

bx,offsetstringagain:

mov

dl,[bx]

cmpdl,0

jzdone

;為0結束

movah,2 ;不為0,顯示

int21h incbx

;指向下一個字符

jmpagaindone: ……條件控制循環先判斷后循環記錄某個字存儲單元數據中1的個數

;數據段number dw1110111111100100B

;代碼段

mov

bx,number

xordl,dl ;循環初值:DL←0again: testbx,0ffffh ;也可以用cmpbx,0

jzdone

;全部是0就可以退出循環,減少循環次數

shlbx,1 ;用指令shrbx,1也可以

adcdl,0

;利用ADC指令加CF的特點進行計數

jmpagain條件控制循環先判斷后循環3、多重循環(循環嵌套)

循環之中還有循環,可以多次嵌套,典型例子雙重循環。例:將一組數據按一定的順序(大小)排列。基本方法:1、兩兩相比(沉底法)大循環用交換標志控制,有交換繼續,否則停止。小循環利用循環次數控制,循環次數依次遞減。

2、依次相比法(冒泡法)大、小循環用都利用循環次數控制,大循環n-1次,小循環從n-1開始,并依次遞減

例、將一組16位有符號數按從大到小的順序排列DATASEGMENTARRAYDW1234H,5376H,796AH,...,0AB10HCOUNTEQULENGTHARRAYDATAENDSSTACKSEGMENTSTAPNDW100dup(?)TOPEQULENGTHSTAPNSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVBL,0FFH;

A1:CMPBL,0FFHJNEA4;XORBL,BLMOVCX,COUNT-1;XORSI,SI;A2:MOVAX,[SI+ARRAY];CMPAX,[SI+ARRAY+2];JGEA3XCHG[SI+ARRAY+2],AX;MOV[SI+ARRAY],AXMOVBL,0FFH;A3:INCSI;INCSI;LOOPA2;JMPA1;A4:HLTCODEENDSENDSTART循環程序應用舉例例1:將存儲器AL中的二進制數變為十進制后,取轉變后的百位數放在寄存器DL中

KIOKDB100LEABX,KIOK;MOVAL,0F3H;CVDEC:MOVDL,30H;CVDEC1:SUBAL,[BX]JBCVDEC2;INCDL;JMPCVDEC1;例2:兩個非組合BCD碼相乘,數的ASCII碼形式存于內存(低位在上)

如:94573X6DATASEGMENTADB‘3’,‘7’,‘5’,‘4’,‘9’BDB‘6’CDBLENGTH(A)+1DUP(?)DATAENDS

CODESEGUMEASSUMECS:CODE,DS:DATAGO:MOVAX,DATAMOVDS,AXMOVES,AXCLDMOVSI,OFFSETAMOVDI,OFFSETCMOVCX,LENGTHAMOVBL,BYTEPTR[B];ANDBL,0FH;MOVBYTEPTR[DI],0CYCLE:LODSB;ANDAL,0FHMULBL;AAMADDAL,[DI];AAA;STOSB;MOV[DI],AH;LOOPCYCLEHLTCODEENDSENDGO四、子程序設計把功能相對獨立的程序段單獨編寫和調試,作為一個相對獨立的模塊供主程序使用,就形成子程序子程序可以實現源程序的模塊化,可簡化源程序結構,可以提高編程效率主程序(調用程序)需要利用CALL指令調用子程序(被調用程序)子程序需要利用RET指令返回主程序過程定義和子程序編寫匯編語言中,子程序要用一對過程偽指令PROC和ENDP聲明,格式如下:

過程名

PROC[NEAR|FAR] …… ;過程體

過程名

ENDP可選的參數指定過程的調用屬性。沒有指定過程屬性,則采用默認屬性NEAR屬性(段內近調用)的過程只能被相同代碼段的其他程序調用FAR屬性(段間遠調用)的過程可以被相同或不同代碼段的程序調用子程序編寫注意事項⑴子程序要有一定的通用性,準確、精確,可以被反復調用。⑵子程序最后利用RET指令返回主程序,主程序執行CALL指令調用子程序。⑶子程序中對堆棧的壓入和彈出操作要成對使用,保持堆棧的平衡。⑷子程序開始應該保護使用到的寄存器,子程序返回前應進行恢復。⑸子程序應必須寫明入口、出口條件,以方便調用。例1:將5位十進制數(<65535)轉換為二進制數方法:(abcde)=ax104+bx103+cx102+dx10+e=(((((ax10)+b)x10+c)x10)+d)x10+e)在運算過程中不調整,結果即為二進制數

入口條件:5位的十進制數以ASCII碼的形式存于內存,SI為高位首地址,CX為n-1

出口條件:結果存于AX中ZH1PROCZH1:PUSHBXPUSHDXMOVBX,000AHMOVAH,0;MOVAL,BYTEPTR[SI];ANDAL,0FH;AA1:MULBX;ADDAL,BYTEPTR[SI+1];SUBAL,30H;INCSI;LOOPAA1;POPDX;POPBX;RETZH1ENDP主程序(子程序的調用):DATASEGMENTBUFFDB‘3’,‘6’,‘4’,‘1’,‘5’SUMDW2DUP(?)COUNTEQULENGTHBUFFDATAENDSSTACKSEGMENTSTAPWDW100DUP(?)TOPEQULENGTHSTAPNSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVSI,OFFSETBUFFMOVDI,OFFSETSUMMOVCX,COUNT-1CALLZH1MOV[DI],AXHLTCODEENDSENDSTART例2、將二進制轉換為十進制,除10取余法(亦可用乘法)入口條件:要轉換的數在DX中出口條件:結果存于SI指明的內存中(ASCII碼的形式)XXXXHXXXH0AH0AH00AH余D0....余D1余DnZH2PROCZH2:PUSHAXPUSHCXPUSHDXA1:MOVAX,DXMOVDX,0MOVCX,000ADIVCXXCHGAX,DXADDAL,30HMOVBYTEPTR[SI],ALINCSICMPDX,0JNZA1B1:CMPSI,BUF2JZDONEINCSIMOVAL,30HMOVBYTEPRE[SI],ALJMPB1DONE:POPDXPOPCXPOPAXRETZH2ENDP參數傳遞主程序與子程序間一個主要問題是參數傳遞入口參數(輸入參數):主程序調用子程序時,提供給子程序的參數出口參數(輸出參數):子程序執行結束返回給主程序的參數參數的具體內容傳數值:傳送數據本身傳地址:傳送數據的主存地址常用的參數傳遞方法寄存器共享變量堆棧

用寄存器傳遞參數最簡單和常用的參數傳遞方法是通過寄存器,只要把參數存于約定的寄存器中就可以了由于通用寄存器個數有限,這種方法對少量數據可以直接傳遞數值,而對大量數據只能傳遞地址采用寄存器傳遞參數,注意帶有出口參數的寄存器不能保護和恢復,帶有入口參數的寄存器可以保護、也可以不保護,但最好能夠保持一致用共享變量傳遞參數子程序和主程序使用同一個變量名存取數據就是利用共享變量(全局變量)進行參數傳遞如果變量定義和使用不在同一個源程序中,需要聲明如果主程序還要利用原來的變量值,則需要保護和恢復利用共享變量傳遞參數,子程序的通用性較差,但特別適合在多個程序段間、尤其在不同的程序模塊間傳遞數據用堆棧傳遞參數參數傳遞還可以通過堆棧這個臨時存儲區。主程序將入口參數壓入堆棧,子程序從堆棧中取出參數;子程序將出口參數壓入堆棧,主程序彈出堆棧取得它們采用堆棧傳遞參數是程式化的,它是編譯程序處理參數傳遞、以及匯編語言與高級語言混合編程時的常規方法使用堆棧傳遞參數,其子程序返回時要使用指令

RETn第四章習題1、下面程序段的功能是將內存單元DAT1起始的20個8位二進制數,按正、負分別存放,正數存于BUF1開始的單元,負數存于BUF2開始的單元,仔細閱讀程序,改正其中的錯誤。

CLDSTOSWMOVSI,DAT1JMPGONDMOVDI,BUF1MIUS:XCHGBX,SIMOVBX,BUF2STOSBLOP1:LODSBXCHGBX,DIMOVCX,20GOND:LOOPLOP1TESTAL,80HLTJZMIUS

2、下面程序段的功能是將SI=2000H為起始的6個單元的組合BCD碼累加,其結果仍在SI為指針的內存中,仔細閱讀程序,改正其中的錯誤。

MOVSI,2000HMOVSI,ALMOVCX,6INCSIXORAL,ALLOOPLOP1LOP1:ADDAL,[SI]MOV[SI],AHAAAHLTADDAH,03、下面程序段的功能是將SI=1000H為起始的2個單元的ASCⅡ碼(個位數

溫馨提示

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

評論

0/150

提交評論