第五章控制轉(zhuǎn)移指令與循環(huán)程序設(shè)計_第1頁
第五章控制轉(zhuǎn)移指令與循環(huán)程序設(shè)計_第2頁
第五章控制轉(zhuǎn)移指令與循環(huán)程序設(shè)計_第3頁
第五章控制轉(zhuǎn)移指令與循環(huán)程序設(shè)計_第4頁
第五章控制轉(zhuǎn)移指令與循環(huán)程序設(shè)計_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章

控制轉(zhuǎn)移指令與循環(huán)程序設(shè)計匯編語言程序設(shè)計5.2循環(huán)結(jié)構(gòu)程序循環(huán)結(jié)構(gòu)一般是根據(jù)某一條件判斷為真或假來確定是否重復(fù)執(zhí)行循環(huán)體循環(huán)程序結(jié)構(gòu)形式控制條件初始化循環(huán)體YN控制條件初始化循環(huán)體YN循環(huán)指令和轉(zhuǎn)移指令可以實現(xiàn)循環(huán)控制初始化:設(shè)置循環(huán)的初始狀態(tài)循環(huán)體:循環(huán)的工作部分及修改部分控制條件:計數(shù)控制(LOOP)特征值控制(LOOPZ/LOOPNZ/ 條件跳轉(zhuǎn)指令)

●循環(huán)程序結(jié)構(gòu)說明循環(huán)指令:LOOPOPR

執(zhí)行步驟:

(1)(CX)←(CX)-1(2)檢查是否滿足測試條件(如(cx)≠0),如滿足

則轉(zhuǎn)至標號處執(zhí)行循環(huán)體,否則退出循環(huán)。注意:*CX

中存放循環(huán)次數(shù)*只能使用段內(nèi)直接尋址的8位位移量LOOPAGAIN

DECCXJNZAGAIN為零或相等時循環(huán)指令:LOOPZ(LOOPE)OPR測試條件:ZF=1且(CX)

0不為零或不相等時循環(huán)指令:LOOPNZ(LOOPNE)OPR測試條件:ZF=0且(CX)

0循環(huán)指令:LOOPZ/LOOPNZ課堂練習(xí)(P1143.38)BEGIN:MOV AX,01MOV BX,02MOV DX,03MOV CX,04L20: INC AXADD BX,AXSHR DX,1()求括號處分別為LOOPL20、LOOPEL20、LOOPNEL20時,程序執(zhí)行完后AX、BX、CX、DX的內(nèi)容。

例:求首地址為ARRAY的M個字之和,結(jié)果存入TOTALMOVCX,MMOVAX,0MOVSI,AXAGAIN:ADDAX,ARRAY[SI]ADDSI,2LOOPAGAINMOVTOTAL,AXARRAY第1個字ARRAY+2

第2個字ARRAY+4

第3個字第M個字……計數(shù)循環(huán):重復(fù)次數(shù)已知,用計數(shù)值控制循環(huán)的開始與終止。條件控制循環(huán):重復(fù)次數(shù)未知或不確定,需找出循環(huán)控制的條件解:已知循環(huán)次數(shù),采用計數(shù)循環(huán)控制。程序段如下:

MOV

CX,100

;確定循環(huán)計數(shù)器值

MOV

BX,1 ;確定循環(huán)初值

MOV

AX,0 ;和的初值SUM:ADD

AX,BX

INC

BX

LOOPSUM ;循環(huán)控制【例】編寫程序計算C=1+2+3+4+……+100

循環(huán)控制方式例:把BX中的二進制數(shù)以十六進制的形式顯示在屏幕上如:1011001011111010B1234B2FA由于4位二進制數(shù)對應(yīng)1位十六進制數(shù)碼因此每次將BX循環(huán)左移4位之后將其低4位的值加上一個數(shù)得到一個十六進制數(shù)碼對應(yīng)字母的ASCII碼值

