第4章匯編程序設(shè)計(jì)2_第1頁
第4章匯編程序設(shè)計(jì)2_第2頁
第4章匯編程序設(shè)計(jì)2_第3頁
第4章匯編程序設(shè)計(jì)2_第4頁
第4章匯編程序設(shè)計(jì)2_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)4.4 匯編語言程序設(shè)計(jì)方法 匯編語言程序的常用結(jié)構(gòu)與設(shè)計(jì)方法匯編語言程序的常用結(jié)構(gòu)與設(shè)計(jì)方法從組織結(jié)構(gòu)看: 一個(gè)匯編語言源程序可由多個(gè)“模塊模塊”組成, 每個(gè)模塊則由一個(gè)或多個(gè)“段段”構(gòu)成。u 模塊和段:模塊和段:一個(gè)匯編“模塊”可以包含一個(gè)或幾個(gè)長度小于64KB的“段”u 8086允許同時(shí)使用允許同時(shí)使用4個(gè)段:個(gè)段: 代碼段(CS)、堆棧段(SS)、數(shù)據(jù)段(DS)和附加數(shù)據(jù)段(ES) 對(duì)應(yīng)4個(gè)段寄存器(CS、DS、SS和和ES)u 使用匯編語言編程時(shí)需同時(shí)使用指令指令和偽指令偽指令匯編語言源程序有順序、分支、循環(huán)、子程序等基本結(jié)構(gòu)形式匯編語言源

2、程序有順序、分支、循環(huán)、子程序等基本結(jié)構(gòu)形式 第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)4.4.1 程序設(shè)計(jì)的基本過程程序設(shè)計(jì)的一般步驟程序設(shè)計(jì)的一般步驟:(1)分析問題并抽象出數(shù)學(xué)模型,確定最佳算法。(2)程序結(jié)構(gòu)框圖和流程圖。(3)合理分配內(nèi)存工作單元和寄存器,并了解I/O端口地址。(4)編程并調(diào)試。(5)整理文檔。評(píng)價(jià)程序質(zhì)量的標(biāo)準(zhǔn)評(píng)價(jià)程序質(zhì)量的標(biāo)準(zhǔn):(1)合理組織數(shù)據(jù),發(fā)揮MEM/Reg的作用。(2)程序邏輯結(jié)構(gòu)好,便于二次開發(fā)。 (3)可讀性強(qiáng)。 (4)高可靠性和可維護(hù)性。 (5)效率高(代碼少)。第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)u 匯編語言程序從編制到能夠運(yùn)行需要經(jīng)過

3、: 編輯、匯編、鏈接、調(diào)試編輯、匯編、鏈接、調(diào)試 等。第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)u 順序結(jié)構(gòu) 對(duì)應(yīng)簡單程序,順序執(zhí)行,無轉(zhuǎn)移、無循環(huán)。 指令指針指令指針I(yè)PIP值線性增加。值線性增加。u 分支結(jié)構(gòu) 依據(jù)不同條件分支(雙分支或多分支)到各程序段。 IP值受標(biāo)志位的影響而跳變。值受標(biāo)志位的影響而跳變。程序的基本結(jié)構(gòu)程序的基本結(jié)構(gòu)YN 南京航空航天大學(xué) 電子信息工程學(xué)院第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)u 循環(huán)結(jié)構(gòu) 實(shí)現(xiàn)那些需要重復(fù)做的工作。 IP值因計(jì)數(shù)器值因計(jì)數(shù)器CX中的值不為零而循環(huán)。中的值不為零而循環(huán)。當(dāng)型循環(huán)(當(dāng)條件成立進(jìn)入循環(huán))循環(huán)初始設(shè)置循環(huán)體循環(huán)條件判斷?

4、YNYN循環(huán)初始設(shè)置循環(huán)體循環(huán)條件判斷?直到型循環(huán)(直到條件成立退出循環(huán))第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)例:將某段中的字符串“Hello!”傳送到另一段中(內(nèi)存數(shù)據(jù)塊 的傳送)。開始建立傳送方向 DS: SI 源串首地址 ES: DI 目的串首地址CX 串長度串傳送返回DOS利用變量定義字符串和緩沖區(qū)利用變量定義字符串和緩沖區(qū)4.4.2 順序結(jié)構(gòu)程序設(shè)計(jì) 按事件發(fā)展的先后,選擇合適的指令有序地加以組合。按事件發(fā)展的先后,選擇合適的指令有序地加以組合。AA SEGMENT;數(shù)據(jù)段;數(shù)據(jù)段1XX DB Hello!;定義源串;定義源串AA ENDSBB SEGMENT;數(shù)據(jù)段;數(shù)據(jù)段

