微機(jī)原理:第4章 程序設(shè)計(jì)2_第1頁(yè)
微機(jī)原理:第4章 程序設(shè)計(jì)2_第2頁(yè)
微機(jī)原理:第4章 程序設(shè)計(jì)2_第3頁(yè)
微機(jī)原理:第4章 程序設(shè)計(jì)2_第4頁(yè)
微機(jī)原理:第4章 程序設(shè)計(jì)2_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

§4

程序設(shè)計(jì)

匯編語言程序設(shè)計(jì)步驟:1.分析問題,確定算法

2.編制程序流程圖

3.編制程序

4.調(diào)試程序

一個(gè)源程序的基本格式如下:DATASEGMENT?DATAENDSEXTRASEGEMNT?

EXTRAENDSSTACK1SEGMENTPARASTACK?STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATAASSUMESS:STACK1,ES:EXTRA??????;存放數(shù)據(jù)項(xiàng)的數(shù)據(jù)段;存放數(shù)據(jù)項(xiàng)的附加段;堆棧段START:MOVAX,DATAMOVDS,AXMOVAX,EXTRAMOVES,AXMOVAH,4CHINT21HCODEENDSENDSTART??????(核心程序段);DD裝入段基址;ES裝入段基址;系統(tǒng)功能調(diào)用;返回操作系統(tǒng)(一)順序結(jié)構(gòu)程序例1編制程序,求下列公式中的Z值,并將結(jié)果存放到RESULT單元中。

=Z(X+Y)*8-X2

設(shè)X,Y的值分別存放在VARX,VARY單元中,運(yùn)算結(jié)果不超過16位。解:(1)存儲(chǔ)單元RESULT用來存放結(jié)果,VARX和VARY放

X、Y的值。寄存器DX放中間運(yùn)算結(jié)果,左移1位相當(dāng)于乘2,右移1位相當(dāng)于除2,所以可以用左移3位得到乘以8的結(jié)果。

(2)程序流程圖和程序如下:開始預(yù)置段寄存器DXXDXX+YDX右移得((X+Y)*8-X)/2RESULTDX結(jié)束DX左移3次(X+Y)*8DX(DX)-XDATASEGMENTVARXDW0006HVARYDW0007HRESULDW?DATAENDSSACK1SEGMENTPARASTACKDW100HDUP(?) SACK1ENDSCOSEGSEGMENTASSUMECS:COSEGASSUMEDS:DATAASSUMESS:STACK1START:MOVAX,DATAMOVDS,AXMOVDX,VARX;DXXADDDX,VARY;DXX+YMOVCL,3SALDX,CL;DX(X+Y)*8SUBDX,VARX;DX(X+Y)*8-XSARDX,1;DX((X+Y)*8-X)/2MOVRESULT,DXMOVAH,4CH;系統(tǒng)功能調(diào)用,返回操作系統(tǒng)

INT21HCOSEGENDSENDSTART

例:順序程序設(shè)計(jì)

設(shè):在內(nèi)存XX單元中存放數(shù)x(0<x<9的整數(shù)),查表求x的平方值,并將結(jié)果存入YY單元中。

DATASEGMENTTABDB0,1,4,9,16,25DB36,49,64,81XXDB2YYDB?DATAENDSTAB+00+11+24+981+A2+B4

CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAH,0MOVAL,XXMOVBX,OFFSETTABADDBX,AXMOVAL,[BX]MOVYY,ALMOVAH,4CHINT21HCODEENDSENDSTART}XLAT(二)、分支程序條件轉(zhuǎn)移:JX目標(biāo)用于程序需要進(jìn)行分別處理的情況。主要使用轉(zhuǎn)移指令。轉(zhuǎn)移指令分為無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令。無條件轉(zhuǎn)移指令:JMP目標(biāo)在進(jìn)行分支程序設(shè)計(jì)時(shí),通常用比較、測(cè)試,或算術(shù)運(yùn)算、邏輯運(yùn)算影響標(biāo)志位,然后選擇轉(zhuǎn)移指令。分支程序結(jié)構(gòu)開始條件?A塊存結(jié)果結(jié)束成立不成立初始化開始條件?A塊B塊存結(jié)果結(jié)束成立不成立初始化例:分支程序設(shè)計(jì)

y=1x>00x=0-1x<0設(shè):x為8位有符號(hào)數(shù)開始預(yù)置段RALXAL>0AL>0AL-1AL0AL1NYNYYAL結(jié)束DATASEGMENTXDBxYDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,X