BXB2FAB2FA2FABAB2FAB2F(1)程序結(jié)構(gòu)的確定由題意應(yīng)該把BX的內(nèi)容從左到右每4位為一組在屏幕上顯示出來,顯然這可以用循環(huán)結(jié)構(gòu)來完成,每次顯示一個十六進制數(shù)位,因而循環(huán)次數(shù)是已知的,計數(shù)值為4。

(2)循環(huán)體的構(gòu)成(算法確定)

循環(huán)體應(yīng)該包括:將BX的值循環(huán)移位,二進制到所顯示字符的ASCII之間的轉(zhuǎn)換,以及每個字符的顯示。

分析:需要了解相關(guān)知識:◆字符和其ASCII碼之間的關(guān)系?“0”~“9”30H~39H,“A”~”F”41H~5AH◆如何顯示一個字符?(a)將顯示字符的ASCII碼放入DL寄存器;(b)將AH的內(nèi)容置為2(功能號);(c)執(zhí)行INT21H(DOS功能調(diào)用)。分析:(3)循環(huán)控制條件分析●因為循環(huán)次數(shù)已知,可以使用LOOP指令實現(xiàn),但是必須注意:由于循環(huán)移位指令中使用CL寄存器作為移位次數(shù)寄存器,而LOOP指令的循環(huán)次數(shù)隱含在CX寄存器中,因此,必須注意這兩者之間的沖突?!癯丝梢允褂肔OOP指令之外,還可以使用條件跳轉(zhuǎn)指令來實現(xiàn)。LOOPAGAIN

DEC計數(shù)器

JNZAGAIN初始化循環(huán)計數(shù)值初始化循環(huán)計數(shù)值BX循環(huán)左移4位初始化循環(huán)計數(shù)值BX循環(huán)左移4位把最右邊的4位數(shù)加上30H,使0-9轉(zhuǎn)換為ASCII初始化循環(huán)計數(shù)值BX循環(huán)左移4位把最右邊的4位數(shù)加上30H,使0-9轉(zhuǎn)換為ASCIIASCII是否是A—FNY初始化循環(huán)計數(shù)值BX循環(huán)左移4位把最右邊的4位數(shù)加上30H,使0-9轉(zhuǎn)換為ASCIIASCII是否是A—FNY加上7顯示一個字符初始化循環(huán)計數(shù)值BX循環(huán)左移4位把最右邊的4位數(shù)加上30H,使0-9轉(zhuǎn)換為ASCIIASCII是否是A—FNY加上7顯示一個字符(CX)=0?YN

……

movcx,4;初始化rotate:pushcx

movcl,4rolbx,clmoval,blandal,0fh;取AL低4位addal,30h;將數(shù)字轉(zhuǎn)換為ASCII碼cmpal,3ah;與3A比較判斷是否為數(shù)字jlprintitaddal,7h;’A’~’F’ASCII41H~46Hprintit:movdl,almovah,2int21h

popcx

looprotate……方法1(LOOP)

……

movch,4;初始化rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30h;’0’~’9’ASCII30H~39Hcmpal,3ahjlprintitaddal,7h;’A’~’F’ASCII41H~46Hprintit:movdl,almovah,2int21h

decchjnzrotate

……方法2(條件跳轉(zhuǎn)指令)5.2在ADDR單元中存放著數(shù)Y的地址,試編制一程序把Y中1的個數(shù)存入COUNT單元中。

YNUMADDR分析:要測出Y中1的個數(shù)就應(yīng)逐位測試。根據(jù)最高有效位是否為1來計數(shù),然后用移位的方法把各位逐次移到最高位去。循環(huán)的結(jié)束用16來控制。但更好的辦法是結(jié)合上述方法可以用測試數(shù)是否為0來作為結(jié)束條件。程序流程圖開始結(jié)束初始化C=0Y邏輯左移1位Y=0?Y=-?YYNC=C+1COUNTCNdatareasegmentaddrdwnumbernumberdwYcountdw?datareaendsprognamsegmentassumecs:prognam,ds:datareastart:

