微機(jī)原理的課件第6章 微型計(jì)算機(jī)的程序設(shè)計(jì)_第1頁(yè)
微機(jī)原理的課件第6章 微型計(jì)算機(jī)的程序設(shè)計(jì)_第2頁(yè)
微機(jī)原理的課件第6章 微型計(jì)算機(jī)的程序設(shè)計(jì)_第3頁(yè)
微機(jī)原理的課件第6章 微型計(jì)算機(jī)的程序設(shè)計(jì)_第4頁(yè)
微機(jī)原理的課件第6章 微型計(jì)算機(jī)的程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩2頁(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)介

1、第6章 微型計(jì)算機(jī)的程序設(shè)計(jì)主要內(nèi)容程序設(shè)計(jì)步驟簡(jiǎn)單程序(順序結(jié)構(gòu))分支程序(分支結(jié)構(gòu))循環(huán)程序(循環(huán)結(jié)構(gòu))子程序6.1 程序設(shè)計(jì)步驟匯編語(yǔ)言程序設(shè)計(jì)步驟: (1)分析問(wèn)題:已知條件、要解決的問(wèn)題、功能/性能要求等。 (2)建立數(shù)學(xué)模型:把問(wèn)題數(shù)學(xué)化、公式化,便于計(jì)算機(jī)處理。 (3)確定算法:簡(jiǎn)單、速度快、精度高、代碼量小、編程容易。 (4)繪制程序流程圖:用箭頭、框圖、菱形圖等表示程序結(jié)構(gòu)。 (5)內(nèi)存空間分配:為程序或數(shù)據(jù)分配內(nèi)存空間。 (6)編制程序與靜態(tài)檢查:程序結(jié)構(gòu)層次簡(jiǎn)單、清楚、易懂。 (7)程序調(diào)試:利用調(diào)試軟件DEBUG進(jìn)行調(diào)試。匯編語(yǔ)言程序設(shè)計(jì)的特點(diǎn): (1)算法要分解至指令

2、級(jí);高級(jí)語(yǔ)言為語(yǔ)句級(jí)。 (2)要詳細(xì)考慮內(nèi)存空間分配問(wèn)題:任何一個(gè)變量、一條指令都要明確其存儲(chǔ)位置。6.2 簡(jiǎn)單程序(順序結(jié)構(gòu))特點(diǎn):順序執(zhí)行每條指令,執(zhí)行過(guò)程中不發(fā)生跳轉(zhuǎn)?!纠?.1】用數(shù)據(jù)運(yùn)算指令,對(duì)兩個(gè)16位數(shù)做加法運(yùn)算。這兩個(gè)數(shù)從地址10050H開(kāi)始連續(xù)存放,低位在小地址一端,結(jié)果放在這兩個(gè)數(shù)之后。內(nèi)存地址內(nèi)容10050H被加數(shù)低8位10051H被加數(shù)高8位10052H加數(shù)低8位10053H加數(shù)高8位10054H和數(shù)低8位10055H和數(shù)高8位例6.1的程序:MOVAX,1000HMOVDS,AX ; DS1000HMOVSI,50H ; 被加數(shù)指針SI50HMOVDI,52H ; 加

3、數(shù)指針DI52HMOVBX,54H ; 和的指針BX54HCLC ; 清CFXORAX,AX ; 清AXMOVAX,SI ; 取一個(gè)字到AXADCAX,DI ; AXAX+DI+CFMOVBX,AX ; 存一個(gè)字到BXHLT ; 暫停問(wèn)題:該程序能否簡(jiǎn)化?如何簡(jiǎn)化?簡(jiǎn)化的程序:MOVAX,1000HMOVDS,AX ; DS1000HMOVAX,50H ; 取被加數(shù)到AXADDAX,52H ; AX被加數(shù)+加數(shù)MOV54H,AX ; 存和數(shù)到54HHLT ; 暫停例題6.2:P139自學(xué)6.3 分支程序分支程序是利用條件轉(zhuǎn)移指令實(shí)現(xiàn)程序執(zhí)行次序改變的一種程序結(jié)構(gòu)形式,即當(dāng)程序執(zhí)行到某一指令后,

