版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
分支與轉(zhuǎn)移程序第一頁,共八十六頁,編輯于2023年,星期五目的和要求主要掌握各種轉(zhuǎn)移指令或者循環(huán)指令的使用方法,能夠在程序中使用各種程序結(jié)構(gòu)。
掌握匯編語言程序設(shè)計的完整步驟,要求能夠上機調(diào)試程序。第二頁,共八十六頁,編輯于2023年,星期五7.1.1匯編語言程序的設(shè)計步驟(1)選擇算法:決定解決問題的總體思路,最后確定為計算機可以執(zhí)行各種算法.(2)繪制流程圖:對于編寫較大的程序,這一個步驟是很有效的,把算法思想具體化為圖形表示,這使以后編制的程序結(jié)構(gòu)更加清晰、更不容易出現(xiàn)邏輯錯誤。(3)編制程序:根據(jù)流程圖寫程序,確定程序中的段結(jié)構(gòu),以及具體使用的指令和偽指令。源程序文件必須以“.ASM”作為后綴名,否則匯編程序會拒絕匯編該源程序。(4)匯編過程:使用匯編程序MASM.EXE對源程序進行匯編,生成目標(biāo)代碼.如果檢查出語法錯誤,那么返回到第三步修改源程序,直到?jīng)]有語法錯誤為止.第三頁,共八十六頁,編輯于2023年,星期五(5)連接過程:需要使用連接程序LINK.EXE把匯編程序匯編得到的目標(biāo)代碼文件(“.OBJ”為后綴)轉(zhuǎn)變?yōu)榭蓤?zhí)行文件(“.EXE”為后綴),如果有多個OBJ文件,就需要把它們連接在一起成為一個EXE文件。(6)調(diào)試過程:得到可執(zhí)行文件以后就要進行程序調(diào)試,這是開發(fā)周期中花費時間最長的一個過程。使用DEBUG.EXE調(diào)試程序,觀察程序的執(zhí)行結(jié)果是否正確,如果發(fā)現(xiàn)邏輯錯誤,就回到第三步重復(fù)上面的編制、匯編、連接過程。第四頁,共八十六頁,編輯于2023年,星期五7.1.2程序的基本結(jié)構(gòu)匯編語言程序和高級語言程序的基本程序結(jié)構(gòu)一樣,分為三種:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。通過三種基本結(jié)構(gòu)的組合和嵌套,又可以形成更復(fù)雜的程序結(jié)構(gòu)?;境绦蚪Y(jié)構(gòu)又可以有一些變種,在匯編語言中主要使用5種結(jié)構(gòu),其中(1)、(2)、(4)是基本結(jié)構(gòu),(3)、(5)是變種。注意流程圖中的符號,學(xué)會畫流程圖。第五頁,共八十六頁,編輯于2023年,星期五7.2順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)是最簡單的程序流程,指令按照在內(nèi)存中的地址順序依次被執(zhí)行,沒有任何的流程改變現(xiàn)象。
例7.2.1計算Z=(3X+Y-5)/2(1)數(shù)據(jù)分析,表達式中有三個變量X、Y、Z,可以使用三個內(nèi)存單元來表示,題目沒有指明變量的變化范圍,使用字節(jié)、字為單位都可以。教材中是以字為單位。第六頁,共八十六頁,編輯于2023年,星期五(2)算法分析:3X:2X+X一條移位指令和一條加法指令可以實現(xiàn)3X+Y-5:一條加法指令和一條減法指令可以實現(xiàn)(3X+Y-5)/2:除以2可以使用右移指令實現(xiàn)總體上程序應(yīng)該為順序結(jié)構(gòu),按照表達式規(guī)定的順序使用加法、減法、移位指令相結(jié)合可以實現(xiàn)要求的全部運算。第七頁,共八十六頁,編輯于2023年,星期五(3)繪制流程圖并寫出相關(guān)程序主體開始計算2X+X計算3X+Y-5計算(3X+Y-5)/2結(jié)束MOVAX,VARXSHLAX,1ADDAX,VARXADDAX,VARYSUBAX,5SARAX,1MOVVARZ,AX第八頁,共八十六頁,編輯于2023年,星期五(4)選擇一種程序框架,把程序主體添加到框架中就可以完成整個源程序的編制過程。(5)匯編過程:使用MASM.EXE匯編工具對源程序文件(ASM文件)進行匯編,檢查有沒有語法錯誤,如果有就進入編輯器進行修改。最后,生成目標(biāo)代碼文件(OBJ文件)。(6)連接過程:使用LINK.EXE連接工具把OBJ文件組織為真正的可執(zhí)行文件(EXE文件)。(7)使用DEBUG調(diào)試可執(zhí)行程序,觀察程序中有沒有邏輯錯誤,如果有就進入編輯器進行修改,直到程序運行結(jié)果無誤為止。第九頁,共八十六頁,編輯于2023年,星期五7.3分支程序設(shè)計分支結(jié)構(gòu)在程序流程中是最常用的一種,任何實用的程序都需要對計算結(jié)果或某些必要的測試條件進行判斷,根據(jù)判斷的邏輯結(jié)果來決定是否改變程序執(zhí)行的流程。匯編語言中,實現(xiàn)分支結(jié)構(gòu)的指令是轉(zhuǎn)移類指令,這類指令可以通過修改CS和IP的內(nèi)容來改變程序執(zhí)行的流程。其實,程序中的很多循環(huán)結(jié)構(gòu)也是通過轉(zhuǎn)移指令來實現(xiàn)的,因為循環(huán)結(jié)構(gòu)就是分支結(jié)構(gòu)的一種特例。第十頁,共八十六頁,編輯于2023年,星期五7.3.1轉(zhuǎn)移指令轉(zhuǎn)移指令分為無條件和條件兩種。無條件轉(zhuǎn)移指令一定會改變程序執(zhí)行的流程,改變下一條將要執(zhí)行的指令地址。條件轉(zhuǎn)移指令則會對特定的標(biāo)志位進行判斷,如果標(biāo)志位的狀態(tài)滿足條件,那么它會改變程序執(zhí)行的流程,如果不滿足條件,那么不會改變程序的流程。兩種轉(zhuǎn)移指令的功能都不可忽視,在程序中都是經(jīng)常使用的。第十一頁,共八十六頁,編輯于2023年,星期五(一)無條件轉(zhuǎn)移指令指令格式:JMP目標(biāo)地址功能:無條件的修改IP或者CS、IP中的內(nèi)容,改變下一條將要執(zhí)行的指令地址。即跳轉(zhuǎn)到目標(biāo)地址繼續(xù)執(zhí)行程序。標(biāo)志位影響:無第十二頁,共八十六頁,編輯于2023年,星期五
JMP L1 MOVAX,0 …L1: MOVAX,0FFFFH …
按照正常的執(zhí)行流程,執(zhí)行完JMPL1指令以后,應(yīng)該執(zhí)行MOVAX,0指令,但是由于程序執(zhí)行流程已經(jīng)改變到L1標(biāo)號指明的地址,所以下一條將要執(zhí)行的指令變成了MOVAX,0FFFFH指令。第十三頁,共八十六頁,編輯于2023年,星期五JMP指令的轉(zhuǎn)移類型分為兩種:段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移。(1)段內(nèi)轉(zhuǎn)移
JMP指令本身和目標(biāo)地址在同一個代碼段內(nèi),這種轉(zhuǎn)移只需要修改IP的內(nèi)容,而不需要改變CS的內(nèi)容。1)段內(nèi)直接轉(zhuǎn)移格式:JMP標(biāo)號機器指令的格式由兩部分構(gòu)成,OPCODE和DISP,OPCODE是操作碼,DISP是一個8位或16位的補碼
DISP表示的含義是標(biāo)號地址相對于JMP指令的字節(jié)距離。第十四頁,共八十六頁,編輯于2023年,星期五
DISP=標(biāo)號偏移量–JMP指令偏移量上面這個表達式的計算是匯編程序在匯編過程中完成的。如果沒有匯編語言,直接使用機器指令編程,那么DISP的計算就必須由程序員來完成。標(biāo)號地址>JMP指令地址:DISP>0
標(biāo)號地址<JMP指令地址:DISP<0
功能:IP<=(IP)+DISP第十五頁,共八十六頁,編輯于2023年,星期五(IP)+DISP
注意這個加法,這是兩個補碼的加法。DISP可以是正數(shù),也可以是負(fù)數(shù),但是(IP)總是理解為正數(shù)。把第16位(超出字的范圍)理解為符號位,(IP)的第16位總是理解為0,DISP的第16位由它自己的符號位決定。第十六頁,共八十六頁,編輯于2023年,星期五舉例:(IP)=1100101001101011DISP=11100110(IP)+DISP:
01100101001101011+ 11111111111100110 01100101001010001
注意,相加的結(jié)果總是一個正數(shù),補碼加法完畢以后應(yīng)當(dāng)重新把(IP)看作無符號數(shù)。第十七頁,共八十六頁,編輯于2023年,星期五段內(nèi)直接轉(zhuǎn)移在機器指令中又可以分為短跳轉(zhuǎn)和長跳轉(zhuǎn)兩種情況。指令中的DISP字段是由匯編程序在匯編過程中計算并生成的。如果匯編程序計算出的DISP在-128—127范圍內(nèi),那么生成的DISP只有一個字節(jié)。這種情況稱為短跳轉(zhuǎn)。如果DISP超過了-128—127這個范圍,那么生成的DISP字段將在指令中占用一個字。這種情況稱為長跳轉(zhuǎn),轉(zhuǎn)移范圍為-32768——32767。段的最大空間就是65536字節(jié),長跳轉(zhuǎn)已經(jīng)可以在整個代碼段中任意的實現(xiàn)轉(zhuǎn)移。第十八頁,共八十六頁,編輯于2023年,星期五2)段內(nèi)間接轉(zhuǎn)移
JMP指令針對的目標(biāo)偏移量存放在16位的通用寄存器或字內(nèi)存單元中。指令格式:JMP通用寄存器名稱
JMP字內(nèi)存單元功能:IP<=(通用寄存器)
IP<=(EA)第十九頁,共八十六頁,編輯于2023年,星期五例子:JMPBX功能:IP<=(BX)JMPWORDPTR[SI]功能:IP<=(DS:SI)第二十頁,共八十六頁,編輯于2023年,星期五注意直接段內(nèi)轉(zhuǎn)移和間接段內(nèi)轉(zhuǎn)移的區(qū)別。直接段內(nèi)轉(zhuǎn)移:由機器指令的DISP字段給出目標(biāo)地址相對于JMP指令的帶符號字節(jié)距離,完成的功能是:IP<=(IP)+DISP。間接段內(nèi)轉(zhuǎn)移:由16位通用寄存器或字內(nèi)存單元直接給出IP寄存器新的內(nèi)容。第二十一頁,共八十六頁,編輯于2023年,星期五格式舉例注釋JMP通用寄存器JMPBX16位轉(zhuǎn)向地址在BX中JMP內(nèi)存單元16位轉(zhuǎn)向地址在VAR字型內(nèi)存變量中16位轉(zhuǎn)向地址在BX所指向的內(nèi)存變量中段內(nèi)間接尋址方式JMPWORDPTRVARJMPWORDPTR[BX]第二十二頁,共八十六頁,編輯于2023年,星期五舉例:如果BX=100H,[100H]=4100H分析執(zhí)行下面指令后,指令地址分別=?JMP BXJMP [BX]第二十三頁,共八十六頁,編輯于2023年,星期五(2)段間轉(zhuǎn)移標(biāo)號地址和JMP指令本身不在同一個代碼段內(nèi),這類轉(zhuǎn)移必須同時修改CS和IP的內(nèi)容,才能完成正確的轉(zhuǎn)移操作。1)段間直接轉(zhuǎn)移指令格式:JMPFAR類型的標(biāo)號
JMPFARPTR標(biāo)號第二種格式是強制指定標(biāo)號的臨時類型屬性為FAR,無論該標(biāo)號定義時是什么類型,在這里一定作為FAR類型來引用。第二十四頁,共八十六頁,編輯于2023年,星期五機器指令中除了OPCODE字段外,還有兩個16位的字段,分別表示目標(biāo)地址的偏移量和段基值。功能:IP<=目標(biāo)地址偏移量
CS<=目標(biāo)地址段基值同時修改CS、IP中的內(nèi)容,實現(xiàn)段間轉(zhuǎn)移。第二十五頁,共八十六頁,編輯于2023年,星期五 下圖給出的是段間直接轉(zhuǎn)移指令機器碼示意圖。執(zhí)行時把偏移量送給IP,段基址送給CS,即可實現(xiàn)段間直接轉(zhuǎn)移。
字節(jié)0字節(jié)1字節(jié)2字節(jié)3字節(jié)4段間直接尋址方式操作碼段基址高8位段基址低8位偏移量高8位偏移量低8位第二十六頁,共八十六頁,編輯于2023年,星期五(2)段間間接轉(zhuǎn)移這種轉(zhuǎn)移方式所使用的目標(biāo)地址只能是存放在雙字內(nèi)存單元中的內(nèi)容。指令格式:JMPDWORDPTR雙字單元起始偏移量功能:IP<=(EA)
CS<=(EA+2)第二十七頁,共八十六頁,編輯于2023年,星期五例子:…ADR1DDL1…JMPDWORDPTRADR1
功能:實現(xiàn)段間轉(zhuǎn)移,目標(biāo)地址為L1標(biāo)號所在的位置,它對應(yīng)的邏輯地址存放在ADR1雙字單元中。第二十八頁,共八十六頁,編輯于2023年,星期五例子:JMPDWORDPTR[BX][DI]雙字單元有效地址:EA=(BX)+(DI)采用基址變址尋址方式。功能:IP<=(EA)
CS<=(EA+2)第二十九頁,共八十六頁,編輯于2023年,星期五(二)條件轉(zhuǎn)移指令統(tǒng)一的匯編格式:JXX目標(biāo)地址功能:根據(jù)前一條指令所影響或設(shè)置的某些標(biāo)志位狀態(tài)作為判斷條件,當(dāng)條件滿足時,把程序流程轉(zhuǎn)移到指定的目標(biāo)地址;當(dāng)條件不滿足時,不改變程序流程,CPU會順序執(zhí)行下一條指令。標(biāo)志位影響:無(只使用標(biāo)志位作為判斷條件,不會去修改它)第三十頁,共八十六頁,編輯于2023年,星期五條件轉(zhuǎn)移指令的機器指令格式:總是占用2個字節(jié),前一個字節(jié)是OPCODE,后一個字節(jié)是帶符號的相對位移量(DISP)。由于在條件轉(zhuǎn)移指令中,DISP僅8位,那么跳轉(zhuǎn)范圍一定是-128—127字節(jié),只能是短跳轉(zhuǎn),這一點對于所有條件轉(zhuǎn)移指令來說都是一樣的。如果需要條件轉(zhuǎn)移的轉(zhuǎn)移范圍得到擴大,那么必須結(jié)合使用無條件轉(zhuǎn)移,因為只有無條件轉(zhuǎn)移指令提供長跳轉(zhuǎn)和段間轉(zhuǎn)移。第三十一頁,共八十六頁,編輯于2023年,星期五注意,在執(zhí)行條件轉(zhuǎn)移指令前,一般需要執(zhí)行一條算術(shù)運算指令或邏輯運算指令對特定標(biāo)志位產(chǎn)生有意義的影響。根據(jù)條件轉(zhuǎn)移指令所判斷的標(biāo)志位可以把它們分為三類:單條件轉(zhuǎn)移、無符號數(shù)條件轉(zhuǎn)移,有符號數(shù)條件轉(zhuǎn)移。第三十二頁,共八十六頁,編輯于2023年,星期五條件轉(zhuǎn)移指令是用于實現(xiàn)分支和循環(huán)結(jié)構(gòu)的基礎(chǔ),但是程序的結(jié)構(gòu)卻是程序員可以自由選擇的。左邊的圖為非結(jié)構(gòu)化的分支結(jié)構(gòu),右邊為結(jié)構(gòu)化的第三十三頁,共八十六頁,編輯于2023年,星期五在非結(jié)構(gòu)化的分支結(jié)構(gòu)中,每一個分支的出口可能不一樣,如果要分析這一個分支結(jié)構(gòu),那么必須在源程序中找到所有分支的出口;如果要調(diào)試它,那么需要在每一個出口都設(shè)置斷點,或者單步跟蹤每一個出口。非結(jié)構(gòu)化的分支會造成程序的可讀性下降,調(diào)試難度加大。如果采用結(jié)構(gòu)化的分支,那么所有分支的出口都是一致的,程序的分析和調(diào)試都非常方便,只需要注意一個出口。在程序設(shè)計中應(yīng)該養(yǎng)成結(jié)構(gòu)化編程的習(xí)慣。第三十四頁,共八十六頁,編輯于2023年,星期五(1)單條件轉(zhuǎn)移指令這一類條件轉(zhuǎn)移指令只對某一個標(biāo)志位的狀態(tài)進行判斷,并決定是否進行轉(zhuǎn)移。1)單標(biāo)志位轉(zhuǎn)移單標(biāo)志位轉(zhuǎn)移指令總共有5對,能對5個標(biāo)志位:CF、ZF、SF、OF、PF各自的狀態(tài)進行判斷。第三十五頁,共八十六頁,編輯于2023年,星期五例7.3.1編寫一段程序判斷兩個字節(jié)變量DB1和DB2的內(nèi)容是否相同,如果相同則把AL清0,否則置全1。教材上的程序片段:
MOVAL,DB1 CMPAL,DB2 JZL1 MOVAL,0FFH JMPL2
;無條件轉(zhuǎn)移對于實現(xiàn)分支結(jié)構(gòu)也是必不可少的L1:MOVAL,00HL2:MOVAH,4CHINT21H注意分析,上面的條件轉(zhuǎn)移有什么樣的缺陷。如果JZL1指令和L1標(biāo)號之間的字節(jié)距離超過127,那么在匯編過程中就會出現(xiàn)語法錯誤。第三十六頁,共八十六頁,編輯于2023年,星期五從上面的例子可以看出,條件轉(zhuǎn)移指令不適合直接用于距離較遠(yuǎn)的轉(zhuǎn)移。一般來說,應(yīng)該結(jié)合無條件轉(zhuǎn)移指令在分支結(jié)構(gòu)中實現(xiàn)長距離轉(zhuǎn)移。就上面的例子,我們通過它的流程圖來得到合理的源程序。第三十七頁,共八十六頁,編輯于2023年,星期五根據(jù)流程圖寫出相關(guān)程序主體CMPAL,DB2JZL1JMPL2MOVAL,DB1AL<=DB1AL<=0AL=DB2?AL<=0FFHY:L1N:L2L3L1:MOVAL,0JMPL3L2:MOVAL,0FFHL3:MOVAH,4CHINT21H第三十八頁,共八十六頁,編輯于2023年,星期五按照這種規(guī)則設(shè)計的分支結(jié)構(gòu)中,所有長距離的流程轉(zhuǎn)移都是由無條件轉(zhuǎn)移指令實現(xiàn)的,避免了直接使用條件轉(zhuǎn)移指令作長跳轉(zhuǎn)。在今后的程序設(shè)計中,需要逐漸養(yǎng)成這樣的編程習(xí)慣。對匯編語言進一步熟悉之后,在編制一些小程序或者程序片段的時候,可以跳過流程圖繪制這一步,直接進行程序的編制。第三十九頁,共八十六頁,編輯于2023年,星期五
2)另一種單條件轉(zhuǎn)移指令格式:JCXZ目標(biāo)地址功能:判斷(CX)是否等于0,如果等于0,則跳轉(zhuǎn)到目標(biāo)地址,否則順序執(zhí)行下一條指令。這一條指令主要用于和循環(huán)指令配合使用,以實現(xiàn)程序中循環(huán)結(jié)構(gòu)。因為循環(huán)指令就是使用CX寄存器作為計數(shù)器實現(xiàn)計數(shù)循環(huán)的。在講到循環(huán)指令的時候,我們會詳細(xì)說明這條指令的具體用途。第四十頁,共八十六頁,編輯于2023年,星期五注意,JCXZ是對(CX)進行判斷,而不是使用ZF標(biāo)志位。看下面的程序片段:
MOVAX,34H MOVCX,34H CMPCX,AX JCXZL1 …L1: …
程序中,JCXZ指令并不會跳轉(zhuǎn)到L1,因為(CX)不等于0,ZF標(biāo)志的取值并不會影響它的判斷。第四十一頁,共八十六頁,編輯于2023年,星期五匯編格式功能測試條件
JCLABEL有進位轉(zhuǎn)移CF=1
JNCLABEL無進位轉(zhuǎn)移CF=0
JOLABEL溢出轉(zhuǎn)移OF=1
JNOLABEL無溢出轉(zhuǎn)移OF=0JP/JPELABEL偶轉(zhuǎn)移PF=1JNP/JPOLABEL奇轉(zhuǎn)移PF=0
JSLABEL負(fù)數(shù)轉(zhuǎn)移SF=1
JNSLABEL非負(fù)數(shù)轉(zhuǎn)移SF=0
JZ/JELABEL結(jié)果為0/相等轉(zhuǎn)移ZF=1JNZ/JNELABEL結(jié)果不為0/不相等轉(zhuǎn)移ZF=0注:對實現(xiàn)同一功能但指令助記符有兩種形式時,在程序中究竟選用哪一種視習(xí)慣或用途而定,例如對于指令JZ/JELABEL,當(dāng)比較兩數(shù)相等轉(zhuǎn)移時常使用JZ助記符,當(dāng)比較某數(shù)為0轉(zhuǎn)移時常使用JE指令。下同。檢測單個條件標(biāo)志位轉(zhuǎn)移指令第四十二頁,共八十六頁,編輯于2023年,星期五提問?1.轉(zhuǎn)移指令的實質(zhì)?2.轉(zhuǎn)移指令目的操作數(shù)?3.直接轉(zhuǎn)移和間接轉(zhuǎn)移的區(qū)別?4.段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移的區(qū)別?5.轉(zhuǎn)移指令的尋址方式有哪些?第四十三頁,共八十六頁,編輯于2023年,星期五(2)無符號數(shù)條件轉(zhuǎn)移指令這是一組指令,用于對兩個無符號數(shù)比較的結(jié)果進行判斷,從而決定是否進行程序的流程轉(zhuǎn)移。使用前提:使用這組指令之前,要保證上一條被執(zhí)行的指令是CMP指令,并且程序員把兩個參與比較的操作數(shù)看作無符號數(shù)。這組指令在邏輯上把CMP指令的目的操作數(shù)稱為A數(shù)據(jù),把源操作數(shù)稱為B數(shù)據(jù)。通過CF標(biāo)志和ZF標(biāo)志的狀態(tài)來判斷A、B兩個數(shù)據(jù)的大小關(guān)系,決定是否跳轉(zhuǎn)。第四十四頁,共八十六頁,編輯于2023年,星期五JA:A>B成立則轉(zhuǎn)移JNBE:A≤B不成立則轉(zhuǎn)移使用這兩個助記符含義是相同的,對應(yīng)同一條機器指令。判斷規(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第四十五頁,共八十六頁,編輯于2023年,星期五JAE:A≥B成立則轉(zhuǎn)移JNB:A<B不成立則轉(zhuǎn)移兩個助記符對應(yīng)同一條機器指令。判斷規(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第四十六頁,共八十六頁,編輯于2023年,星期五可以看出,單憑CF=0這一個條件已經(jīng)可以實現(xiàn)對條件A≥B的判斷,但是這條指令仍然在硬件邏輯上使用了ZF標(biāo)志。用JNC指令可以達到和JAE/JNB指令相同的功能,但是JNC指令不要求上一條所執(zhí)行的指令一定是CMP指令,還可以是移位指令等,JNC不一定用于判斷兩個無符號數(shù)之間的大小關(guān)系。第四十七頁,共八十六頁,編輯于2023年,星期五JB:A<B成立則轉(zhuǎn)移JNAE:A≥B不成立則轉(zhuǎn)移兩個助記符對應(yīng)同一條機器指令。判斷規(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第四十八頁,共八十六頁,編輯于2023年,星期五其實單憑CF=1這一個條件就可以斷定A<B的結(jié)果,只是這條指令在硬件邏輯上同時也使用了ZF標(biāo)志。使用JC指令可以達到同樣的轉(zhuǎn)移效果,和JNC指令一樣,它不一定用于判斷兩個無符號數(shù)的大小關(guān)系。應(yīng)用范圍比JB/JNAE指令更寬廣。第四十九頁,共八十六頁,編輯于2023年,星期五JBE:A≤B成立則轉(zhuǎn)移JNA:A>B不成立則轉(zhuǎn)移兩個助記符對應(yīng)同一條機器指令。判斷規(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第五十頁,共八十六頁,編輯于2023年,星期五匯編格式 功能測試條件JA/JNBELABEL高于/不低于等于轉(zhuǎn)移CF=0andZF=0JNA/JBELABEL不高于/低于等于轉(zhuǎn)移CF=1orZF=1JB/JNAE/JCLABEL低于/不高于等于轉(zhuǎn)移CF=1JNB/JAE/JNCLABEL不低于/高于等于轉(zhuǎn)移CF=0注1.A=Above,B=Below,C=Carry,E=Equel,N=Not可以看出,這里的高于相當(dāng)于帶符號數(shù)的大于,低于相當(dāng)于帶符號數(shù)的小于。注2.顯然,表中的指令JZ/JELABEL和JNZ/JNELABEL同樣可以用于兩個無符號數(shù)的比較轉(zhuǎn)移。根據(jù)兩個無符號數(shù)比較結(jié)果實現(xiàn)轉(zhuǎn)移的條件轉(zhuǎn)移指令第五十一頁,共八十六頁,編輯于2023年,星期五例7.3.2數(shù)據(jù)段中的ARY數(shù)組中存放了10個字節(jié)型的無符號數(shù),從數(shù)組中找出最大的數(shù)保存到MAX字節(jié)單元中。(1)數(shù)據(jù)分析:數(shù)組ARY需要10個字節(jié)的空間,可以使用DUP關(guān)鍵字來定義。MAX字節(jié)單元用于存放最終結(jié)果。第五十二頁,共八十六頁,編輯于2023年,星期五(2)算法分析:把數(shù)組中的第0個數(shù)據(jù)首先存放到一個寄存器中(這里選用AL),然后把寄存器中的數(shù)據(jù)和數(shù)組中的每一個數(shù)據(jù)按順序作比較,當(dāng)比較過程中每遇到一個大于寄存器中數(shù)據(jù)的數(shù)組元素,就用當(dāng)前的數(shù)組元素修改寄存器的內(nèi)容,保持寄存器中的數(shù)據(jù)總是當(dāng)前最大的。由于需要逐個訪問數(shù)組中的元素,需要使用一個基址或變址寄存器作為一維數(shù)組的浮動下標(biāo),這里選用SI;還需要一個計數(shù)器,對訪問次數(shù)進行記數(shù),保證對數(shù)組的訪問不會越界(這里數(shù)組中有10個元素,使用CX來完成記數(shù)的功能)。第五十三頁,共八十六頁,編輯于2023年,星期五(3)繪制流程圖并寫出相關(guān)程序主體開始初始化SI、CX、AL進入循環(huán),修改SI使它指向下一個數(shù)據(jù)MOVSI,OFFSETARYMOVCX,9MOVAL,[SI]LOP:INCSI(AL)<((SI))AL<=((SI))Y:L1N:L2=L3LOP:L3CMPAL,[SI]JBL1JMPL3;L2=L3L1:MOVAL,[SI]JMPL3(可省略)第五十四頁,共八十六頁,編輯于2023年,星期五結(jié)束CX<=(CX)-1L3:DECCXJNZLOP1;條件轉(zhuǎn)移實現(xiàn)循環(huán)(CX)=0?MAX<=(AL)MOVMAX,ALMOVAH,4CHINT21HN:LOP1L3第五十五頁,共八十六頁,編輯于2023年,星期五(3)帶符號數(shù)條件轉(zhuǎn)移指令一組指令,用于對兩個帶符號數(shù)比較的結(jié)果進行判斷,從而決定是否進行程序的流程轉(zhuǎn)移。使用前提:使用這組指令之前,要保證上一條被執(zhí)行的指令是CMP指令,并且程序員把兩個參與比較的操作數(shù)看作帶符號數(shù)。這組指令在邏輯上把CMP指令的目的操作數(shù)稱為A數(shù)據(jù),把源操作數(shù)稱為B數(shù)據(jù)。通過OF標(biāo)志、SF標(biāo)志和ZF標(biāo)志的狀態(tài)來判斷A、B兩個數(shù)據(jù)的大小關(guān)系,決定是否跳轉(zhuǎn)。第五十六頁,共八十六頁,編輯于2023年,星期五JG:A>B成立則轉(zhuǎn)移JNLE:A≤B不成立則轉(zhuǎn)移判斷規(guī)則:SF=OFANDZF=0,轉(zhuǎn)移,否則不轉(zhuǎn)移。
SF=OF:(參見教案對CMP指令的分析)符號標(biāo)志等于溢出標(biāo)志,A-B的正確結(jié)果應(yīng)該是一個正數(shù)或者是0,A≥BZF=0:A-B結(jié)果不為0,A≠B綜合分析所得:A>B第五十七頁,共八十六頁,編輯于2023年,星期五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其實,從邏輯角度上說,ZF=1這個條件可以去掉,但是指令實際使用的硬件判斷邏輯就是這樣設(shè)計的。第五十八頁,共八十六頁,編輯于2023年,星期五JL:A<B成立則轉(zhuǎn)移JNGE:A≥B不成立則轉(zhuǎn)移判斷規(guī)則:SF≠OFANDZF=0,轉(zhuǎn)移,否則不轉(zhuǎn)移。SF≠OF:符號標(biāo)志和溢出標(biāo)志不相等,A-B的正確結(jié)果應(yīng)該是負(fù)數(shù),A<BZF=0:A-B的結(jié)果不為0,A≠B綜合分析所得:A<B
從邏輯上講ZF=0這個條件可以不用,但是為了硬件上保證幾條帶符號轉(zhuǎn)移指令的設(shè)計一致和方便,在硬件邏輯中確實使用了ZF=0這個條件。第五十九頁,共八十六頁,編輯于2023年,星期五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第六十頁,共八十六頁,編輯于2023年,星期五匯編格式 功能測試條件JG/JNLELABEL大于/不小于等于轉(zhuǎn)移ZF=0andSF=OFJNG/JLELABEL不大于/小于等于轉(zhuǎn)移ZF=1orSF≠OFJL/JNGELABEL小于/不大于等于轉(zhuǎn)移SF≠OFJNL/JGELABEL不小于/大于等于轉(zhuǎn)移SF=OF注1.G=Greater,L=Less,E=Equel,N=Not
注2.顯然,表3-7中的指令JZ/JELABEL和JNZ/JNELABEL同樣可以用于兩個帶符號數(shù)的比較轉(zhuǎn)移。根據(jù)兩個帶符號數(shù)比較結(jié)果實現(xiàn)轉(zhuǎn)移的條件轉(zhuǎn)移指令第六十一頁,共八十六頁,編輯于2023年,星期五例.例7.3.2改一下,把數(shù)組中存放的無符號數(shù)改成帶符號數(shù),不但找出數(shù)組中最大的數(shù),而且要求找出最小的數(shù)。數(shù)據(jù)分析:ARY字節(jié)數(shù)組占用10個字節(jié)MIN字節(jié)單元用于存放最小值MAX字節(jié)單元用于存放最大值第六十二頁,共八十六頁,編輯于2023年,星期五算法分析:雖然增加了一個求最小值的過程,但是這個過程可以放在求最大值的循環(huán)中一起完成,只是在循環(huán)中增加一個比較和一個分支。在前面的例子中使用AL寄存器存放當(dāng)前比較的最大值,這里增加AH寄存器存放當(dāng)前比較的最小值。第六十三頁,共八十六頁,編輯于2023年,星期五(3)繪制流程圖并寫出相關(guān)程序主體開始初始化SI、CX、AL、AH進入循環(huán),修改SI使它指向下一個數(shù)據(jù)MOVSI,OFFSETARYMOVCX,9MOVAL,[SI]MOVAH,[SI]LOP:INCSI(AL)<((SI))AL<=((SI))Y:L1N:L2=L3LOP:L3CMPAL,[SI]JBL1JMPL3;L2=L3L1:MOVAL,[SI]JMPL3(可省略)第六十四頁,共八十六頁,編輯于2023年,星期五L3:JGL4JMPL6;L5=L6L4:MOVAH,[SI]JMPL6;可省(AH)>((SI))?L3AH<=((SI))Y:L4N:L5
L6CX<=(CX)-1L6:DECCX
JNZLOP1(CX)=0?N:LOP1第六十五頁,共八十六頁,編輯于2023年,星期五結(jié)束
MOVAH,4CHINT21HMAX<=(AL)
MOVMAX,ALMIN<=(AH)
MOVMIN,AH第六十六頁,共八十六頁,編輯于2023年,星期五上一個例子中的兩個分支結(jié)構(gòu)實際上在程序結(jié)構(gòu)上還可以進一步優(yōu)化,使程序的執(zhí)行更有效率。(AL)<((SI))AL<=((SI))(AH)>((SI))?AH<=((SI))第六十七頁,共八十六頁,編輯于2023年,星期五7.3.3分支程序設(shè)計匯編語言程序中的分支結(jié)構(gòu)都是結(jié)合使用條件轉(zhuǎn)移指令和無條件轉(zhuǎn)移指令來構(gòu)造的。分支結(jié)構(gòu)分為兩種:1)IF-THEN-ELSE結(jié)構(gòu):雙分支結(jié)構(gòu),把程序流程分為兩支,這種結(jié)構(gòu)和條件轉(zhuǎn)移指令本來的特征是一致的。2)CASE結(jié)構(gòu):多分支結(jié)構(gòu),從邏輯上講,多分支結(jié)構(gòu)可以通過嵌套使用雙分支結(jié)構(gòu)來實現(xiàn),但是執(zhí)行效率不高,可以通過建立多分支表的方法來建立效率較高的多分支結(jié)構(gòu)。(1)使用條件轉(zhuǎn)移指令實現(xiàn)分支結(jié)構(gòu)(包括雙分支、多分支)第六十八頁,共八十六頁,編輯于2023年,星期五【例7.3.3】編寫計算下面函數(shù)值的程序:
1 X>0Y=0 X=0-1 X<0設(shè)輸入數(shù)據(jù)為X、輸出數(shù)據(jù)Y,且皆為字節(jié)變量。程序流程圖如圖所示。程序如下:第六十九頁,共八十六頁,編輯于2023年,星期五流程圖X≥0?Y<=-1X=0?Y<=0Y<=1
CMPX,0JLL1JMPL2L1:MOVY,-1JMPL5L2:JZL3JMPL4L3:MOVY,0JMPL5L4:MOVY,1L5:MOVAH,4CHINT21HN:L1Y:L2Y:L3N:L4
L5
L5第七十頁,共八十六頁,編輯于2023年,星期五STACK SEGMENTSTACK DW100DUP(0)STACK ENDSDATA SEGMENTX DB-10Y DB?DATA ENDSCODE SEGMENTASSUME DS:DATA,SS,STACK,CS:CODESTART: MOV AX,DATA MOV DS,AX CMP X,0 ;與0進行比較
JGE L1 ;X≥0轉(zhuǎn)L1
第七十一頁,共八十六頁,編輯于2023年,星期五
MOV Y,-1 ;X<0時,-1→Y JMP EXITL1:JG L2 ;X>0轉(zhuǎn)A2 MOV Y,0 ;X=0時,0→Y JMP EXITL2:MOV Y,1 ;X>0,1→YEXIT:MOV AH,4CH INT 21HCODEENDS END START第七十二頁,共八十六頁,編輯于2023年,星期五(2)使用跳轉(zhuǎn)表實現(xiàn)多分支結(jié)構(gòu)多分支結(jié)構(gòu)相當(dāng)于高級語言中的CASE語句,可以通過嵌套使用雙分支結(jié)構(gòu)來實現(xiàn),但是進入每一個分支的時間可能會有差異。分支越多,進入每一個分支的時間差異就越大。下面是嵌套使用雙分支結(jié)構(gòu)實現(xiàn)的多分支結(jié)構(gòu)流程圖:第七十三頁,共八十六頁,編輯于2023年,星期五時間:TA時間:TB時間:TCDT2T3T3T第七十四頁,共八十六頁,編輯于2023年,星期五典型的多分支結(jié)構(gòu)要求程序進入每一個分支所花費的時間大致是相當(dāng)?shù)?。典型的多分支結(jié)構(gòu)流程圖如下:時間:TABCDTTTT第七十五頁,共八十六頁,編輯于2023年,星期五典型的多分支結(jié)構(gòu)在匯編語言這個層面只能使用跳轉(zhuǎn)表來實現(xiàn)。
1)跳轉(zhuǎn)表由各分支的入口地址構(gòu)成段內(nèi)跳轉(zhuǎn)表:把各個分支在代碼段內(nèi)的起始偏移量(字)組織到一個數(shù)組中,使用無條件段內(nèi)間接轉(zhuǎn)移指令使用其中的某一個偏移量,轉(zhuǎn)移到該偏移量對應(yīng)的分支入口。段間跳轉(zhuǎn)表:把各個分支的完整邏輯地址(雙字)組織到一個數(shù)組中,使用無條件段間間接轉(zhuǎn)移指令
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年深圳中考語文素養(yǎng)培優(yōu)強化試卷(附答案可下載)
- 2026年深圳中考英語經(jīng)典例題變式試卷(附答案可下載)
- 廣東省深圳市龍崗區(qū)2026年上學(xué)期期末九年級適應(yīng)性試題物理試卷附答案
- 2026年大學(xué)大二(交通安全技術(shù))道路交通安全設(shè)施設(shè)置綜合測試題及答案
- 2026年深圳中考數(shù)學(xué)圖形的軸對稱試卷(附答案可下載)
- 2026年深圳中考生物綠色植物與生物圈的碳氧平衡試卷(附答案可下載)
- 2026年深圳中考?xì)v史文藝復(fù)興與宗教改革專項試卷(附答案可下載)
- 復(fù)試電氣知識題庫及答案
- 2026年人教版語文高一上冊期末質(zhì)量檢測卷(附答案解析)
- 2026年廣州中考政治友誼與交往專項試卷(附答案可下載)
- 2025年重慶市中考地理試卷真題(含標(biāo)準(zhǔn)答案及解析)
- 2025反無人機系統(tǒng)行業(yè)市場空間、產(chǎn)業(yè)鏈及競爭格局分析報告
- 足球隊員傷病恢復(fù)訓(xùn)練計劃
- 政治素質(zhì)測試題及答案
- 安徽黨??荚囋囶}及答案
- 數(shù)字技術(shù)賦能紅色文化傳承:機理、困境與路徑
- 水電站安全管理體系構(gòu)建
- 胃支架置入術(shù)的護理配合
- 基于機器學(xué)習(xí)的天線優(yōu)化與設(shè)計研究
- 2025財務(wù)經(jīng)理年終總結(jié)
- TCACM 1463-2023 糖尿病前期治未病干預(yù)指南
評論
0/150
提交評論