【圖文】第5章循環(huán)與分支程序設(shè)計(jì)(精)_第1頁(yè)
【圖文】第5章循環(huán)與分支程序設(shè)計(jì)(精)_第2頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、匯編語(yǔ)言程序設(shè)計(jì)復(fù)合結(jié)構(gòu):多種程序結(jié)構(gòu)的組合匯編語(yǔ)言程序設(shè)計(jì)循環(huán)程序結(jié)構(gòu)匯編語(yǔ)言程序設(shè)計(jì)程序的分支一般用條件轉(zhuǎn)移指令來(lái)產(chǎn)生,控制條件是關(guān)鍵。可以釆 用以下幾種方式:(1)條件控制(2)邏輯尺控制(3)地址跳躍表(值與地址有對(duì)應(yīng)關(guān)系的表)初始化1計(jì)數(shù)控制:循環(huán)次數(shù)已知2特征值控制: 次數(shù)已知,提前結(jié)束3地址邊界控制:循環(huán)次數(shù)循環(huán)的工作部分及修改部分DO-WHILEDO-UNTIL結(jié)構(gòu)CASE結(jié)構(gòu)循環(huán)體5.2 分支程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)、循環(huán)指令LOOP/ 計(jì)算0+1+2+3+4+5+6+7+8+9的值int sum=0;/川)+1+小+4+() )+7 怎帀?7movax,沖相當(dāng)于for(in

2、t i=0;i10;i+)mov嘰芻相當(dāng)于二 jsum=sum+i;mov ex,10s: add ax,bxI標(biāo)號(hào)s代表bx一個(gè)地址Sop sr 判斷 |匯編語(yǔ)言程序設(shè)計(jì)Loop指令指令的格式是:loop標(biāo)號(hào)CPU執(zhí)行l(wèi)oop指令的時(shí)候,要進(jìn)行兩步操作: 一(cx)=(cx)-l;判斷CX中的值,不為零則轉(zhuǎn)至標(biāo)號(hào)處執(zhí)行程序, 如果為零則向下執(zhí)行,退出循環(huán)。CX中的值影響著loop指令的執(zhí)行結(jié)果。用loop指令來(lái)實(shí)現(xiàn)循環(huán)功能時(shí),CX中要存放循環(huán)次數(shù)??梢?jiàn),匯編語(yǔ)言程序設(shè)計(jì)例3 80:求首地址為ARRAY的M個(gè)字之和(不考慮溢出),結(jié)果存入TOTAL (ARRAY和TOTAL都被定義為字變量)M

3、OVCX,MOVAX,0 _ 1MOVSI,寄存器相:AGAIN:ADDAX,ARRAYSIADDSI,2LOOPAGAINMOVTOTAL,AX匯編語(yǔ)言程序設(shè)計(jì)例:編制程序?qū)⒋娣旁谑椎刂窞锳RRAY的字符串happy new向高地址方向移動(dòng)一個(gè)字節(jié)的位置data segmentarray db happy new year9dataendscode segmentassume cs:codc9ds:datastart: mov axdatamov ds9axmov ax94c00hint 21hcode endsend startmovex,14;設(shè)置循環(huán)次數(shù)movbx,13;初始化匯編語(yǔ)言

4、程序設(shè)計(jì)二、可提前結(jié)束的循環(huán)指令功能格式當(dāng)為 0 或相等時(shí)循環(huán) LOOPZ / LOOPE 標(biāo)號(hào)不為 0 或不相等循環(huán) LOOPNZ / LOOPNE 標(biāo)號(hào)ZF=O 且( (CX) /0執(zhí)行步驟:(1)(CX) JNB (JAEJNC)OPRCF = 0;沒(méi)有借位JA (JNBE)OPRCF V ZF = O適用于地址或雙精度數(shù)低位字的比較匯編語(yǔ)言程序設(shè)計(jì)無(wú)符號(hào)數(shù)比較cmp axbx如果(ax) = (bx) Ml(ax)-(bx)=O,所以:ZF=1;如果(ax) (bx)則(ax)-(bx) =0,所以:ZF=O;如果(ax)(bX)則(ax)-(bx)將產(chǎn)生借位,所以,CF=1;如果(a

5、x)孑(bx)則(ax) - (bx) 必借位,所以:CF=O;如果(ax)Xbx)則 Qx) -(bx)既不必借位,結(jié)果又不為 0,所以:CZ0 并且 ZF = 0;如果(ax) (bx)則(ax)-(bx)既可能借位,結(jié)果可能為 0,所以:CF=1 或 ZF=1匯編語(yǔ)言程序設(shè)計(jì)cmp 指令對(duì)有符號(hào)數(shù)的比較(1)如果SF=1,而OF=0, (ah)(bh)OF=0,說(shuō)明沒(méi)有溢出,邏輯上真正結(jié)果的正負(fù)=實(shí) 際結(jié)果的正負(fù);SF=1表示實(shí)際結(jié)果為負(fù),所以邏 輯上真正的結(jié)果為負(fù),所以(ah)v(bh)。(2)如果SF=O,而OF=1 , (ah)(bh)OF=1 ,說(shuō)明有溢出,邏輯上真正結(jié)果的正負(fù)工