4、根據(jù)某個(gè)條件是否滿足,分別執(zhí)行不同的指令序列。一般來(lái)說(shuō),分支程序經(jīng)常是先用比較指令或數(shù)據(jù)操作及位檢測(cè)指令等來(lái)改變標(biāo)志寄存器各個(gè)標(biāo)志位。然后用條件轉(zhuǎn)移指令進(jìn)行分支。分支程序執(zhí)行完后可以立即結(jié)束,也可以轉(zhuǎn)到公共點(diǎn)結(jié)束,如下圖所示。分支程序可以再分支。程序框圖:在繪制程序流程圖時(shí),需用菱形判斷框,表示判定條件。在繪制好流程圖編寫(xiě)助記符程序時(shí),建議先按上下流程線寫(xiě),寫(xiě)完上下流程線上的各框環(huán)節(jié)后,再寫(xiě)分支部分里的框框。分支程序結(jié)構(gòu)流程圖(注意:判斷出口處應(yīng)注明Y/N) 【例6.3】求AX累加器和BX寄存器中兩個(gè)無(wú)符號(hào)數(shù)之差的絕對(duì)值,結(jié)果放在內(nèi)存(2800H)單元中。 問(wèn)題:右邊程序流程圖是否有錯(cuò)誤?如何

5、改正?例6.3的程序: MOV CX,AX ; CXAX SUBAX,BX ;AXAX-BX JC AA ;CF轉(zhuǎn)AA去執(zhí)行(即AXBX時(shí)轉(zhuǎn)移) MOV2800H,AX ;結(jié)果送到2800H和2801H單元 HLT ;暫停AA: SUB BX,CX ;BXBX-CX MOV2800H,BX ;結(jié)果送到2800H和2801H單元 HLT ;暫停問(wèn)題:是否還有其它方法實(shí)現(xiàn)上述功能?6.4 循環(huán)程序循環(huán)程序是強(qiáng)制CPU重復(fù)執(zhí)行某一指令序列(程序段)的一種程序結(jié)構(gòu)形式。循環(huán)結(jié)構(gòu)程序縮短了程序的長(zhǎng)度、減少了占用的內(nèi)存空間。循環(huán)程序并不簡(jiǎn)化程序執(zhí)行過(guò)程,相反,由于增加了一些循環(huán)控制等環(huán)節(jié),總的程序執(zhí)行語(yǔ)句

6、和時(shí)間會(huì)有所增加。循環(huán)程序一般由4部分組成:初始化、循環(huán)體、循環(huán)控制和循環(huán)結(jié)束處理。循環(huán)程序分為單循環(huán)和多重循環(huán),兩重以上循環(huán)稱為多重循環(huán)。內(nèi)外循環(huán)不能交叉。循環(huán)程序各部分的內(nèi)容:(1)初始化建立循環(huán)次數(shù)計(jì)數(shù)器,設(shè)定變量和存放數(shù)據(jù)的內(nèi)存地址指針(常用間址方式)的初值等。(2)循環(huán)體實(shí)現(xiàn)程序的功能、被重復(fù)執(zhí)行的指令序列。(3)循環(huán)控制修改變量和地址指針,為下一次循環(huán)做準(zhǔn)備;修改循環(huán)計(jì)數(shù)器或者判斷循環(huán)條件是否滿足,滿足則繼續(xù)循環(huán),否則結(jié)束循環(huán)。(4)結(jié)束處理它主要用來(lái)分析和存放程序的結(jié)果。循環(huán)控制方式有多種,如計(jì)數(shù)控制、條件控制等。計(jì)數(shù)控制事先已知循環(huán)次數(shù),每次循環(huán)加或減計(jì)數(shù),通過(guò)對(duì)循環(huán)次數(shù)的判定

7、來(lái)達(dá)到控制循環(huán)的目的;條件控制事先不知循環(huán)次數(shù),通過(guò)判定某種條件的真假來(lái)達(dá)到控制循環(huán)的目的。不管哪一種控制循環(huán)方式,最終都是要達(dá)到控制循環(huán)的目的。若考慮不周,會(huì)造成死循環(huán),對(duì)這一點(diǎn)要注意。循環(huán)可以用跳轉(zhuǎn)語(yǔ)句實(shí)現(xiàn),如JMP,JZ等;也可以用專用循環(huán)控制語(yǔ)句實(shí)現(xiàn),如LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ【例6.5】求兩個(gè)多字節(jié)數(shù)之和。這兩個(gè)數(shù)在10050H地址開(kāi)始的內(nèi)存單元中,連續(xù)存放,低位在小地址一端,結(jié)果放在這兩個(gè)數(shù)之后。設(shè)這兩個(gè)多字節(jié)數(shù)均為8個(gè)字節(jié)長(zhǎng)。S=A+BBAa0a1a2a3a4a5a6a7b0b1b2b3b4b5b6b7s0s1s2s3s4s5s6s7cf1cf

