版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
循環(huán)和分支程序相關(guān)設(shè)計(jì)教學(xué)重點(diǎn)1.掌握基本程序結(jié)構(gòu)――順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)及其匯編語(yǔ)言程序設(shè)計(jì)2.熟悉常見程序設(shè)計(jì)問題:數(shù)據(jù)范圍判斷(0~9、A~Z、a~z)字母大小寫轉(zhuǎn)換;字符串傳送、比較等操作求最大最小值、數(shù)據(jù)求和、統(tǒng)計(jì)字符個(gè)數(shù)數(shù)組排序,查找,插入,刪除●
(3)分支結(jié)構(gòu)(4)子程序結(jié)構(gòu)●程序結(jié)構(gòu)(5)復(fù)合結(jié)構(gòu):多種程序結(jié)構(gòu)的組合…
(1)順序結(jié)構(gòu)(2)循環(huán)結(jié)構(gòu)2023/3/20●編制匯編語(yǔ)言程序的步驟(1)分析題意,確定算法(2)根據(jù)算法畫出程序框圖(3)根據(jù)框圖編寫程序(4)上機(jī)調(diào)試程序2023/3/205.0順序程序設(shè)計(jì)順序程序完全按指令書寫的前后順序執(zhí)行每一條指令,是最基本、最常見的程序結(jié)構(gòu)一般純粹的順序結(jié)構(gòu)的程序設(shè)計(jì)較少。2023/3/20例datasegmentX dw5Y dw6Z dw7W dw?dataendscodesegmentmainprocfar
assumecs:code,ds:datastart:
pushds
xorax,ax pushaxmovax,datamovds,ax movax,X addax,Y addax,Z movW,ax retmainendpcodeendsendstartWX+Y+Z2023/3/20例代碼轉(zhuǎn)換;查表法,實(shí)現(xiàn)一位16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼顯示datasegment
ASCIIdb30h,31h,32h,33h,34h,35h db36h,37h,38h,39h ;0~9的ASCII碼
db41h,42h,43h,44h,45h,46h;A~F的ASCII碼
hex db0bh;任意設(shè)定一個(gè)待轉(zhuǎn)換的一位16進(jìn)制數(shù)dataendscodesegmentmainprocfar
2023/3/20例代碼轉(zhuǎn)換
assumecs:code,ds:datastart:pushdsxorax,ax pushaxmovax,datamovds,ax;------------- movbx,offsetASCII ;BX指向ASCII碼表
moval,hex ;AL取得一位16進(jìn)制數(shù),正是ASCII碼表中位移
2023/3/20andal,0fh ;只有低4位是有效的,高4位清0 xlat ;換碼:AL←DS:[BX+AL] movdl,al ;入口參數(shù):DL←AL movah,2 ;02號(hào)DOS功能調(diào)用
int21h ;顯示一個(gè)ASCII碼字符
retmainendpcodeendsendstart例代碼轉(zhuǎn)換2023/3/20;查表法,實(shí)現(xiàn)一位16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼顯示datasegmentASCIIdb30h,31h,32h,33h,34h,35h db36h,37h,38h,39h ;0~9的ASCII碼
db41h,42h,43h,44h,45h,46h;A~F的ASCII碼
hex db0bh;任意設(shè)定一個(gè)待轉(zhuǎn)換的一位16進(jìn)制數(shù)dataendscodesegmentmainprocfarassumecs:code,ds:datastart: pushds xorax,ax pushax movax,data movds,ax ;------------- movbx,offsetASCII ;BX指向ASCII碼表
moval,hex ;AL取得一位16進(jìn)制數(shù),正是ASCII碼表中位移 andal,0fh ;只有低4位是有效的,高4位清0 xlat ;換碼:AL←DS:[BX+AL] movdl,al ;入口參數(shù):DL←AL movah,2 ;02號(hào)DOS功能調(diào)用
int21h ;顯示一個(gè)ASCII碼字符
retmainendpcodeendsendstart5.1循環(huán)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)一般是根據(jù)某一條件判斷為真或假來確定是否重復(fù)執(zhí)行循環(huán)體循環(huán)指令和轉(zhuǎn)移指令可以實(shí)現(xiàn)循環(huán)控制2023/3/20●循環(huán)程序結(jié)構(gòu)形式DO-WHILE結(jié)構(gòu)
DO-UNTIL結(jié)構(gòu)控制條件初始化循環(huán)體YN控制條件初始化循環(huán)體YN2023/3/20初始化:設(shè)置循環(huán)的初始狀態(tài)循環(huán)體:循環(huán)的工作部分及修改部分控制條件:計(jì)數(shù)控制(LOOP)特征值控制(LOOPZ/LOOPNZ/ 條件跳轉(zhuǎn)指令)
●循環(huán)程序結(jié)構(gòu)說明2023/3/20例:把BX中的二進(jìn)制數(shù)以十六進(jìn)制的形式顯示在屏幕上
如:1011001011111010BB2FAH
BX12342023/3/20分析:(1)程序結(jié)構(gòu)的確定由題意應(yīng)該把BX的內(nèi)容從左到右每4位為一組在屏幕上顯示出來,顯然這可以用循環(huán)結(jié)構(gòu)來完成,每次顯示一個(gè)十六進(jìn)制數(shù)位,因而循環(huán)次數(shù)是已知的,計(jì)數(shù)值為4。
(2)循環(huán)體的構(gòu)成(算法確定)循環(huán)體應(yīng)該包括:二進(jìn)制到所顯示字符的ASCII之間的轉(zhuǎn)換,以及每個(gè)字符的顯示。需要了解相關(guān)知識(shí):◆字符和其ASCII碼之間的關(guān)系?
“0”~“9”
30H~39H,“A”~”F”41H~5AH◆如何顯示一個(gè)字符?(a)將顯示字符的ASCII碼放入DL寄存器;(b)將AH的內(nèi)容置為2(功能號(hào));(c)執(zhí)行INT21H(DOS功能調(diào)用)。2023/3/20(3)循環(huán)控制條件分析●因?yàn)檠h(huán)次數(shù)已知,可以使用LOOP指令實(shí)現(xiàn),但是必須注意:由于循環(huán)移位指令中使用CL寄存器作為移位次數(shù)寄存器,而LOOP指令的循環(huán)次數(shù)隱含在CX寄存器中,因此,必須注意這兩者之間的沖突?!癯丝梢允褂肔OOP指令之外,還可以使用條件跳轉(zhuǎn)指令來實(shí)現(xiàn)。LOOPAGAIN
DEC計(jì)數(shù)器
JNZAGAIN2023/3/20
……
movcx,4;初始化rotate:pushcx
movcl,4rolbx,clmoval,blandal,0fhaddal,30h;’0’~’9’ASCII30H~39Hcmpal,3ahjlprintitaddal,7h;’A’~’F’ASCII41H~46Hprintit:movdl,almovah,2int21h
popcx
looprotate
……方法1(LOOP)2023/3/20
……
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)指令)2023/3/20例:將正數(shù)n
插入一個(gè)已整序的正數(shù)字?jǐn)?shù)組。該數(shù)組的首地址和末地址分別為ARRAY_HEAD,ARRAY_END。分析:題目要求在已經(jīng)排好序的正數(shù)數(shù)組中插入一個(gè)正數(shù)n,因此,解決問題的關(guān)鍵是找到要出入正數(shù)n的位置。需要考慮如下問題?(1)如何找到插入位置及軟件實(shí)現(xiàn)?(2)如何插入正數(shù)n及軟件實(shí)現(xiàn)?(3)數(shù)組邊界問題考慮?2023/3/20●由于數(shù)組已經(jīng)排好序,因此可以將正數(shù)n依次和數(shù)組中的數(shù)進(jìn)行比較,比較有個(gè)方向問題,這里假設(shè)數(shù)組在存儲(chǔ)單元中按地址遞增的方向從小到大依次存放。不妨從大數(shù)開始進(jìn)行比較,當(dāng)遇到第一個(gè)比n小的數(shù),記下該位置,該位置就是要插入n的位置。●找到出入位置后,如何在不破壞原來數(shù)據(jù)順序基礎(chǔ)上插入n呢?打個(gè)比方:9個(gè)同學(xué)按高矮依次做在1~10號(hào)椅子上,現(xiàn)在第10個(gè)同學(xué)按照高矮要做在第5號(hào)椅子上,那么如何空出第5號(hào)椅子呢,但仍然保持高矮次序?只要9號(hào)同學(xué)移到10號(hào),910,89,78,67,56就可以了。同樣,我們可以如法炮制,數(shù)組中將要插入數(shù)n位置前的數(shù)依次前移一個(gè)位置(兩個(gè)字節(jié)),空出要插入位置,將n放入即可?!裨诓迦霐?shù)時(shí),可能遇到特殊情況,即數(shù)n比數(shù)組中所有的數(shù)都要大,或者小。若比所有的數(shù)都大,就不需要移動(dòng)原數(shù)組中的數(shù),直接插入即可;若比所有的數(shù)都小,就將數(shù)n放在數(shù)組的首位置。2023/3/20
很顯然,查找位置和空出位置的過程就是循環(huán)比較的過程,因此采用循環(huán)結(jié)構(gòu)來實(shí)現(xiàn),那么,循環(huán)條件如何確定呢?其中一種比較容易想到循環(huán)條件就是:數(shù)組長(zhǎng)度(或數(shù)組首地址)及K<=n,其中K為依次從數(shù)組中取出的一個(gè)數(shù)。另外,可以充分利用題目中的已知條件即數(shù)組中的數(shù)均為正數(shù),所以我們可以在數(shù)組的開始的前一個(gè)位置存放一個(gè)負(fù)數(shù),不妨存放數(shù)-1,這樣,在循環(huán)控制時(shí)就不需要用數(shù)組長(zhǎng)度來進(jìn)行控制,可以進(jìn)一步簡(jiǎn)化程序的設(shè)計(jì)。而且需要注意的是,有可能一次都不需要移動(dòng)數(shù)組中的數(shù)。因此,應(yīng)選擇DO—WHILE結(jié)構(gòu)形式。2023/3/202023/3/20xdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105ndw32……movax,nmovarray_head-2,0ffffhmovsi,0compare:cmparray_end[si],axjleinsertmovbx,array_end[si]movarray_end[si+2],bxsubsi,2jmpshortcompareinsert:movarray_end[si+2],ax……35152337495265789910532-1array_headarray_endnx2023/3/20例:有數(shù)組x(x1,x2,……,x10)和y(y1,y2,……,y10),
編程計(jì)算
z(z1,z2,……,z10)z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10
邏輯尺:00110111001減法0加法2023/3/202023/3/20xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw00dch;0000,0000,1101,1100
……
movbx,0movcx,10movdx,logic_rulenext:movax,x[bx]shrdx,1jcsubtractaddax,y[bx]jmpshortresult;向前引用subtract:subax,y[bx]result:movz[bx],axaddbx,2loopnext……2023/3/20例:
將首地址為A的字?jǐn)?shù)組從小到大排序32,85,16,15,8(冒泡算法,多重循環(huán))
5.1.3多重循環(huán)
多重循環(huán)程序設(shè)計(jì)的基本方法和單重循環(huán)程序設(shè)計(jì)是一致的,應(yīng)分別考慮各重循環(huán)的控制條件及其程序?qū)崿F(xiàn),相互之間不能混淆。特別注意的是在每次通過外循環(huán)再次進(jìn)入內(nèi)循環(huán)時(shí),初始條件必須重新設(shè)置。2023/3/20冒泡法“冒泡法”是一種排序算法,不是最優(yōu)的算法,但它易于理解和實(shí)現(xiàn)冒泡法從第一個(gè)元素開始,依次對(duì)相鄰的兩個(gè)元素進(jìn)行比較,使前一個(gè)元素不大于后一個(gè)元素;將所有元素比較完之后,最大的元素排到了最后;然后,除掉最后一個(gè)元素之外的元素依上述方法再進(jìn)行比較,得到次大的元素排在后面;如此重復(fù),直至完成就實(shí)現(xiàn)元素從小到大的排序。n個(gè)數(shù)需要n-1遍比較,第一遍比較出一個(gè)最大(或最小)數(shù),第二遍對(duì)剩下的數(shù)進(jìn)行比較,得到一個(gè)次最大(或次最?。?shù),第n-1遍比較出最后兩個(gè)數(shù)的大小順序,至此整個(gè)數(shù)組全部排好序。每一遍比較需要比較的次數(shù)為要比較數(shù)減一。如n=5,第一遍比較次數(shù)為4(內(nèi)循環(huán)),第二遍比較次數(shù)為3(內(nèi)循環(huán)),第三遍比較次數(shù)為2(內(nèi)循環(huán)),第四遍比較次數(shù)為1(內(nèi)循環(huán))。2023/3/20冒泡法的排序過程序號(hào)數(shù)比較遍數(shù)1234132285316415583216158851615832851581632858151632852023/3/20movcx,5;元素個(gè)數(shù)
deccx;比較遍數(shù)loop1:movdi,cx;比較次數(shù)
movbx,0loop2:movax,A[bx];相鄰兩數(shù)
cmpax,A[bx+2];比較
jlecontinuexchgax,A[bx+2];交換位置
movA[bx],axcontinue:addbx,2looploop2
movcx,dilooploop12023/3/205.2分支程序設(shè)計(jì)分支程序根據(jù)條件是真或假?zèng)Q定執(zhí)行與否判斷的條件是各種指令,如CMP、TEST等執(zhí)行后形成的狀態(tài)標(biāo)志2023/3/205.2.1分支程序結(jié)構(gòu)形式…case1case2casen?CASE結(jié)構(gòu)
IF-THEN-ELSE結(jié)構(gòu)?2023/3/20(1)邏輯尺控制(2)條件控制(3)地址跳躍表(值與地址有對(duì)應(yīng)關(guān)系的表)5.2.2分支程序設(shè)計(jì)方法程序的分支用條件轉(zhuǎn)移指令Jxx和JMP可以實(shí)現(xiàn)分支控制;常用的控制方法有2023/3/20例:有數(shù)組x(x1,x2,……,x10)和y(y1,y2,……,y10),
編程計(jì)算
z(z1,z2,……,z10)z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10
邏輯尺:00110111001減法0加法(1)邏輯尺控制2023/3/20xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw00dch;0000,0000,1101,1100
……
movbx,0movcx,10movdx,logic_rulenext:movax,x[bx]shrdx,1jcsubtractaddax,y[bx]jmpshortresult;向前引用subtract:subax,y[bx]result:movz[bx],axaddbx,2loopnext……2023/3/20(2)條件控制datasegmentarraydw12,11,22,33,44,55,66dw77,88,99,111,222,333numberdw55low_idxdw?high_idxdw?dataends例:折半查找算法.在數(shù)據(jù)段中,有一個(gè)按從小到大順序排列的無(wú)符號(hào)數(shù)字?jǐn)?shù)組ARRAY,數(shù)組中的第一個(gè)單元存放著數(shù)組的長(zhǎng)度。在AX中有一個(gè)無(wú)符號(hào)數(shù),要求在數(shù)組中查找number,如果找到,則使CF=0,并在SI中給出該元素在數(shù)組中的偏移地址;如未找到,則使CF=1。2023/3/20121122334455667788991112223330123456789101112(ax)=55low_idx1145high_idx
12555(si)=0ahCf=0(ax)=90low_idx17789
high_idx
1212888(si)=10hCf=1折半算法2023/3/20在一個(gè)長(zhǎng)度為n的有序數(shù)組r中,查找元素k的折半查找算法可描述如下:(1)初始化被查找數(shù)組的首尾下標(biāo),low1,highn;(2)若low>high,則查找失敗,置CF=1,退出程序。否則,計(jì)算中點(diǎn)mid[(low+high)/2];(3)k與中點(diǎn)元素r[mid]比較。若k=r[mid],則查找成功,程序結(jié)束;若k<r[mid],則轉(zhuǎn)(4);若k>r[mid],則轉(zhuǎn)(5);(4)低半部分查找,highmid-1,返回(2),繼續(xù)查找;(5)高半部分查找,lowmid+1,返回(2),繼續(xù)查找。2023/3/20……
leadi,arraymovax,number;要查找數(shù)
cmpax,[di+2];(ax)與第一個(gè)元素比較
jachk_lastleasi,[di+2]jeexit;(ax)=第一個(gè)元素,找到退出
stcjmpexit;(ax)<第一個(gè)元素,未找到退出chk_last:movsi,[di];元素個(gè)數(shù)
shlsi,1;計(jì)算最后一個(gè)元素
addsi,di;的地址
cmpax,[si];(ax)與最后一個(gè)元素比較
jbsearchjeexit;(ax)=最后一個(gè)元素,找到退出
stcjmpexit
;(ax)>最后一個(gè)元素,未找到退出算法2023/3/20compare:cmpax,[bx+si]jeexitjahigher
deccxmovhigh_idx,cxjmpmidhigher:
inccxmovlow_idx,cxjmpmidno_match:stcexit:……search:movlow_idx,1movbx,[di];個(gè)數(shù)
movhigh_idx,bxmovbx,dimid:movcx,low_idxmovdx,high_idxcmpcx,dxjano_matchaddcx,dxshrcx,1movsi,cxshlsi,12023/3/20(3)地址跳躍表(值與地址有對(duì)應(yīng)關(guān)系的表)例:根據(jù)AL寄存器中哪一位為1(從低位到高位),把程序轉(zhuǎn)移到8個(gè)不同的程序分支branch_tabledwroutine1dwroutine2dwroutine3dwroutine4dwroutine5dwroutine6dwroutine7dwroutine82023/3/20
……
cmpal,0;AL為邏輯尺
jecontinue
leabx,branch_tableL:shral,1;邏輯右移
jncadd1
jmpwordptr[bx]
;段內(nèi)間接轉(zhuǎn)移add1:addbx,typebranch_table;addbx,2jmpLcontinue:……routine1
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中日技術(shù)合同(三)
- 個(gè)人房屋裝修服務(wù)合同范文大全
- 續(xù)簽合同申請(qǐng)書
- 中外合資經(jīng)營(yíng)企業(yè)合同(新能源電池制造)
- 個(gè)人合作合同:共享發(fā)展計(jì)劃
- 個(gè)人合伙經(jīng)營(yíng)合同范文詳解
- 專業(yè)鋼結(jié)構(gòu)維修改造合同范本
- 中外跨境電商合作協(xié)議合同范本
- 產(chǎn)品加工合同(輕工領(lǐng)域)
- 兩人股東權(quán)益分配合同樣本
- 流行文化對(duì)青少年價(jià)值觀的影響研究
- 中國(guó)保險(xiǎn)行業(yè)協(xié)會(huì)官方-2023年度商業(yè)健康保險(xiǎn)經(jīng)營(yíng)數(shù)據(jù)分析報(bào)告-2024年3月
- 設(shè)計(jì)質(zhì)量管理和保證措施及設(shè)計(jì)質(zhì)量管理和質(zhì)量保證措施
- 2024電力系統(tǒng)安全規(guī)定
- 小學(xué)二年級(jí)語(yǔ)文上冊(cè)閱讀理解專項(xiàng)訓(xùn)練20篇(含答案)
- 科技論文圖表等規(guī)范表達(dá)
- 高考寫作指導(dǎo)議論文標(biāo)準(zhǔn)語(yǔ)段寫作課件32張
- 2021年普通高等學(xué)校招生全國(guó)英語(yǔ)統(tǒng)一考試模擬演練八省聯(lián)考解析
- 華能火力發(fā)電機(jī)組節(jié)能降耗技術(shù)導(dǎo)則(2023年版)
- 基礎(chǔ)知識(shí)3500個(gè)常用漢字附拼音
- 企業(yè)易制毒化學(xué)品管理培訓(xùn)
評(píng)論
0/150
提交評(píng)論