5、2YY DB 6 DUP(?) ; 定義目的緩沖區(qū)定義目的緩沖區(qū)BB ENDSCC SEGMENT;代碼段;代碼段 ASSUME CS:CC, DS:AA, ES:BB;指示指令中標(biāo)號(hào)、變量所在段;指示指令中標(biāo)號(hào)、變量所在段START: CLD;設(shè)置傳送方向;設(shè)置傳送方向(地址指針低到高地址指針低到高) MOV AX , AA;DS: SI 源串首地址源串首地址 MOV DS , AX LEA SI , XXMOV AX , SEG YY;ES:DI 目的首地址目的首地址 MOV ES , AX MOV DI , OFFSET YY MOV CX , 6 ;CX 串的長度串的長度 REP MO

6、VSB;串傳送;串傳送(P59) MOV AH , 4CH;調(diào)用調(diào)用4CH系統(tǒng)功能,返回系統(tǒng)功能,返回DOS INT 21H CC ENDS END START;指示程序結(jié)束和程序入口;指示程序結(jié)束和程序入口第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)4.4.3 分支結(jié)構(gòu)程序設(shè)計(jì)例:編程實(shí)現(xiàn)下列函數(shù)的功能,其中X、Y為無符號(hào)字節(jié)數(shù)。 用比較指令CMP、或數(shù)據(jù)操作ADD/SUB/TEST等 指令來改變FR標(biāo)志位OF/SF/ZF/PF/CF的值; 選用合適的條件轉(zhuǎn)移指令Jcc,測(cè)試標(biāo)志位的狀態(tài) 來實(shí)現(xiàn)分支轉(zhuǎn)移。設(shè)計(jì)分支程序的關(guān)鍵: 設(shè)定分支條件設(shè)定分支條件分支結(jié)構(gòu)的實(shí)現(xiàn)方法:YXYXYXZ101第

7、第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)流程圖AL XBL Y開開 始始AL = BL ?Z 0YZ 1Y AL BL ?NZ -1N結(jié)結(jié) 束束第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)程程 序序;- 數(shù)據(jù)段定義數(shù)據(jù)段定義 -DATSEGMENTXDB242YDB67ZDB?DATENDS ;- 代碼段定義代碼段定義 -CODSEGMENTASSUME DS: DAT, CS: COD MOVAX, DATMOVDS, AX; 初始化DS;-第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)MOVAL, XMOVBL, YCMPAL, BLJEC1 ; ALBL 則跳轉(zhuǎn)至C1,否則繼續(xù)執(zhí)行JAC

8、2 ; AL BL 則跳轉(zhuǎn)至C2,否則繼續(xù)執(zhí)行MOVAL, -1EXT: MOVZ, ALMOV AH,4CH; 返回DOS INT 21HC1:MOVAL, 0JMPEXTC2:MOVAL, 1JMPEXT;-CODENDSENDMAIN第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)4.4.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)程序是在滿足某些條件時(shí)對(duì)一段程序的重復(fù)執(zhí)行。循環(huán)程序是在滿足某些條件時(shí)對(duì)一段程序的重復(fù)執(zhí)行。 一般由4部分組成:(1)參數(shù)初始化 為循環(huán)做準(zhǔn)備,設(shè)置循環(huán)計(jì)數(shù)值,設(shè)置變量初值(2)循環(huán)體 核心部分,包括循環(huán)的全部執(zhí)行指令(3)參數(shù)修改 修改操作數(shù)地址,為下次循環(huán)做準(zhǔn)備(4)循環(huán)控制 修

9、改計(jì)數(shù)器值,判斷循環(huán)控制條件,決定是否跳出循環(huán)第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)先判斷后執(zhí)行例:AX寄存器中有一個(gè)16位的二進(jìn)制數(shù),編程統(tǒng)計(jì)其中1的個(gè) 數(shù),結(jié)果存放在CX寄存器中。 MOV CX,0;置結(jié)果計(jì)數(shù)器初值LP: AND AX,AX;AX=0否 JZ EXIT1;是, ZF=1,退出循環(huán) SAL AX,1;否,AX最高位移至CF,空位補(bǔ)0 JNC ZERO;CF0,轉(zhuǎn)ZERO繼續(xù)循環(huán) INC CX;CF1,結(jié)果計(jì)數(shù)器加1ZERO: JMP LPEXIT1: HLT控制循環(huán)體的條件:當(dāng)當(dāng)AX內(nèi)容為全內(nèi)容為全0,不必再繼續(xù)統(tǒng)計(jì)。,不必再繼續(xù)統(tǒng)計(jì)。第第4章章 匯編語言程序設(shè)計(jì)匯編