8、2cf3+編制的程序START:MOVAX,1000H MOVDS,AX ; DS1000H MOVSI,50H ; 第一個(gè)數(shù)指針SI50H MOVDI,58H ; 第二個(gè)數(shù)指針DI58H MOVBX,60H ; 結(jié)果指針BX60H MOVCX,4 ; 循環(huán)次數(shù)CX4 CLC ; 清進(jìn)位CF0AA: MOVAX,SI ; 取一個(gè)字到AX ADCAX,DI ; AXAX+DI+CF MOVBX,AX ; 存一個(gè)字到BXPUSHF ; 保護(hù)進(jìn)位CFADDSI,2 ; 修改第一個(gè)數(shù)的地址指針SISI+2ADDDI,2 ; 修改第二個(gè)數(shù)的地址指針DIDI+2ADDBX,2 ; 修改結(jié)果指針BXBX+2

9、POPF ; 恢復(fù)標(biāo)志寄存器LOOPAA ; CXCX-1,若CX0轉(zhuǎn)AAHLT ; CX0,暫停6.5 子程序從功能上來(lái)講,子程序是主程序的一個(gè)組成部分。為了實(shí)現(xiàn)程序的結(jié)構(gòu)化、模塊化,提高程序的可重用性,通常將主程序中具有公用性、重復(fù)性、功能相對(duì)獨(dú)立和完整的一個(gè)程序段,單獨(dú)設(shè)計(jì)成一個(gè)程序模塊,供主程序調(diào)用,該程序模塊就稱為子程序。子程序可以嵌套。子程序調(diào)用與返回子程序調(diào)用與返回由CALL和RET指令實(shí)現(xiàn)。子程序調(diào)用方式有近程(段內(nèi))調(diào)用、遠(yuǎn)程(段間)調(diào)用、直接調(diào)用(指令中直接給出調(diào)用地址)和間接調(diào)用(用寄存器或內(nèi)存單元給出調(diào)用地址)。子程序調(diào)用實(shí)際是程序的轉(zhuǎn)移,但與轉(zhuǎn)移指令有所不同:子程序調(diào)

10、用指令CALL執(zhí)行時(shí)要保存返回地址、將其壓入堆棧,每個(gè)子程序都有RET指令負(fù)責(zé)把壓入棧區(qū)的返回地址彈出送IP或CSIP(段間返回),實(shí)現(xiàn)子程序返回。轉(zhuǎn)移指令不考慮返回問(wèn)題。CALL F1;將下條指令的地址壓入堆棧 RET;將堆棧中的地址彈出到CS:IP中子程序設(shè)計(jì)與應(yīng)用應(yīng)注意的問(wèn)題(1) 現(xiàn)場(chǎng)保護(hù)與恢復(fù): 轉(zhuǎn)子程序前,CPU有關(guān)寄存器和內(nèi)存有關(guān)單元是父程序的工作現(xiàn)場(chǎng),在調(diào)用子程序前要設(shè)法保護(hù)這個(gè)現(xiàn)場(chǎng)。保護(hù)現(xiàn)場(chǎng)的方式很多,多數(shù)情況是在調(diào)用子程序后由子程序前部操作完成現(xiàn)場(chǎng)保護(hù),再由子程序后部操作完成現(xiàn)場(chǎng)恢復(fù)?,F(xiàn)場(chǎng)信息可以壓入棧區(qū)或傳送到不被占用的存儲(chǔ)單元,也可以避開(kāi)這些有用的寄存器或存儲(chǔ)單元,達(dá)到