CMPAL,0

;x-0建標(biāo)志位

JGEBIGD

;x0轉(zhuǎn)移

MOVAL,-1;x<0

JMPJUS2BIGD:JGJUS1

;x>0轉(zhuǎn)移

MOVAL,0;x=0

JMPJUS2JUS1:MOVAL,1;x>0

JUS2:MOVY,AL

MOVAH,4CHINT21HCODEENDSENDSTART入口初始化部分循環(huán)體修改部分結(jié)束?出口YN(A).循環(huán)的基本結(jié)構(gòu)先執(zhí)行,后判斷結(jié)構(gòu)設(shè):循環(huán)次數(shù)為N正計(jì)數(shù)法:倒計(jì)數(shù)法:MOVCX,NMOVCX,0L:L:

DECCXINCCXJNZLCMPCX,NJNZL…………三、循環(huán)程序結(jié)構(gòu)入口初始化部分循環(huán)結(jié)束?循環(huán)體修改部分出口YN用于當(dāng)計(jì)數(shù)次數(shù)無法確定,但循環(huán)次數(shù)與某些條件有關(guān),并且條件可檢測(cè)時(shí),可采用條件控制。

先判斷,后執(zhí)行結(jié)構(gòu)

循環(huán)控制指令LOOPLOOP標(biāo)號(hào);(CX)-1CX,(CX)=0時(shí)轉(zhuǎn)標(biāo)號(hào)LOOPE/LOOPZ標(biāo)號(hào);(CX)-1CX(CX)=0且ZF=1(相同)時(shí)轉(zhuǎn)標(biāo)號(hào)LOOPNZ/LOOPNE標(biāo)號(hào);(CX)-1CX(CX)=0且ZF=0(不同)時(shí)轉(zhuǎn)標(biāo)號(hào)例如:MOVCX,10MOVCX,10

L1:……….L1:………

CMPAX,X

LOOPL1

LOOPEL1

}相同不同或全比較完ZF=0(CX)=0例1:

計(jì)算Y=

程序如下:DATASEGMENTTABLDWa1,a2,······,a20

YYDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;

MOVDS,AXMOVAX,0LEABX,TABLMOVCX,20L0:ADDAX,[BX];循環(huán)體

INCBX;修改部分

INCBXLOOPL0;控制部分

MOVYY,AX

MOVAH,4CHINT21HCODEENDSENDSTART設(shè)a1,a2,···a20是一組無符號(hào)十六位二進(jìn)制數(shù),并設(shè)其和不大于2個(gè)字節(jié)。定義數(shù)組名TABL存放a1~a20;和存放于單元YY中。中間結(jié)果存于寄存器AX中。BX寄存器為地址指針,CX寄存器作計(jì)數(shù)器。例2.編程統(tǒng)計(jì)數(shù)據(jù)塊中正數(shù)的個(gè)數(shù),并將其送RS單元中。解:數(shù)據(jù)塊定義為D1,RS單元存放正數(shù)的個(gè)數(shù),數(shù)據(jù)塊長(zhǎng)度用COUNT表示。BX作地址指針,CX作計(jì)數(shù)器,DX記錄正數(shù)的個(gè)數(shù),程序流程圖如下所示:START預(yù)置段RBXD1DX0CXCOUNT[BX]>0?DXDX+1BXBX+1CXCX-1CX=0?RS(DX)ENDNYNYDATASEGMENTD1DB-1,-3,5,7,-9,···,-6RSDW?COUNTEQU$-D1DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETD1MOVCX,COUNTMOVDX,0MOVRS,DXMOVAH,4CHINT21HCODEENDSENDSTARTLOOPLOP1LOP1:MOVAL,[BX]CMPAL,0JLEJUSTIJUSTI:INCBXDECCXJNZLOP1INCDX例3:AX寄存器中有一個(gè)16位的二進(jìn)制數(shù),編程統(tǒng)計(jì)其中值為1的位的個(gè)數(shù),并將結(jié)果存于CX中。STARTCX0AX=0?AX左移CF=0?CXCX+1ENDYNYN程序段如下:

MOVCX,0LOP:ANDAX,AX

;建標(biāo)志位

JZSTOP

;AX=0停機(jī)