movax,datarea

movds,ax

movcx,0movbx,addrmovax,[bx];取Y的值并放入AXrepeat:testax,0ffffh;測試Y是否為0jzexit;如果Y=0退出jnsshift;如果符號位為0,轉(zhuǎn)到shiftinccx;符號位為1,則C=C+1shift:shlax,1;邏輯左移1位jmprepeatexit:movcount,cxmovah,4chint21hprognamendsendstart例:將正數(shù)n插入一個已整序的正整數(shù)字數(shù)組。該數(shù)組的首地址和末地址分別為ARRAY_HEAD,ARRAY_END。分析:題目要求在已經(jīng)排好序的正數(shù)數(shù)組中插入一個正數(shù)n,因此,解決問題的關(guān)鍵是找到要插入正數(shù)n的位置。需要考慮如下問題?(1)如何找到插入位置?(2)如何插入正數(shù)n?(3)數(shù)組邊界問題考慮?●由于數(shù)組已經(jīng)排好序,因此可以將正數(shù)n依次和數(shù)組中的數(shù)進行比較。從最后一個元素開始比較,采用如下方法:●在插入數(shù)時,可能遇到特殊情況,即數(shù)n比數(shù)組中所有的數(shù)都要大,或者小。若比所有的數(shù)都大,就不需要移動原數(shù)組中的數(shù),直接插入即可;若比所有的數(shù)都小,就將數(shù)n放在數(shù)組的首位置。

很顯然,查找位置和空出位置的過程就是循環(huán)比較的過程,因此采用循環(huán)結(jié)構(gòu)來實現(xiàn),那么,循環(huán)條件如何確定呢?其中一種比較容易想到循環(huán)條件就是:數(shù)組元素K<=n,就在K之后插入n,否則K前移一個數(shù),繼續(xù)與n比較。

另外,可以充分利用題目中的已知條件即數(shù)組中的數(shù)均為正數(shù),所以我們可以在數(shù)組的開始的前一個位置存放一個負數(shù),不妨存放數(shù)-1,這樣,在循環(huán)控制時就不需要用數(shù)組長度來進行控制,可以進一步簡化程序的設(shè)計。而且需要注意的是,有可能一次都不需要移動數(shù)組中的數(shù)。把數(shù)組的開始的前一個位置存放一個負數(shù)(ARRAR_HEAD-2)←-1初始化變址寄存器SIK<=N?插入NK前移一個字修改地址結(jié)束開始YNxdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105ndw32movax,nmovarray_head-2,0ffffhmovsi,0compare:cmparray_end[si],axjleinsertmovbx,array_end[si]movarray_end[si+2],bxsubsi,2jmpcompareinsert:movarray_end[si+2],axarray_head

35152337495265789910532-1array_end

n

x

5.1.3多重循環(huán)多重循環(huán)程序設(shè)計的基本方法和單重循環(huán)程序設(shè)計是一致應(yīng)分別考慮各重循環(huán)的控制條件及其程序?qū)崿F(xiàn),相互之間不能混淆。特別注意的是在每次通過外循環(huán)再次進入內(nèi)循環(huán)時,初始條件必須重新設(shè)置。例:將首地址為ARRAY的字數(shù)組從小到大排序,假設(shè)有5個元素。(用冒泡法)冒泡法“冒泡法”是一種排序算法,不是最優(yōu)的算法,但它易于理解和實現(xiàn)冒泡法從第一個元素開始,依次對相鄰的兩個元素進行比較,使前一個元素不大于后一個元素;將所有元素比較完之后,最大的元素排到了最后;然后,除掉最后一個元素之外的元素依上述方法再進行比較,得到次大的元素排在后面;如此重復(fù),直至完成就實現(xiàn)元素從小到大的排序n個數(shù)需要n-1趟比較,如n=5,則需要比較4趟(外循環(huán)),第一趟比較次數(shù)為4(內(nèi)循環(huán)),第二趟比較次數(shù)為3(內(nèi)循環(huán)),第三趟比較次數(shù)為2(內(nèi)循環(huán)),第四趟比較次數(shù)為1(內(nèi)循環(huán))。冒泡法的排序過程序號數(shù)比較遍數(shù)1234