6、實(shí)際 結(jié)果的正負(fù);SF=O表示由于溢出導(dǎo)致了實(shí)際結(jié)果 非負(fù),那么邏輯上真正的結(jié)果必然為負(fù)。這樣,SF=O, OF = 1 ,說(shuō)明了(ah)(bh)OF=0,說(shuō)明沒(méi)有溢出,邏輯上真正結(jié)果的正負(fù)=實(shí)際 結(jié)果的正負(fù);SF=O表示實(shí)際結(jié)果非負(fù),所以邏輯上真 正的結(jié)果必然非負(fù)。所以(ah)(bh)o(4)如果SF=1,而OF=1, (ah)(bh)OF=1 ,說(shuō)明有溢出,邏輯上真正結(jié)果的正負(fù) M 實(shí)際結(jié) 果的正負(fù);SF=1表示由于溢出導(dǎo)致了實(shí)際結(jié)果為負(fù), 那么邏輯上真正的結(jié)果必然為正。這樣,SF=1, OF = 1 ,說(shuō)明了(ah)(bh)o(3)比較兩個(gè)帶符號(hào)數(shù),并根據(jù)比較結(jié)果轉(zhuǎn)移的指令JNL (JG

7、E) OPRJG (JNLE) OPR*適用于帶符號(hào)數(shù)的比較 測(cè)試CX的值為0則轉(zhuǎn)移的指令 格式 測(cè)試條件JCXZ OPR(CX)=O匯編語(yǔ)吉程序設(shè)計(jì)比較字 X,Y,如果 X50,轉(zhuǎn)到 TOO.HIGH;否則先做 X Y ,如果溢出轉(zhuǎn)到OVERFLOW,否則 IX-YI RESULToMOVAX, XCMPAXf50siTOO_HIGHSUBAX, YJOOVERFLOWJNS|NONNEGNEGAXNONNEG:MOVRESULT, AXTOO_HIGH:OVERFLOW:格式測(cè)試條件V JL(JNGESFVOF=1SFVOF=0(SFVOF)VZF= 1(SFVOF) V ZF = O匯編

8、語(yǔ)言程序設(shè)計(jì)一條循環(huán)指令可以用修改循環(huán)計(jì)數(shù)和判斷轉(zhuǎn)移條 件的匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)B、7C、 11 D、 3匯編語(yǔ)言程序設(shè)計(jì)兩條指令替代思考題:對(duì)于如下程序mov ax,2 mov cx,3 s: add ax,2 si:loop smov di,offset si mov si,offset s3 mov ax9cs:di mov cs:si9ax mov ax9l mov ex,3 s2: addax,2 s3: nopnop所有指令執(zhí)行完后 ax 的值為A. 15codesg segmentstart:.codesg ends end start匯編語(yǔ)言程序設(shè)計(jì):問(wèn)題分析在 d

9、atasg 中定義了 6 個(gè)字符串,每個(gè)長(zhǎng)度為 16 字節(jié)。(注意,為 了直觀,毎個(gè)字符串的后面都加上了空格符,以使它們的長(zhǎng)度剛好 為 16 字節(jié))。datasg 中的數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)如圖:因?yàn)樗鼈兪沁B續(xù)存放的,我們可以將這 6 個(gè)字符串看成一個(gè) 6 行 16 列的 二維數(shù)組。問(wèn)題編程,將datasg段中每 個(gè)單詞的頭一個(gè)字母改為 大寫(xiě)字母。assumecs:codesgds:datasgdatasgsegmentdb4l.file4; 16 個(gè)字節(jié)匯編語(yǔ)言程序設(shè)計(jì)我們用bx作變量,定位每行的起始地址,用3定位要修改的列,用寄存器相對(duì)尋址的方式來(lái)對(duì)目標(biāo)單元進(jìn)行尋址,mov axdatasgmov