11、保護(hù)現(xiàn)場(chǎng)的目的。恢復(fù)現(xiàn)場(chǎng)是保護(hù)現(xiàn)場(chǎng)的逆操作。當(dāng)用棧區(qū)保護(hù)現(xiàn)場(chǎng)時(shí),還應(yīng)注意恢復(fù)現(xiàn)場(chǎng)的順序不能搞錯(cuò),否則不能正確地恢復(fù)父程序的現(xiàn)場(chǎng)。(2) 參數(shù)傳遞: 指主程序與子程序之間相關(guān)信息或數(shù)據(jù)的傳遞。參數(shù)傳遞方式有寄存器傳遞、用內(nèi)存單元傳遞或用棧區(qū)傳遞。傳遞參數(shù)需要父程序與子程序默契配合,否則會(huì)產(chǎn)生錯(cuò)誤結(jié)果。(3) 子程序說(shuō)明: 由于子程序有共享性,可被其它程序調(diào)用,因此,每個(gè)子程序應(yīng)有必要的使用注釋,它包括: 子程序名; 功能、技術(shù)指標(biāo)(如執(zhí)行時(shí)間等); 占用寄存器和存儲(chǔ)單元; 入口、出口參數(shù); 嵌套哪些子程序【例6.8】找出一個(gè)數(shù)據(jù)塊中的最大數(shù)。其中,數(shù)據(jù)塊的長(zhǎng)度1,并且放在內(nèi)存(2001H)單元中

12、,而數(shù)據(jù)塊本身是從(2002H)單元開(kāi)始存放的,最后,把找出的最大值放到(2000H)單元中。假設(shè)這個(gè)數(shù)據(jù)塊中的數(shù)都是無(wú)符號(hào)的8位數(shù)。(1) 分析題目:已知數(shù)據(jù)塊及其長(zhǎng)度的存儲(chǔ)地址、結(jié)果的存放地址、數(shù)據(jù)的類型,求數(shù)據(jù)塊中的最大數(shù)。(2) 確定算法:采用循環(huán)比較法。首先,我們用00值放在AL累加器中作為最大值;然后,用數(shù)據(jù)塊的第1個(gè)數(shù)和AL中的數(shù)做比較,如果比00大,則用這個(gè)數(shù)取代00,放入AL中;接著取出第2個(gè)數(shù)與AL中的數(shù)做比較,如果比它大,取而代之,否則不取代,如此往復(fù),直至最后一個(gè)數(shù)。這樣,最后AL累加器中必定存放著最大的數(shù)。這就是尋找最大值的方法,而數(shù)據(jù)塊的總長(zhǎng)度(數(shù)的個(gè)數(shù))就是循環(huán)次

13、數(shù)。(3) 繪制程序流程圖:(4) 編制的程序如下(未作為子程序時(shí)):MOVSI,2001H ; 指針指向放數(shù)據(jù)塊長(zhǎng)度的單元MOVCL,SI ; 取出來(lái)作為循環(huán)次數(shù)INCSI ; 指針指向第一個(gè)數(shù)MOVAL,00 ; 設(shè)置最大值00MOVCH,00 ; 初始化,為什么?LP:CLC ; 清除進(jìn)位位,有必要嗎?CMPAL,SI ; 取出數(shù)與最大值比較JCBB ; AL中數(shù)小,轉(zhuǎn)到取代處JMPAA ; AL中數(shù)大,跳過(guò)去BB:MOVAL,SI ; 把大數(shù)放到AL中保存AA:INCSI ; 指針下移LOOPLP ; 次數(shù)減1,判循環(huán)結(jié)束否 MOV2000H,AL; 把最大值放到指定單元保存 HLT(

14、5) 把這段程序改為子程序形式,程序清單如下:MAX PROC PUSHFPUSHAXPUSHCXPUSHSI上面程序段POPSIPOPCXPOPAXPOPFRET MAX ENDP在編寫(xiě)實(shí)際子程序時(shí)要注意下列問(wèn)題:(1)入口信息。例如在例6.8中,要比較的一系列數(shù),必須先存放在以2002H開(kāi)始的內(nèi)存單元中,而數(shù)據(jù)的個(gè)數(shù)要放在2001H單元中。(2)出口信息。例如在例6.8中,尋得的最大值放在2000H單元中。(3)現(xiàn)場(chǎng)的保護(hù)和恢復(fù)。先仔細(xì)觀察子程序中到底用了哪些寄存器,然后在子程序的開(kāi)始處保護(hù)這些寄存器,在子程序結(jié)束以前恢復(fù)這些寄存器。(4)子程序的最后一條指令一定是RET指令。課后思考題1、在2000H單元處有連續(xù)兩個(gè)字節(jié),將(2000H)的高4位與(2001H)的低4位組成一個(gè)字節(jié)放在(2002H),將(2000H)的低4位與(2001H)的高

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論