版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
§4
程序設(shè)計
匯編語言程序設(shè)計步驟:1.分析問題,確定算法
2.編制程序流程圖
3.編制程序
4.調(diào)試程序
一個源程序的基本格式如下:DATASEGMENT?DATAENDSEXTRASEGEMNT?
EXTRAENDSSTACK1SEGMENTPARASTACK?STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATAASSUMESS:STACK1,ES:EXTRA??????;存放數(shù)據(jù)項的數(shù)據(jù)段;存放數(shù)據(jù)項的附加段;堆棧段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單元中,運算結(jié)果不超過16位。解:(1)存儲單元RESULT用來存放結(jié)果,VARX和VARY放
X、Y的值。寄存器DX放中間運算結(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è)計
設(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è)計時,通常用比較、測試,或算術(shù)運算、邏輯運算影響標(biāo)志位,然后選擇轉(zhuǎn)移指令。分支程序結(jié)構(gòu)開始條件?A塊存結(jié)果結(jié)束成立不成立初始化開始條件?A塊B塊存結(jié)果結(jié)束成立不成立初始化例:分支程序設(shè)計
y=1x>00x=0-1x<0設(shè):x為8位有符號數(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正計數(shù)法:倒計數(shù)法:MOVCX,NMOVCX,0L:L:
DECCXINCCXJNZLCMPCX,NJNZL…………三、循環(huán)程序結(jié)構(gòu)入口初始化部分循環(huán)結(jié)束?循環(huán)體修改部分出口YN用于當(dāng)計數(shù)次數(shù)無法確定,但循環(huán)次數(shù)與某些條件有關(guān),并且條件可檢測時,可采用條件控制。
先判斷,后執(zhí)行結(jié)構(gòu)
循環(huán)控制指令LOOPLOOP標(biāo)號;(CX)-1CX,(CX)=0時轉(zhuǎn)標(biāo)號LOOPE/LOOPZ標(biāo)號;(CX)-1CX(CX)=0且ZF=1(相同)時轉(zhuǎn)標(biāo)號LOOPNZ/LOOPNE標(biāo)號;(CX)-1CX(CX)=0且ZF=0(不同)時轉(zhuǎn)標(biāo)號例如:MOVCX,10MOVCX,10
L1:……….L1:………
CMPAX,X
LOOPL1
LOOPEL1
}相同不同或全比較完ZF=0(CX)=0例1:
計算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是一組無符號十六位二進(jìn)制數(shù),并設(shè)其和不大于2個字節(jié)。定義數(shù)組名TABL存放a1~a20;和存放于單元YY中。中間結(jié)果存于寄存器AX中。BX寄存器為地址指針,CX寄存器作計數(shù)器。例2.編程統(tǒng)計數(shù)據(jù)塊中正數(shù)的個數(shù),并將其送RS單元中。解:數(shù)據(jù)塊定義為D1,RS單元存放正數(shù)的個數(shù),數(shù)據(jù)塊長度用COUNT表示。BX作地址指針,CX作計數(shù)器,DX記錄正數(shù)的個數(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寄存器中有一個16位的二進(jìn)制數(shù),編程統(tǒng)計其中值為1的位的個數(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)計工作,因此可采用先判斷,后執(zhí)行結(jié)構(gòu)。流程圖如右:(B).循環(huán)控制方式1.計數(shù)控制用于計數(shù)次數(shù)已知的情況,可采用正計數(shù)或倒計數(shù)法。如例12.條件控制當(dāng)計數(shù)次數(shù)無法確定,但循環(huán)次數(shù)與某些條件有關(guān),并且條件可檢測時,可采用條件控制,例如檢測,比較或判斷等形式。例4.在一串字符串中查找某一關(guān)鍵字‘#’,若查到,記下存放該關(guān)鍵字單元的偏移地址,若找不到用-1作標(biāo)記。解:設(shè)串變量名STRING,關(guān)鍵字單元CHAR,關(guān)鍵字單元的偏移地址放FLAG單元。寄存器SI為字符串的地址指針,CX為字符串長度,AL用于放關(guān)鍵字‘#’。STARTSISTRING的EACX串長度
AL‘#’[SI]=AL?SI=SI+1CX-1=0?FLAG-1ENDFLAGSIYNYN還可用字符串指令實現(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)體序號數(shù)8516328412345例:A數(shù)組中有N個數(shù),將它們按從大到小的順序排列。冒泡排序法
從第一個數(shù)開始依次對相鄰的兩個數(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è)計中的問題:
子程序的調(diào)用和返回
子程序調(diào)用時參數(shù)的傳遞方法四、子程序結(jié)構(gòu)子程序名PROC[NEAR/FAR]
RET[n]子程序名ENDP……子程序的調(diào)用和返回CALL
子程序名
RET[n]斷點入口……….CALL
;斷點入棧、取子程序入口RET[n];斷點出棧,若帶有n,繼續(xù)彈出斷點以下的n個字節(jié)的數(shù)據(jù)。SPSPSP斷點CS斷點IP棧底CALL斷點IP斷點CSIPCSRET
子程序調(diào)用時參數(shù)的傳遞方法
調(diào)用程序被調(diào)用程序
參數(shù)傳遞:
(1)寄存器傳遞:參數(shù)較少(2)存儲單元傳遞:參數(shù)較多(3)堆棧傳遞:子程序嵌套或遞歸調(diào)用
數(shù)據(jù)結(jié)果子程序設(shè)計舉例:求十進(jìn)制數(shù)的和
1.用寄存器
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年事業(yè)單位教師招聘言語理解與表達(dá)題庫附參考答案【培優(yōu)】
- 2024版建筑工程承包協(xié)議書
- 2024琴行鋼琴出租合同含琴行品牌宣傳合作3篇
- 2025年度地質(zhì)災(zāi)害監(jiān)測與防治測量勞務(wù)分包合同安全規(guī)范范本3篇
- 2025年度企業(yè)股權(quán)激勵法律風(fēng)險防范合同3篇
- 2025年安防監(jiān)控系統(tǒng)設(shè)計與安裝服務(wù)合同3篇
- 2024版房地產(chǎn)買賣合同(含附屬設(shè)施和土地使用權(quán)轉(zhuǎn)讓)
- 13 書面表達(dá)分類練-2022-2023學(xué)年七年級英語下學(xué)期期末復(fù)習(xí)培優(yōu)拔高(牛津譯林版)(解析版)
- 2024年初中九年級中考語文測試題及答案
- 2024版衛(wèi)星導(dǎo)航系統(tǒng)開發(fā)與應(yīng)用合同
- 微波治療技術(shù)的臨床應(yīng)用指南
- 安徽省合肥市廬陽區(qū)部分學(xué)校2023-2024學(xué)年八年級上學(xué)期期末考試英語試題(含答案)
- JTG 3441-2024公路工程無機(jī)結(jié)合料穩(wěn)定材料試驗規(guī)程
- 羊肉銷售人員工作匯報
- 律所標(biāo)書模板
- 安徽省合肥市包河區(qū)四十八中學(xué)2023-2024學(xué)年數(shù)學(xué)七年級第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測試題含解析
- 美術(shù)概論-課件
- 危險化學(xué)品安全監(jiān)管執(zhí)法培訓(xùn)課件
- 保潔供方管控要點
- 空氣源熱泵冷暖空調(diào)、熱水項目施工方案
- 《行政組織學(xué)》期末復(fù)習(xí)指導(dǎo)
評論
0/150
提交評論