10、 ds9axmov bx,0;指向第一行mov cx s: mov alJbx+3sub al,20h;小寫(xiě)字母改為大寫(xiě)mov bx+3aladd bx,16;指向下一行l(wèi)oop s匯編語(yǔ)言程序設(shè)計(jì)assume cs: codesgds:datasg datasg segmentdb *ibm*db decdb dos*db *vaxdatasg endscodesg segmentstart:.codesg endsend start程序如下:問(wèn)題編程:將datasg段中每個(gè)單詞都改為大寫(xiě)字母。匯編語(yǔ)言程序設(shè)計(jì)問(wèn)題分析在datasg中定義了4個(gè)字符串,每個(gè)長(zhǎng)度為16字節(jié)。datasg中數(shù)據(jù)的

11、存儲(chǔ)結(jié)構(gòu)如圖:我們需要修改每一個(gè)單詞,即二維數(shù)組的每一行的前3列。匯編語(yǔ)言程序設(shè)計(jì)算法描述:R=第一行的地址movaxdatasg設(shè)置外循匯編語(yǔ)言程序設(shè)計(jì)sO: C=第一列的地址設(shè)置內(nèi)循環(huán)次數(shù)s:改變(R行,C列)的 字母為大寫(xiě)0下一列的地址;loop SR=下一行的地址loop sO程序有沒(méi)有問(wèn)題?movex,4汐卜循環(huán)次數(shù)sO:movsi,0;列地址movex,3;內(nèi)循環(huán)次數(shù)inc si;改變列地址addbx,16;改變行地址匯編語(yǔ)言程序設(shè)計(jì)在多重循環(huán)的程序結(jié)構(gòu)中,CX計(jì)數(shù)器的保存和恢復(fù)匯編語(yǔ)言程序設(shè)計(jì)常用的 DOS 調(diào)用:鍵盤(pán)輸入,顯示輸出:從鍵盤(pán)輸入一個(gè)字符并回顯在屏幕上MOV AH,

12、 01;DOS 功能號(hào)丄:鍵盤(pán)輸入并回顯INT 21H; DOS 調(diào)用類(lèi)型 21H:(AL)=字符的 ASCII 碼:輸出一個(gè)字符到屏幕上;調(diào)用參數(shù):輸出字符二(DL);DOS 功能號(hào) 2:顯示一個(gè)字符;DOS 調(diào)用類(lèi)型 21H;輸出字符串顯示在屏幕上MOV DX, OFFSET MESSAGE;DS:DX=$地址(車(chē)必須以$結(jié)束)MOV AH, 9; DOS 功能號(hào) 9:顯示字符串INT 21HMOVII:AGAIN:POPLOOPCX, MCXCX, NNEXTCXAGAINMOVDI,M:ILOOP NEXT JIDECDIIIMOVDL, AMOVAH, 02匯編語(yǔ)言程序設(shè)計(jì)邏輯運(yùn)算指

13、令邏輯非指令:執(zhí)行操作:NOT OPR (OPR) - i(OPR)* OPR 不能為立即數(shù)*不影響標(biāo)志位AND DST, SRC (DST) - (DST)A(SRC)OR DST, SRC(DST) CFOF SFZF PF測(cè)試指令:執(zhí)行操作:TESTOPR1,根據(jù)運(yùn)算結(jié)果設(shè)置和 0 與為 0;和 1 訂、不變1兩位AND1111110 0申OR001000和 0異或不變;和 異或變反例: 使AL的第0、* * * *XOR測(cè)試某些 AND 0000 000 10000 0 0 0ANDAL,OR AL, 20H匯編語(yǔ)言程序設(shè)計(jì)例:TESTAL, 1JZ廠相與結(jié)果為o,第0位為CF邏輯右移