10、語言程序設(shè)計(jì)方法二:方法二: MOV CX, 0LOP: TESTAX,0FFFFH JZSTOP JNSSHIFT ;SF=0則跳轉(zhuǎn)則跳轉(zhuǎn) INCCXSHIFT: SHLAX,1 JMPLOP STOP:HLT常用循環(huán)控制方法: 計(jì)數(shù)控制循環(huán)次數(shù)已知。 條件/狀態(tài)控制循環(huán)次數(shù)未知。多重循環(huán)(復(fù)雜的循環(huán)結(jié)構(gòu))多重循環(huán)(復(fù)雜的循環(huán)結(jié)構(gòu))注意:(1)各重循環(huán)的初始控制條件及程序?qū)崿F(xiàn)(2)防止出現(xiàn)死循環(huán),即不能讓循環(huán)回到初始條件,引起死循環(huán)例:存儲(chǔ)器數(shù)據(jù)段從例:存儲(chǔ)器數(shù)據(jù)段從BUFBUF開始存放一個(gè)字?jǐn)?shù)組,數(shù)組中第一個(gè)字中存放該數(shù)開始存放一個(gè)字?jǐn)?shù)組,數(shù)組中第一個(gè)字中存放該數(shù)組的長度組的長度N N,編

11、程使數(shù)組中數(shù)據(jù)從小到大排列。,編程使數(shù)組中數(shù)據(jù)從小到大排列。方法一:冒泡排序。從第一個(gè)數(shù)據(jù)開始相鄰的數(shù)比較,若次序不對(duì),兩數(shù)交換位置。第一遍比較N-1次后,最大的數(shù)已到了數(shù)組尾,第二遍僅需比較N-2次,共比較N-1遍完成排序,共兩重循環(huán)。開始開始初始化;數(shù)組起始地址初始化;數(shù)組起始地址SISI;內(nèi)循環(huán)次數(shù);內(nèi)循環(huán)次數(shù)N-1N-1CX;外循環(huán)次數(shù);外循環(huán)次數(shù)N-1 DXi=0地址地址+2數(shù)數(shù)i=數(shù)數(shù)i+1?YN兩數(shù)位置交換兩數(shù)位置交換內(nèi)循環(huán)計(jì)數(shù)內(nèi)循環(huán)計(jì)數(shù)CX-1CX=0?NY外循環(huán)計(jì)數(shù)外循環(huán)計(jì)數(shù)DX-1DX=0?NY結(jié)束結(jié)束DATA SEGMENT BUF DW 15,36,8600,3768H

12、,3412H,125EH,76HDATA ENDSSTACK SEGMENT STACK STACK SA DB 100 DUP(?) TOP LABEL WORDSTACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACKMAIN PROC FARSTART: MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP PUSH DS SUB AX, AX PUSH AX MOV AX, DATA MOV DS, AX MOV BX, 0 MOV CX, BUFBX ;設(shè)置計(jì)數(shù)器設(shè)置計(jì)數(shù)器CX,內(nèi)循環(huán)次數(shù)內(nèi)循環(huán)次

13、數(shù) DEC CXL1: MOV DX, CX ;設(shè)計(jì)數(shù)器設(shè)計(jì)數(shù)器DX,外循環(huán)次數(shù)外循環(huán)次數(shù)L2: ADD BX, 2 MOV AX, BUFBX ;取取BUFI與與BUFI+2 CMP AX, BUFBX+2 ;若若BUFI=BUFI+2轉(zhuǎn)轉(zhuǎn) JBE CONTI XCHG AX, BUFBX+2 ;否則兩數(shù)交換否則兩數(shù)交換 MOV BUFBX, AXCONTI: LOOP L2 ;內(nèi)循環(huán)內(nèi)循環(huán) MOV CX, DX ;外循環(huán)次數(shù)賦給外循環(huán)次數(shù)賦給CX MOV BX, 0 ;地址返回第一個(gè)數(shù)據(jù)地址返回第一個(gè)數(shù)據(jù) LOOP L1 ;外循環(huán)外循環(huán) RETMAIN ENDPCODE ENDS END