SALAX,1JNCNODINCCXNOD:JMPLOPSTOP:MOVAH,4CHINT21H由于AX有可能為0,若AX=0則不必再往下作統(tǒng)計(jì)工作,因此可采用先判斷,后執(zhí)行結(jié)構(gòu)。流程圖如右:(B).循環(huán)控制方式1.計(jì)數(shù)控制用于計(jì)數(shù)次數(shù)已知的情況,可采用正計(jì)數(shù)或倒計(jì)數(shù)法。如例12.條件控制當(dāng)計(jì)數(shù)次數(shù)無法確定,但循環(huán)次數(shù)與某些條件有關(guān),并且條件可檢測(cè)時(shí),可采用條件控制,例如檢測(cè),比較或判斷等形式。例4.在一串字符串中查找某一關(guān)鍵字‘#’,若查到,記下存放該關(guān)鍵字單元的偏移地址,若找不到用-1作標(biāo)記。解:設(shè)串變量名STRING,關(guān)鍵字單元CHAR,關(guān)鍵字單元的偏移地址放FLAG單元。寄存器SI為字符串的地址指針,CX為字符串長(zhǎng)度,AL用于放關(guān)鍵字‘#’。STARTSISTRING的EACX串長(zhǎng)度

AL‘#’[SI]=AL?SI=SI+1CX-1=0?FLAG-1ENDFLAGSIYNYN還可用字符串指令實(shí)現(xiàn)(C)多重循環(huán)結(jié)構(gòu)

外層初始化內(nèi)層初始化循環(huán)體內(nèi)層循環(huán)參數(shù)修改控制內(nèi)層循環(huán)外層循環(huán)參數(shù)修改控制外層循環(huán)外層循環(huán)體序號(hào)數(shù)8516328412345例:A數(shù)組中有N個(gè)數(shù),將它們按從大到小的順序排列。冒泡排序法

從第一個(gè)數(shù)開始依次對(duì)相鄰的兩個(gè)數(shù)進(jìn)行比較若順序正序,不交換兩數(shù)位置;若順序不正序,交換兩數(shù)位置。816328451632848532841685843216851234比較次序流程圖:STARTCXN—1DICXBX0AXA[BX]A[BX+2]A[BX]BXBX+2DIDI-1ENDAX>A[BX+2]?DI=0?CX-1=0?NYNYNY交換標(biāo)志=0NY交換標(biāo)志=1?交換標(biāo)志=1DATASEGMENTADW50DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,50DECCXLP1:MOVDI,CX;外循環(huán)

MOVBX,0LP2:MOVAX,A[BX];內(nèi)循環(huán)

CMPAX,A[BX+2]JGCONT

XCHGAX,A[BX+2]MOV[BX],AXCONT:ADDBX,2

DECDIJNZLP2

LOOPLP1MOVAH,4CHINT21HCODEENDSENDSTARTDATASEGMENTADWnDUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

MOVCX,NDECCXLP1:MOVDI,CX;外循環(huán)

MOVBX,0

MOVDX,0;未交換標(biāo)志0LP2:MOVAX,A[BX];內(nèi)循環(huán)

CMPAX,A[BX+2]JGCONT

XCHGAX,A[BX+2]MOV[BX],AX

MOVDX,1;交換標(biāo)志1CONT:ADDBX,2

DECDIJNZLP2

CMPDX,0

JZL1LOOPLP1L1:MOVAH,4CHINT21HCODEENDSENDSTART

子程序設(shè)計(jì)中的問題:

子程序的調(diào)用和返回

子程序調(diào)用時(shí)參數(shù)的傳遞方法四、子程序結(jié)構(gòu)子程序名PROC[NEAR/FAR]

RET[n]子程序名ENDP……子程序的調(diào)用和返回CALL

子程序名

RET[n]斷點(diǎn)入口……….CALL

;斷點(diǎn)入棧、取子程序入口RET[n];斷點(diǎn)出棧,若帶有n,繼續(xù)彈出斷點(diǎn)以下的n個(gè)字節(jié)的數(shù)據(jù)。SPSPSP斷點(diǎn)CS斷點(diǎn)IP棧底CALL斷點(diǎn)IP斷點(diǎn)CSIPCSRET

子程序調(diào)用時(shí)參數(shù)的傳遞方法

調(diào)用程序被調(diào)用程序

參數(shù)傳遞:

(1)寄存器傳遞:參數(shù)較少(2)存儲(chǔ)單元傳遞:參數(shù)較多(3)堆棧傳遞:子程序嵌套或遞歸調(diào)用

數(shù)據(jù)結(jié)果子程序設(shè)計(jì)舉例:求十進(jìn)制數(shù)的和

1.用寄存器

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論