14、SHR OPR, CNT算術(shù)左移SAL OPR, CNT(同邏輯左移)算術(shù)右移SAR OPR, CNT用高位填號(hào)匯編語(yǔ)言程序設(shè)計(jì)循環(huán)左移ROL OPR, CNT帶進(jìn)位循環(huán)左移RCL OPR, CNT0帶進(jìn)位循環(huán)右移RCR OPR,匯編語(yǔ)言程序2、移位指令邏輯左移移出位補(bǔ) 0CF循環(huán)右移ROR OPR, CNT補(bǔ)空出的位。不能用立即空出的位,移出的CF匯編語(yǔ)言程序設(shè)計(jì)4注意:* OPR可用除立即數(shù)以外的任何尋址方式移位次數(shù)CNT=1, SHL OPR, 1 CNT1, MOV CL, CNTSHL OPR, CL*條件標(biāo)志位:CF 二移入的數(shù)值OF= 1 CNT=10t,最高有效位的值發(fā)生變化0

15、 CNT=10t,最高有效位的值不變循環(huán)移位指令:不影響 SF、ZF、PF、AF移位指令:常用來(lái)作乘以 2 或除以 2 的操作.SAL:有符號(hào)數(shù)乘以 2, SAR有符號(hào)數(shù)除以 2; SHL 無(wú)符號(hào)數(shù)乘以 2, SHR:無(wú)符號(hào)數(shù)除以 2 匯編語(yǔ)言程序設(shè)計(jì)例5 1:把BX中的二進(jìn)制數(shù)以十六進(jìn)制的形式顯示在屏幕上匯編語(yǔ)言程序設(shè)計(jì)HMOVCX,4movch, 4;設(shè)置循環(huán)次數(shù)|Pl SHCX|rotate:r movCl , 4;設(shè)置移位位數(shù)I rolbx, cl;循環(huán)左移 4 位r moval, bl;取低 8 位-andal, Ofh;保留低 4 位 addal, 30h;ASCII30H39Hc

16、mpal, 3ahjlpri nti t;判斷是否為字母,不是則跳轉(zhuǎn)addal, 7h;ASCII41H-46Hpri nti t:movdl, almovah, 2H nt21h;調(diào)用功能號(hào) 2,顯示一個(gè)字符| POP( XdecchOOProta1!jnzrotate匯編語(yǔ)言程序設(shè)計(jì)例5 4:將正數(shù)n插入一個(gè)已整序的正數(shù)字?jǐn)?shù)組x dwarray.head dw array.end dw ndwmov ax, nmov array.head-2, Offffhmov sit0compare:cmp array.end si, axJle insertmov bx, array.end sim

17、ov array_end si+2, bx sub si92Jmp short compare insert:mov array.end si+2, ax?3,5,15,23,37,49,52,65,78,9匯編語(yǔ)言程序設(shè)計(jì)例5.5:有數(shù)組x(xl,x2,xlO)和y(yl,y2,y 10),編程計(jì)算z(zl,z2tfzl0)Z1 =xl+yiz2 =x2+y2z3 -x3y3z4 =x4y4邏輯尺:0011011100z5 =x5y51減法z6 =x6+y60加法z7 =x7y7z8 =x8y8z9 =x9+y9zl0=xlO+ylO匯編語(yǔ)言程序設(shè)計(jì)x dwy dw z dw logic_r

18、uledwxl,x2,x3,x4,x5,x6,x7,x8,x9,xlOyl,y2,y3,y4,y5,y6,y7,y8,y9,yl0zl,z2,z3,OOdchz4,z5,z6,z7,z8,z9,zlO ;0000,0000,1101,1100movbx, 0;初始化寄存器movex, 10;設(shè)置循環(huán)次數(shù)movdx9logic.rule;取得邏輯尺next:movax, xbxshrdx, 1;邏輯尺右移 1位,標(biāo)志位進(jìn)入 CFsubtract;CF=1 做減法addax, ybx:CF=O 做加法jmpshort result;向前引用subtract:subax, ybx;執(zhí)行減法操作result: movzbx, ax:存入結(jié)果addbx92:改變地址loopnext匯編語(yǔ)言程序設(shè)計(jì)例5.10:根據(jù)AL寄存器中哪一位為1(從低位到高位),把程序轉(zhuǎn)移到8個(gè)不同的程序分支branch_table dw dwdw dw dw dw dw dw匯編語(yǔ)言程序設(shè)計(jì)(寄存器間接尋址)al, 0;AL為邏輯尺conti nue;(AL)=O不處理bx, branch_table;取得跳躍表首地址al, 1;邏輯右移addl;CF=O跳轉(zhuǎn)wo rd ptr bx;段內(nèi)間接轉(zhuǎn)移bx, type branch_table;add bx,2r

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論