第七章 分支與轉(zhuǎn)移程序_第1頁(yè)
第七章 分支與轉(zhuǎn)移程序_第2頁(yè)
第七章 分支與轉(zhuǎn)移程序_第3頁(yè)
第七章 分支與轉(zhuǎn)移程序_第4頁(yè)
第七章 分支與轉(zhuǎn)移程序_第5頁(yè)
已閱讀5頁(yè),還剩81頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第七章順序 分支 循環(huán)程序設(shè)計(jì)通過(guò)這一章的學(xué)習(xí) 主要掌握各種轉(zhuǎn)移指令或者循環(huán)指令的使用方法 能夠在程序中使用各種程序結(jié)構(gòu) 掌握匯編語(yǔ)言程序設(shè)計(jì)的完整步驟 要求能夠上機(jī)調(diào)試程序 目的和要求 主要掌握各種轉(zhuǎn)移指令或者循環(huán)指令的使用方法 能夠在程序中使用各種程序結(jié)構(gòu) 掌握匯編語(yǔ)言程序設(shè)計(jì)的完整步驟 要求能夠上機(jī)調(diào)試程序 7 1 1匯編語(yǔ)言程序的設(shè)計(jì)步驟 選擇算法 決定解決問題的總體思路 最后確定為計(jì)算機(jī)可以執(zhí)行各種算法 繪制流程圖 對(duì)于編寫較大的程序 這一個(gè)步驟是很有效的 把算法思想具體化為圖形表示 這使以后編制的程序結(jié)構(gòu)更加清晰 更不容易出現(xiàn)邏輯錯(cuò)誤 3 編制程序 根據(jù)流程圖寫程序 確定程序中的段結(jié)構(gòu) 以及具體使用的指令和偽指令 源程序文件必須以 ASM 作為后綴名 否則匯編程序會(huì)拒絕匯編該源程序 4 匯編過(guò)程 使用匯編程序MASM EXE對(duì)源程序進(jìn)行匯編 生成目標(biāo)代碼 如果檢查出語(yǔ)法錯(cuò)誤 那么返回到第三步修改源程序 直到?jīng)]有語(yǔ)法錯(cuò)誤為止 連接過(guò)程 需要使用連接程序LINK EXE把匯編程序匯編得到的目標(biāo)代碼文件 OBJ 為后綴 轉(zhuǎn)變?yōu)榭蓤?zhí)行文件 EXE 為后綴 如果有多個(gè)OBJ文件 就需要把它們連接在一起成為一個(gè)EXE文件 6 調(diào)試過(guò)程 得到可執(zhí)行文件以后就要進(jìn)行程序調(diào)試 這是開發(fā)周期中花費(fèi)時(shí)間最長(zhǎng)的一個(gè)過(guò)程 使用DEBUG EXE調(diào)試程序 觀察程序的執(zhí)行結(jié)果是否正確 如果發(fā)現(xiàn)邏輯錯(cuò)誤 就回到第三步重復(fù)上面的編制 匯編 連接過(guò)程 7 1 2程序的基本結(jié)構(gòu)匯編語(yǔ)言程序和高級(jí)語(yǔ)言程序的基本程序結(jié)構(gòu)一樣 分為三種 順序結(jié)構(gòu) 分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu) 通過(guò)三種基本結(jié)構(gòu)的組合和嵌套 又可以形成更復(fù)雜的程序結(jié)構(gòu) 基本程序結(jié)構(gòu)又可以有一些變種 在匯編語(yǔ)言中主要使用5種結(jié)構(gòu) 其中 1 2 4 是基本結(jié)構(gòu) 3 5 是變種 注意流程圖中的符號(hào) 學(xué)會(huì)畫流程圖 7 2順序結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)是最簡(jiǎn)單的程序流程 指令按照在內(nèi)存中的地址順序依次被執(zhí)行 沒有任何的流程改變現(xiàn)象 例7 2 1計(jì)算Z 3X Y 5 2 1 數(shù)據(jù)分析 表達(dá)式中有三個(gè)變量X Y Z 可以使用三個(gè)內(nèi)存單元來(lái)表示 題目沒有指明變量的變化范圍 使用字節(jié) 字為單位都可以 教材中是以字為單位 2 算法分析 3X 2X X一條移位指令和一條加法指令可以實(shí)現(xiàn)3X Y 5 一條加法指令和一條減法指令可以實(shí)現(xiàn) 3X Y 5 2 除以2可以使用右移指令實(shí)現(xiàn)總體上程序應(yīng)該為順序結(jié)構(gòu) 按照表達(dá)式規(guī)定的順序使用加法 減法 移位指令相結(jié)合可以實(shí)現(xiàn)要求的全部運(yùn)算 3 繪制流程圖并寫出相關(guān)程序主體 開始 計(jì)算2X X 計(jì)算3X Y 5 計(jì)算 3X Y 5 2 結(jié)束 MOVAX VARXSHLAX 1ADDAX VARX ADDAX VARYSUBAX 5 SARAX 1MOVVARZ AX 4 選擇一種程序框架 把程序主體添加到框架中就可以完成整個(gè)源程序的編制過(guò)程 5 匯編過(guò)程 使用MASM EXE匯編工具對(duì)源程序文件 ASM文件 進(jìn)行匯編 檢查有沒有語(yǔ)法錯(cuò)誤 如果有就進(jìn)入編輯器進(jìn)行修改 最后 生成目標(biāo)代碼文件 OBJ文件 6 連接過(guò)程 使用LINK EXE連接工具把OBJ文件組織為真正的可執(zhí)行文件 EXE文件 7 使用DEBUG調(diào)試可執(zhí)行程序 觀察程序中有沒有邏輯錯(cuò)誤 如果有就進(jìn)入編輯器進(jìn)行修改 直到程序運(yùn)行結(jié)果無(wú)誤為止 7 3分支程序設(shè)計(jì)分支結(jié)構(gòu)在程序流程中是最常用的一種 任何實(shí)用的程序都需要對(duì)計(jì)算結(jié)果或某些必要的測(cè)試條件進(jìn)行判斷 根據(jù)判斷的邏輯結(jié)果來(lái)決定是否改變程序執(zhí)行的流程 匯編語(yǔ)言中 實(shí)現(xiàn)分支結(jié)構(gòu)的指令是轉(zhuǎn)移類指令 這類指令可以通過(guò)修改CS和IP的內(nèi)容來(lái)改變程序執(zhí)行的流程 其實(shí) 程序中的很多循環(huán)結(jié)構(gòu)也是通過(guò)轉(zhuǎn)移指令來(lái)實(shí)現(xiàn)的 因?yàn)檠h(huán)結(jié)構(gòu)就是分支結(jié)構(gòu)的一種特例 7 3 1轉(zhuǎn)移指令轉(zhuǎn)移指令分為無(wú)條件和條件兩種 無(wú)條件轉(zhuǎn)移指令一定會(huì)改變程序執(zhí)行的流程 改變下一條將要執(zhí)行的指令地址 條件轉(zhuǎn)移指令則會(huì)對(duì)特定的標(biāo)志位進(jìn)行判斷 如果標(biāo)志位的狀態(tài)滿足條件 那么它會(huì)改變程序執(zhí)行的流程 如果不滿足條件 那么不會(huì)改變程序的流程 兩種轉(zhuǎn)移指令的功能都不可忽視 在程序中都是經(jīng)常使用的 一 無(wú)條件轉(zhuǎn)移指令指令格式 JMP目標(biāo)地址功能 無(wú)條件的修改IP或者CS IP中的內(nèi)容 改變下一條將要執(zhí)行的指令地址 即跳轉(zhuǎn)到目標(biāo)地址繼續(xù)執(zhí)行程序 標(biāo)志位影響 無(wú) JMPL1MOVAX 0 L1 MOVAX 0FFFFH 按照正常的執(zhí)行流程 執(zhí)行完JMPL1指令以后 應(yīng)該執(zhí)行MOVAX 0指令 但是由于程序執(zhí)行流程已經(jīng)改變到L1標(biāo)號(hào)指明的地址 所以下一條將要執(zhí)行的指令變成了MOVAX 0FFFFH指令 JMP指令的轉(zhuǎn)移類型分為兩種 段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移 1 段內(nèi)轉(zhuǎn)移JMP指令本身和目標(biāo)地址在同一個(gè)代碼段內(nèi) 這種轉(zhuǎn)移只需要修改IP的內(nèi)容 而不需要改變CS的內(nèi)容 1 段內(nèi)直接轉(zhuǎn)移格式 JMP標(biāo)號(hào)機(jī)器指令的格式由兩部分構(gòu)成 OPCODE和DISP OPCODE是操作碼 DISP是一個(gè)8位或16位的補(bǔ)碼DISP表示的含義是標(biāo)號(hào)地址相對(duì)于JMP指令的字節(jié)距離 DISP 標(biāo)號(hào)偏移量 JMP指令偏移量上面這個(gè)表達(dá)式的計(jì)算是匯編程序在匯編過(guò)程中完成的 如果沒有匯編語(yǔ)言 直接使用機(jī)器指令編程 那么DISP的計(jì)算就必須由程序員來(lái)完成 標(biāo)號(hào)地址 JMP指令地址 DISP 0標(biāo)號(hào)地址 JMP指令地址 DISP 0功能 IP IP DISP IP DISP注意這個(gè)加法 這是兩個(gè)補(bǔ)碼的加法 DISP可以是正數(shù) 也可以是負(fù)數(shù) 但是 IP 總是理解為正數(shù) 把第16位 超出字的范圍 理解為符號(hào)位 IP 的第16位總是理解為0 DISP的第16位由它自己的符號(hào)位決定 舉例 IP 1100101001101011DISP 11100110 IP DISP 01100101001101011 1111111111110011001100101001010001注意 相加的結(jié)果總是一個(gè)正數(shù) 補(bǔ)碼加法完畢以后應(yīng)當(dāng)重新把 IP 看作無(wú)符號(hào)數(shù) 段內(nèi)直接轉(zhuǎn)移在機(jī)器指令中又可以分為短跳轉(zhuǎn)和長(zhǎng)跳轉(zhuǎn)兩種情況 指令中的DISP字段是由匯編程序在匯編過(guò)程中計(jì)算并生成的 如果匯編程序計(jì)算出的DISP在 128 127范圍內(nèi) 那么生成的DISP只有一個(gè)字節(jié) 這種情況稱為短跳轉(zhuǎn) 如果DISP超過(guò)了 128 127這個(gè)范圍 那么生成的DISP字段將在指令中占用一個(gè)字 這種情況稱為長(zhǎng)跳轉(zhuǎn) 轉(zhuǎn)移范圍為 32768 32767 段的最大空間就是65536字節(jié) 長(zhǎng)跳轉(zhuǎn)已經(jīng)可以在整個(gè)代碼段中任意的實(shí)現(xiàn)轉(zhuǎn)移 2 段內(nèi)間接轉(zhuǎn)移JMP指令針對(duì)的目標(biāo)偏移量存放在16位的通用寄存器或字內(nèi)存單元中 指令格式 JMP通用寄存器名稱JMP字內(nèi)存單元功能 IP 通用寄存器 IP EA 例子 JMPBX功能 IP BX JMPWORDPTR SI 功能 IP DS SI 注意直接段內(nèi)轉(zhuǎn)移和間接段內(nèi)轉(zhuǎn)移的區(qū)別 直接段內(nèi)轉(zhuǎn)移 由機(jī)器指令的DISP字段給出目標(biāo)地址相對(duì)于JMP指令的帶符號(hào)字節(jié)距離 完成的功能是 IP IP DISP 間接段內(nèi)轉(zhuǎn)移 由16位通用寄存器或字內(nèi)存單元直接給出IP寄存器新的內(nèi)容 段內(nèi)間接尋址方式 JMPWORDPTRVARJMPWORDPTR BX 舉例 如果BX 100H 100H 4100H分析執(zhí)行下面指令后 指令地址分別 JMPBXJMP BX 2 段間轉(zhuǎn)移標(biāo)號(hào)地址和JMP指令本身不在同一個(gè)代碼段內(nèi) 這類轉(zhuǎn)移必須同時(shí)修改CS和IP的內(nèi)容 才能完成正確的轉(zhuǎn)移操作 1 段間直接轉(zhuǎn)移指令格式 JMPFAR類型的標(biāo)號(hào)JMPFARPTR標(biāo)號(hào)第二種格式是強(qiáng)制指定標(biāo)號(hào)的臨時(shí)類型屬性為FAR 無(wú)論該標(biāo)號(hào)定義時(shí)是什么類型 在這里一定作為FAR類型來(lái)引用 機(jī)器指令中除了OPCODE字段外 還有兩個(gè)16位的字段 分別表示目標(biāo)地址的偏移量和段基值 功能 IP 目標(biāo)地址偏移量CS 目標(biāo)地址段基值同時(shí)修改CS IP中的內(nèi)容 實(shí)現(xiàn)段間轉(zhuǎn)移 下圖給出的是段間直接轉(zhuǎn)移指令機(jī)器碼示意圖 執(zhí)行時(shí)把偏移量送給IP 段基址送給CS 即可實(shí)現(xiàn)段間直接轉(zhuǎn)移 2 段間間接轉(zhuǎn)移這種轉(zhuǎn)移方式所使用的目標(biāo)地址只能是存放在雙字內(nèi)存單元中的內(nèi)容 指令格式 JMPDWORDPTR雙字單元起始偏移量功能 IP EA CS EA 2 例子 ADR1DDL1 JMPDWORDPTRADR1功能 實(shí)現(xiàn)段間轉(zhuǎn)移 目標(biāo)地址為L(zhǎng)1標(biāo)號(hào)所在的位置 它對(duì)應(yīng)的邏輯地址存放在ADR1雙字單元中 例子 JMPDWORDPTR BX DI 雙字單元有效地址 EA BX DI 采用基址變址尋址方式 功能 IP EA CS EA 2 二 條件轉(zhuǎn)移指令統(tǒng)一的匯編格式 JXX目標(biāo)地址功能 根據(jù)前一條指令所影響或設(shè)置的某些標(biāo)志位狀態(tài)作為判斷條件 當(dāng)條件滿足時(shí) 把程序流程轉(zhuǎn)移到指定的目標(biāo)地址 當(dāng)條件不滿足時(shí) 不改變程序流程 CPU會(huì)順序執(zhí)行下一條指令 標(biāo)志位影響 無(wú) 只使用標(biāo)志位作為判斷條件 不會(huì)去修改它 條件轉(zhuǎn)移指令的機(jī)器指令格式 總是占用2個(gè)字節(jié) 前一個(gè)字節(jié)是OPCODE 后一個(gè)字節(jié)是帶符號(hào)的相對(duì)位移量 DISP 由于在條件轉(zhuǎn)移指令中 DISP僅8位 那么跳轉(zhuǎn)范圍一定是 128 127字節(jié) 只能是短跳轉(zhuǎn) 這一點(diǎn)對(duì)于所有條件轉(zhuǎn)移指令來(lái)說(shuō)都是一樣的 如果需要條件轉(zhuǎn)移的轉(zhuǎn)移范圍得到擴(kuò)大 那么必須結(jié)合使用無(wú)條件轉(zhuǎn)移 因?yàn)橹挥袩o(wú)條件轉(zhuǎn)移指令提供長(zhǎng)跳轉(zhuǎn)和段間轉(zhuǎn)移 注意 在執(zhí)行條件轉(zhuǎn)移指令前 一般需要執(zhí)行一條算術(shù)運(yùn)算指令或邏輯運(yùn)算指令對(duì)特定標(biāo)志位產(chǎn)生有意義的影響 根據(jù)條件轉(zhuǎn)移指令所判斷的標(biāo)志位可以把它們分為三類 單條件轉(zhuǎn)移 無(wú)符號(hào)數(shù)條件轉(zhuǎn)移 有符號(hào)數(shù)條件轉(zhuǎn)移 條件轉(zhuǎn)移指令是用于實(shí)現(xiàn)分支和循環(huán)結(jié)構(gòu)的基礎(chǔ) 但是程序的結(jié)構(gòu)卻是程序員可以自由選擇的 左邊的圖為非結(jié)構(gòu)化的分支結(jié)構(gòu) 右邊為結(jié)構(gòu)化的 在非結(jié)構(gòu)化的分支結(jié)構(gòu)中 每一個(gè)分支的出口可能不一樣 如果要分析這一個(gè)分支結(jié)構(gòu) 那么必須在源程序中找到所有分支的出口 如果要調(diào)試它 那么需要在每一個(gè)出口都設(shè)置斷點(diǎn) 或者單步跟蹤每一個(gè)出口 非結(jié)構(gòu)化的分支會(huì)造成程序的可讀性下降 調(diào)試難度加大 如果采用結(jié)構(gòu)化的分支 那么所有分支的出口都是一致的 程序的分析和調(diào)試都非常方便 只需要注意一個(gè)出口 在程序設(shè)計(jì)中應(yīng)該養(yǎng)成結(jié)構(gòu)化編程的習(xí)慣 1 單條件轉(zhuǎn)移指令這一類條件轉(zhuǎn)移指令只對(duì)某一個(gè)標(biāo)志位的狀態(tài)進(jìn)行判斷 并決定是否進(jìn)行轉(zhuǎn)移 1 單標(biāo)志位轉(zhuǎn)移單標(biāo)志位轉(zhuǎn)移指令總共有5對(duì) 能對(duì)5個(gè)標(biāo)志位 CF ZF SF OF PF各自的狀態(tài)進(jìn)行判斷 例7 3 1編寫一段程序判斷兩個(gè)字節(jié)變量DB1和DB2的內(nèi)容是否相同 如果相同則把AL清0 否則置全1 教材上的程序片段 MOVAL DB1CMPAL DB2JZL1MOVAL 0FFHJMPL2 無(wú)條件轉(zhuǎn)移對(duì)于實(shí)現(xiàn)分支結(jié)構(gòu)也是必不可少的L1 MOVAL 00HL2 MOVAH 4CHINT21H注意分析 上面的條件轉(zhuǎn)移有什么樣的缺陷 如果JZL1指令和L1標(biāo)號(hào)之間的字節(jié)距離超過(guò)127 那么在匯編過(guò)程中就會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤 從上面的例子可以看出 條件轉(zhuǎn)移指令不適合直接用于距離較遠(yuǎn)的轉(zhuǎn)移 一般來(lái)說(shuō) 應(yīng)該結(jié)合無(wú)條件轉(zhuǎn)移指令在分支結(jié)構(gòu)中實(shí)現(xiàn)長(zhǎng)距離轉(zhuǎn)移 就上面的例子 我們通過(guò)它的流程圖來(lái)得到合理的源程序 根據(jù)流程圖寫出相關(guān)程序主體 CMPAL DB2JZL1JMPL2 MOVAL DB1 Y L1 N L2 L3 L1 MOVAL 0JMPL3 L2 MOVAL 0FFH L3 MOVAH 4CHINT21H 按照這種規(guī)則設(shè)計(jì)的分支結(jié)構(gòu)中 所有長(zhǎng)距離的流程轉(zhuǎn)移都是由無(wú)條件轉(zhuǎn)移指令實(shí)現(xiàn)的 避免了直接使用條件轉(zhuǎn)移指令作長(zhǎng)跳轉(zhuǎn) 在今后的程序設(shè)計(jì)中 需要逐漸養(yǎng)成這樣的編程習(xí)慣 對(duì)匯編語(yǔ)言進(jìn)一步熟悉之后 在編制一些小程序或者程序片段的時(shí)候 可以跳過(guò)流程圖繪制這一步 直接進(jìn)行程序的編制 2 另一種單條件轉(zhuǎn)移指令格式 JCXZ目標(biāo)地址功能 判斷 CX 是否等于0 如果等于0 則跳轉(zhuǎn)到目標(biāo)地址 否則順序執(zhí)行下一條指令 這一條指令主要用于和循環(huán)指令配合使用 以實(shí)現(xiàn)程序中循環(huán)結(jié)構(gòu) 因?yàn)檠h(huán)指令就是使用CX寄存器作為計(jì)數(shù)器實(shí)現(xiàn)計(jì)數(shù)循環(huán)的 在講到循環(huán)指令的時(shí)候 我們會(huì)詳細(xì)說(shuō)明這條指令的具體用途 注意 JCXZ是對(duì) CX 進(jìn)行判斷 而不是使用ZF標(biāo)志位 看下面的程序片段 MOVAX 34HMOVCX 34HCMPCX AXJCXZL1 L1 程序中 JCXZ指令并不會(huì)跳轉(zhuǎn)到L1 因?yàn)?CX 不等于0 ZF標(biāo)志的取值并不會(huì)影響它的判斷 提問 1 轉(zhuǎn)移指令的實(shí)質(zhì) 2 轉(zhuǎn)移指令目的操作數(shù) 3 直接轉(zhuǎn)移和間接轉(zhuǎn)移的區(qū)別 4 段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移的區(qū)別 5 轉(zhuǎn)移指令的尋址方式有哪些 2 無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令這是一組指令 用于對(duì)兩個(gè)無(wú)符號(hào)數(shù)比較的結(jié)果進(jìn)行判斷 從而決定是否進(jìn)行程序的流程轉(zhuǎn)移 使用前提 使用這組指令之前 要保證上一條被執(zhí)行的指令是CMP指令 并且程序員把兩個(gè)參與比較的操作數(shù)看作無(wú)符號(hào)數(shù) 這組指令在邏輯上把CMP指令的目的操作數(shù)稱為A數(shù)據(jù) 把源操作數(shù)稱為B數(shù)據(jù) 通過(guò)CF標(biāo)志和ZF標(biāo)志的狀態(tài)來(lái)判斷A B兩個(gè)數(shù)據(jù)的大小關(guān)系 決定是否跳轉(zhuǎn) JA A B成立則轉(zhuǎn)移JNBE A B不成立則轉(zhuǎn)移使用這兩個(gè)助記符含義是相同的 對(duì)應(yīng)同一條機(jī)器指令 判斷規(guī)則 CF 0ANDZF 0 轉(zhuǎn)移 否則不轉(zhuǎn)移 CF 0 A B最高位不產(chǎn)生借位 夠減 A BZF 0 A B結(jié)果不為0 A B綜合分析所得 A B JAE A B成立則轉(zhuǎn)移JNB A B不成立則轉(zhuǎn)移兩個(gè)助記符對(duì)應(yīng)同一條機(jī)器指令 判斷規(guī)則 CF 0ORZF 1 轉(zhuǎn)移 否則不轉(zhuǎn)移 CF 0 A B最高位不產(chǎn)生借位 夠減 A BZF 1 A B結(jié)果為0 A B綜合分析所得 A B 可以看出 單憑CF 0這一個(gè)條件已經(jīng)可以實(shí)現(xiàn)對(duì)條件A B的判斷 但是這條指令仍然在硬件邏輯上使用了ZF標(biāo)志 用JNC指令可以達(dá)到和JAE JNB指令相同的功能 但是JNC指令不要求上一條所執(zhí)行的指令一定是CMP指令 還可以是移位指令等 JNC不一定用于判斷兩個(gè)無(wú)符號(hào)數(shù)之間的大小關(guān)系 JB A B成立則轉(zhuǎn)移JNAE A B不成立則轉(zhuǎn)移兩個(gè)助記符對(duì)應(yīng)同一條機(jī)器指令 判斷規(guī)則 CF 1ANDZF 0 轉(zhuǎn)移 否則不轉(zhuǎn)移 CF 1 A B最高位產(chǎn)生借位 不夠減 A BZF 0 A B的結(jié)果不為0 A B綜合分析所得 A B 其實(shí)單憑CF 1這一個(gè)條件就可以斷定A B的結(jié)果 只是這條指令在硬件邏輯上同時(shí)也使用了ZF標(biāo)志 使用JC指令可以達(dá)到同樣的轉(zhuǎn)移效果 和JNC指令一樣 它不一定用于判斷兩個(gè)無(wú)符號(hào)數(shù)的大小關(guān)系 應(yīng)用范圍比JB JNAE指令更寬廣 JBE A B成立則轉(zhuǎn)移JNA A B不成立則轉(zhuǎn)移兩個(gè)助記符對(duì)應(yīng)同一條機(jī)器指令 判斷規(guī)則 CF 1ORZF 1 轉(zhuǎn)移 否則不轉(zhuǎn)移 CF 1 A B最高位產(chǎn)生借位 不夠減 A BZF 1 A B的結(jié)果為0 A B綜合分析所得 A B 例7 3 2數(shù)據(jù)段中的ARY數(shù)組中存放了10個(gè)字節(jié)型的無(wú)符號(hào)數(shù) 從數(shù)組中找出最大的數(shù)保存到MAX字節(jié)單元中 1 數(shù)據(jù)分析 數(shù)組ARY需要10個(gè)字節(jié)的空間 可以使用DUP關(guān)鍵字來(lái)定義 MAX字節(jié)單元用于存放最終結(jié)果 2 算法分析 把數(shù)組中的第0個(gè)數(shù)據(jù)首先存放到一個(gè)寄存器中 這里選用AL 然后把寄存器中的數(shù)據(jù)和數(shù)組中的每一個(gè)數(shù)據(jù)按順序作比較 當(dāng)比較過(guò)程中每遇到一個(gè)大于寄存器中數(shù)據(jù)的數(shù)組元素 就用當(dāng)前的數(shù)組元素修改寄存器的內(nèi)容 保持寄存器中的數(shù)據(jù)總是當(dāng)前最大的 由于需要逐個(gè)訪問數(shù)組中的元素 需要使用一個(gè)基址或變址寄存器作為一維數(shù)組的浮動(dòng)下標(biāo) 這里選用SI 還需要一個(gè)計(jì)數(shù)器 對(duì)訪問次數(shù)進(jìn)行記數(shù) 保證對(duì)數(shù)組的訪問不會(huì)越界 這里數(shù)組中有10個(gè)元素 使用CX來(lái)完成記數(shù)的功能 3 繪制流程圖并寫出相關(guān)程序主體 開始 初始化SI CX AL 進(jìn)入循環(huán) 修改SI使它指向下一個(gè)數(shù)據(jù) MOVSI OFFSETARYMOVCX 9MOVAL SI LOP INCSI AL SI AL SI Y L1 N L2 L3 LOP L3 CMPAL SI JBL1JMPL3 L2 L3 L1 MOVAL SI JMPL3 可省略 結(jié)束 CX CX 1 L3 DECCX JNZLOP1 條件轉(zhuǎn)移實(shí)現(xiàn)循環(huán) CX 0 MAX AL MOVMAX AL MOVAH 4CHINT21H N LOP1 L3 3 帶符號(hào)數(shù)條件轉(zhuǎn)移指令一組指令 用于對(duì)兩個(gè)帶符號(hào)數(shù)比較的結(jié)果進(jìn)行判斷 從而決定是否進(jìn)行程序的流程轉(zhuǎn)移 使用前提 使用這組指令之前 要保證上一條被執(zhí)行的指令是CMP指令 并且程序員把兩個(gè)參與比較的操作數(shù)看作帶符號(hào)數(shù) 這組指令在邏輯上把CMP指令的目的操作數(shù)稱為A數(shù)據(jù) 把源操作數(shù)稱為B數(shù)據(jù) 通過(guò)OF標(biāo)志 SF標(biāo)志和ZF標(biāo)志的狀態(tài)來(lái)判斷A B兩個(gè)數(shù)據(jù)的大小關(guān)系 決定是否跳轉(zhuǎn) JG A B成立則轉(zhuǎn)移JNLE A B不成立則轉(zhuǎn)移判斷規(guī)則 SF OFANDZF 0 轉(zhuǎn)移 否則不轉(zhuǎn)移 SF OF 參見教案對(duì)CMP指令的分析 符號(hào)標(biāo)志等于溢出標(biāo)志 A B的正確結(jié)果應(yīng)該是一個(gè)正數(shù)或者是0 A BZF 0 A B結(jié)果不為0 A B綜合分析所得 A B JGE A B成立則轉(zhuǎn)移JNL A B不成立則轉(zhuǎn)移判斷規(guī)則 SF OFORZF 1 轉(zhuǎn)移 否則不轉(zhuǎn)移 SF OF A BZF 1 A B結(jié)果為0 A B綜合分析所得 A B其實(shí) 從邏輯角度上說(shuō) ZF 1這個(gè)條件可以去掉 但是指令實(shí)際使用的硬件判斷邏輯就是這樣設(shè)計(jì)的 JL A B成立則轉(zhuǎn)移JNGE A B不成立則轉(zhuǎn)移判斷規(guī)則 SF OFANDZF 0 轉(zhuǎn)移 否則不轉(zhuǎn)移 SF OF 符號(hào)標(biāo)志和溢出標(biāo)志不相等 A B的正確結(jié)果應(yīng)該是負(fù)數(shù) A BZF 0 A B的結(jié)果不為0 A B綜合分析所得 A B從邏輯上講ZF 0這個(gè)條件可以不用 但是為了硬件上保證幾條帶符號(hào)轉(zhuǎn)移指令的設(shè)計(jì)一致和方便 在硬件邏輯中確實(shí)使用了ZF 0這個(gè)條件 JLE A B成立則轉(zhuǎn)移JNG A B不成立則轉(zhuǎn)移判斷規(guī)則 SF OFORZF 1 則轉(zhuǎn)移 否則不轉(zhuǎn)移 SF OF A BZF 1 A B綜合結(jié)果 A B 例 例7 3 2改一下 把數(shù)組中存放的無(wú)符號(hào)數(shù)改成帶符號(hào)數(shù) 不但找出數(shù)組中最大的數(shù) 而且要求找出最小的數(shù) 數(shù)據(jù)分析 ARY字節(jié)數(shù)組占用10個(gè)字節(jié)MIN字節(jié)單元用于存放最小值MAX字節(jié)單元用于存放最大值 算法分析 雖然增加了一個(gè)求最小值的過(guò)程 但是這個(gè)過(guò)程可以放在求最大值的循環(huán)中一起完成 只是在循環(huán)中增加一個(gè)比較和一個(gè)分支 在前面的例子中使用AL寄存器存放當(dāng)前比較的最大值 這里增加AH寄存器存放當(dāng)前比較的最小值 3 繪制流程圖并寫出相關(guān)程序主體 開始 初始化SI CX AL AH 進(jìn)入循環(huán) 修改SI使它指向下一個(gè)數(shù)據(jù) MOVSI OFFSETARYMOVCX 9MOVAL SI MOVAH SI LOP INCSI AL SI AL SI Y L1 N L2 L3 LOP L3 CMPAL SI JBL1JMPL3 L2 L3 L1 MOVAL SI JMPL3 可省略 L3 JGL4JMPL6 L5 L6 L4 MOVAH SI JMPL6 可省 AH SI L3 AH SI Y L4 N L5 L6 CX CX 1 L6 DECCX JNZLOP1 CX 0 N LOP1 上一個(gè)例子中的兩個(gè)分支結(jié)構(gòu)實(shí)際上在程序結(jié)構(gòu)上還可以進(jìn)一步優(yōu)化 使程序的執(zhí)行更有效率 AL SI AL SI 7 3 3分支程序設(shè)計(jì)匯編語(yǔ)言程序中的分支結(jié)構(gòu)都是結(jié)合使用條件轉(zhuǎn)移指令和無(wú)條件轉(zhuǎn)移指令來(lái)構(gòu)造的 分支結(jié)構(gòu)分為兩種 1 IF THEN ELSE結(jié)構(gòu) 雙分支結(jié)構(gòu) 把程序流程分為兩支 這種結(jié)構(gòu)和條件轉(zhuǎn)移指令本來(lái)的特征是一致的 2 CASE結(jié)構(gòu) 多分支結(jié)構(gòu) 從邏輯上講 多分支結(jié)構(gòu)可以通過(guò)嵌套使用雙分支結(jié)構(gòu)來(lái)實(shí)現(xiàn) 但是執(zhí)行效率不高 可以通過(guò)建立多分支表的方法來(lái)建立效率較高的多分支結(jié)構(gòu) 1 使用條件轉(zhuǎn)移指令實(shí)現(xiàn)分支結(jié)構(gòu) 包括雙分支 多分支 例7 3 3 編寫計(jì)算下面函數(shù)值的程序 1X 0Y 0X 0 1X 0設(shè)輸入數(shù)據(jù)為X 輸出數(shù)據(jù)Y 且皆為字節(jié)變量 程序流程圖如圖所示 程序如下 流程圖 X 0 Y 1 X 0 Y 0 Y 1 CMPX 0JLL1JMPL2L1 MOVY 1JMPL5L2 JZL3JMPL4L3 MOVY 0JMPL5L4 MOVY 1L5 MOVAH 4CHINT21H N L1 Y L2 Y L3 N L4 L5 L5 STACKSEGMENTSTACKDW100DUP 0 STACKENDSDATASEGMENTXDB 10YDB DATAENDSCODESEGMENTASSUMEDS DATA SS STACK CS CODESTART MOVAX DATAMOVDS AXCMPX 0 與0進(jìn)行比較JGEL1 X 0轉(zhuǎn)L1 MOVY 1 X 0時(shí) 1 YJMPEXITL1 JGL2 X 0轉(zhuǎn)A2MOVY 0 X 0時(shí) 0 YJMPEXITL2 MOVY 1 X 0 1 YEXIT MOVAH 4CHINT21HCODEENDSENDSTART 2 使用跳轉(zhuǎn)表實(shí)現(xiàn)多分支結(jié)構(gòu)多分支結(jié)構(gòu)相當(dāng)于高級(jí)語(yǔ)言中的CASE語(yǔ)句 可以通過(guò)嵌套使用雙分支結(jié)構(gòu)來(lái)實(shí)現(xiàn) 但是進(jìn)入每一個(gè)分支的時(shí)間可能會(huì)有差異 分支越多 進(jìn)入每一個(gè)分支的時(shí)間差異就越大 下面是嵌套使用雙分支結(jié)構(gòu)實(shí)現(xiàn)的多分支結(jié)構(gòu)流程圖 時(shí)間 T A 時(shí)間 T B 時(shí)間 T C D T 2T 3T 3T 典型的多分支結(jié)構(gòu)要求程序進(jìn)入每一個(gè)分支所花費(fèi)的時(shí)間大致是相當(dāng)?shù)?典型的多分支結(jié)構(gòu)流程圖如下 時(shí)間 T A B C D T T T T 典型的多分支結(jié)構(gòu)在匯編語(yǔ)言這個(gè)層面只能使用跳轉(zhuǎn)表來(lái)實(shí)現(xiàn) 1 跳轉(zhuǎn)表由各分支的入口地址構(gòu)成段內(nèi)跳轉(zhuǎn)表 把各個(gè)分支在代碼段內(nèi)的起始偏移量 字 組織到一個(gè)數(shù)組中 使用無(wú)條件段內(nèi)間接轉(zhuǎn)移指令使用其中的某一個(gè)偏移量 轉(zhuǎn)移到該偏移量對(duì)應(yīng)的分支入口 段間跳轉(zhuǎn)表 把各個(gè)分支的完整邏輯地址 雙字 組織到一個(gè)數(shù)組中 使用無(wú)條件段間間接轉(zhuǎn)移指令使用其中某一個(gè)邏輯地址 轉(zhuǎn)移到該邏輯地址對(duì)應(yīng)的分支入口 2 跳轉(zhuǎn)表由無(wú)條件轉(zhuǎn)移指令構(gòu)成 7 4循環(huán)程序設(shè)計(jì)程序設(shè)計(jì)中的所有循環(huán)結(jié)構(gòu)可以使用條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn) 高級(jí)語(yǔ)言中的WHILE循環(huán) DO

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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)論