14、START第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)4.4.5 子程序設(shè)計(jì)與調(diào)用技術(shù)兩種子程序: 重復(fù)使用的程序段或具有通用性便于共享的程序段 (鍵盤處理、代碼轉(zhuǎn)換等); 中斷服務(wù)程序 (中斷隨機(jī)產(chǎn)生,對(duì)它的處理只能采用子程序的形式。)1. 子程序的調(diào)用與返回u 子程序在代碼段中以過程的形式存在。調(diào)用方式有4種: 段內(nèi)或段間的直接調(diào)用,段內(nèi)或段間的間接調(diào)用。段內(nèi)或段間的直接調(diào)用,段內(nèi)或段間的間接調(diào)用。u 對(duì)普通子程序 CALL:斷點(diǎn)保護(hù),轉(zhuǎn)子程序。 RET: 斷點(diǎn)恢復(fù) 。u 對(duì)中斷服務(wù)程序 INT指令或外部事件外部事件觸發(fā) IRET:斷點(diǎn)恢復(fù) 。合理使用子程序是實(shí)現(xiàn)模塊化程序設(shè)計(jì)的重要方法。

15、合理使用子程序是實(shí)現(xiàn)模塊化程序設(shè)計(jì)的重要方法。第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)2. 子程序設(shè)計(jì)與應(yīng)用中的問題(1)現(xiàn)場(chǎng)的保護(hù)與恢復(fù) u “現(xiàn)場(chǎng)” 轉(zhuǎn)向子過程執(zhí)行時(shí)轉(zhuǎn)向子過程執(zhí)行時(shí)主過程的狀態(tài)主過程的狀態(tài),包括: 所有寄存器及指令指針的內(nèi)容。為避免主、子過程各自的數(shù)據(jù)信息與工作狀態(tài)相互干擾, 程序設(shè)計(jì)時(shí)盡量使主、子過程有屬于自己的工作空間。形式二: PUSH BX PUSH CX CALL 子程序 POP CX POP BX常用方法:將常用方法:將PUSH與與POP指令成對(duì)地安排在子程序的開始和結(jié)束指令成對(duì)地安排在子程序的開始和結(jié)束(對(duì)中斷服務(wù)程序必須用這種方法)(對(duì)中斷服務(wù)程序必須

16、用這種方法)形式一: DTOB PROC . PUSH BX . PUSH CX CALL DTOB . POP CX . POP BX . RET DTOB ENDP第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)u 參數(shù)傳遞常用方法(利用一些公共區(qū)域 ): 使用約定的寄存器傳遞; 使用約定的存儲(chǔ)單元(參數(shù)表、變量)傳遞 使用堆棧傳遞(2)參數(shù)傳遞(3)子程序說明(對(duì)子程序的注釋,方便調(diào)用者使用)入、出口參數(shù)入、出口參數(shù):傳給子程序的參數(shù)及從子程序返回的參數(shù)。參數(shù)可以是數(shù)據(jù)本身,也可以是數(shù)據(jù)的存儲(chǔ)地址。參數(shù)可以是數(shù)據(jù)本身,也可以是數(shù)據(jù)的存儲(chǔ)地址。 功能描述(子程序名稱、功能、性能等)。 入口、出

17、口參數(shù)。 所用寄存器和存儲(chǔ)單元。 子程序中又調(diào)用的其它子程序。 調(diào)用實(shí)例(可有可無)。 主過程主過程子過程子過程1CALL 子過程子過程1斷點(diǎn)斷點(diǎn)1子過程嵌套示意圖子過程嵌套示意圖子過程子過程2RETRETCALL 子過程子過程2斷點(diǎn)斷點(diǎn)2第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)(4)調(diào)用子程序的若干技術(shù) 子程序嵌套調(diào)用:子程序中調(diào)用其它子程序稱為嵌套。 只要堆??臻g允許,嵌套層次不限。 子程序遞歸調(diào)用:子程序直接或間接調(diào)用自身稱為遞歸調(diào)用。 含有遞歸調(diào)用的子程序稱為遞歸子程序。 可重入子程序:子程序被調(diào)用后,還未執(zhí)行完又被另一個(gè) 程序調(diào)用的過程稱為重入。 能夠重入的子程序稱為可重入子程序

18、。 注:DOS功能調(diào)用是不可重入的。 第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)3. 子程序應(yīng)用舉例例:求字節(jié)數(shù)組ARRAY中所有元素之和,結(jié)果送SUM字單元。;子程序名:SUM1。程序功能:求字節(jié)數(shù)組和 ;入口參數(shù):SI=數(shù)組首地址,CX=數(shù)組長度;出口參數(shù):AX=數(shù)組和。 使用寄存器:AX,CX,SISUM1 PROC NEAR MOV AX,0;數(shù)組和在;數(shù)組和在AX中中 CMP CX,0 JZ EXIT1AGAIN: ADD AL,SI ADC AH,0;和或許為字;和或許為字 INC SI LOOP AGAINEXIT1: RETSUM1 ENDP;子程序結(jié)束;子程序結(jié)束 第第4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)DATA SEGMENTARRAY DBd1,d2,d3,dn ;定

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論