13228531641558321615885161583285158163285815163285movcx,5 ;CX←數(shù)組元素個數(shù)

deccx ;元素個數(shù)減1為外循環(huán)次數(shù)outlp: movdx,cx ;DX←內(nèi)循環(huán)次數(shù)

movbx,0inlp: movax,

array[bx] ;取前一個元素

cmpax,array[bx+2];與后一個元素比較

jngnext;前一個不大于后一個元素,則不進行交換

xchgax,array[bx+2];否則,進行交換

movarray[bx],axnext: addbx,2 ;指針指向下一個元素

decdx jnzinlp

;內(nèi)循環(huán)尾

loopoutlp ;外循環(huán)尾例:將首地址為ARRAY的字數(shù)組從小到大排序,假設(shè)有5個元素。第一題:MOVAL,0

MOVBL,0

MOVCX,10L1:INCBL

INCBL

ADDAL,BL

LOOPL1

程序的功能是:

課堂練習(xí):第二題:

MOVAX,4BD5H

MOVBL,0

MOVDL,0

MOVCX,16L1:SHLAX,1

JC

L2

INCBL

JMPL3L2:INCDLL3:LOOPL1

程序的功能是:程序執(zhí)行后BL=(),DL=(),AX=()movah,1;接收用戶輸入的一個字符,并放入AL中int21hcmpal,'a'jbstopcmpal,'z'jastopdecal;

得到前導(dǎo)字符movdl,almovcx,3;準備顯示三個字符

display:movah,2int21hincdlloopdisplaystop:movah,4ch;返回DOSint21h;顯示一個字符的DOS調(diào)用,將DL中的字符輸出顯示

當系統(tǒng)運行或者程序運行期間在遇到某些特殊情況時,需要計算機自動執(zhí)行一組專門的例行程序來進行處理.這種情況稱為中斷(interrupt),所執(zhí)行的這組程序稱為中斷子程序(inerruptroutine)。中斷分為內(nèi)部中斷和外部中斷。內(nèi)部中斷包括如遇到除數(shù)為0,或程序中為了作某些處理而設(shè)置的中斷指令等。外部中斷則主要用來處理I/O設(shè)備與CPU之間的通信。中斷指令:INTTYPE或INT

類型0的(IP)

類型0的(CS)

類型1的(IP)

類型1的(CS)

類型N的(IP)

類型N的(CS)

類型255的(IP)

類型255的(CS)00000000044*N003FC中斷向量表中斷例行程序的入口地址,存放于中斷向量區(qū)。

00000H003FFHA0000HC0000HF0000H640K(RAM)128K(RAM)192K(ROM)64K(ROM)中斷向量(中斷號):DOS的系統(tǒng)功能調(diào)用一、DOS系統(tǒng)功能調(diào)用概述

DOS操作系統(tǒng)為程序設(shè)計人員提供了可以直接調(diào)用的功能子程序。調(diào)用這些子程序可以實現(xiàn)從鍵盤輸入數(shù)據(jù),將數(shù)據(jù)送顯示器顯示,以及磁盤操作等功能。DOS系統(tǒng)功能調(diào)用方法:

DOS操作系統(tǒng)的功能調(diào)用都是利用INT21H中斷指令實現(xiàn)的,每個功能調(diào)用對應(yīng)一個子程序,并有一個編號,稱功能號。1)將入口參數(shù)傳送到指定寄存器中;2)子程序功能號送入AH寄存器中;3)發(fā)軟中斷指令“INT21H”。INT21H

類型0的(IP)

類型0的(CS)

類型1的(IP)

類型

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論