




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
本章主要內容:順序程序設計無條件轉移指令條件轉移指令分支程序設計循環控制指令循環程序設計第五章程序控制結構及其設計技術15.1順序程序設計順序程序是指程序的結構從開始到結尾一直是順序執行,中途沒有分支。例5.2.1試編寫程序計算以下表達式:Z=(3X+Y-5)/2設X、Y的值放在字變量VARX、VARY中,結果存放在VARZ中。算法分析:
1、乘2n和除2n可以使用算術左移和右移實現
2、其它非2n的乘除運算可以用移位和加減組合運算來實現。如
3X可以分解成2X+X2TITLEEQUATIONCOMPUTEDATASEGMENTVARXDW15VARYDW10VARZDW?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK13COMPPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVAX,VARXSHLAX,1;2*XADDAX,VARX;3*XADDAX,VARY;3X+YSUBAX,5;3*X+Y-5SARAX,1;(3*X+Y-5)/2MOVVARZ,AX;存結果
RETCOMPENDPCODEENDSENDCOMP4例5.2.2利用學號查學生的數學成績表。算法分析:首先在數據段中建立一個成績表TABLE,在表中各學生的成績按照學號從小到大的順序存放。要查的學號存放在變量NUM中,查表的結果放在變量MATH中。5
TITLETABLELOOKUPDATASEGMENTTABLEDB81,78,90,64,85,76,93,82,57,80DB73,62,87,77,74,86,95,91,82,71NUMDB8MATHDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCOSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK16START:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABLE;BX指向表首址
XORAH,AHMOVAL,NUMDECAL;實際學號是從1開始的
ADDBX,AX;BX加上學號指向要查的成績
MOVAL,[BX];查到成績送ALMOVMATH,AL;存結果
MOVAH,4CH;返回DOSINT21HCOSEGENDSENDSTART7在上述程序中,如果使用換碼指令XLAT,可以簡化程序。XLAT表首址;功能為:AL<=((BX)+(AL))換碼指令格式為:其中表首址可以省略。在XLAT指令執行前,要求將表首址的偏移量送入BX中,待查項與表首址之間的字節距離(0~255)送入AL中。8START:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABLE;BX指向表首址
;或者LEABX,TABLE ;XORAH,AHMOVAL,NUMDECAL;實際學號是從1開始的
;ADDBX,AX;BX加上學號指向要查的成績
XLAT
;MOVAL,[BX];查到成績送ALMOVMATH,AL;存結果
MOVAH,4CH;返回DOSINT21HCOSEGENDSENDSTART9一.轉移指令
目標是程序中的一個標號,表示轉移指令所轉移的目的地指令的地址。1.無條件轉移指令5.2分支程序設計分支程序結構是指程序的執行順序將根據某些指令的執行結果,選擇某些指令執行或不執行。分支程序的實現主要是由轉移指令完成。格式:JMP目標10
:JMPTARGET:TARGET:...........:根據目標所在的位置,JMP指令分為段內轉移和段間轉移。(1)段內轉移
JMP指令與轉移目標位于同一個代碼段內。轉移時IP寄存器內容被改變,而CS保持不變。程序結構:11
..….
JMPLABEL1……LABEL1:……目標地址可以有兩種提供方法:A.段內轉移直接尋址----指令中直接給出轉移目的地標號例如
..….LABEL2:…………JMPLABEL2或者12B.段內轉移間接尋址——指令中指定一個16位通用寄存器或字存儲單元,其內容為轉移目標地址。例如:JMPCX
JMPWORDPTR[BX][SI]IP<=(通用寄存器)或IP<=(EA)13(2)段間轉移——JMP指令與目標地址不在同一個段內COSEG1SEGMENTCOSEG2SEGMENT:JMPFARPTRTARGETTARGET:.........::COSEG1ENDSCOSEG2ENDSA、段間轉移直接尋址在JMP指令中,目標地址符前面加屬性說明符FAR。例如:執行該轉移指令,將同時改變CS和IP的內容。指令執行時:IP<=目標地址偏移量CS<=目標地址段基值
14B.段間間接尋址——目標地址存放在一個雙字存儲單元中低地址字單元內容為偏移量,高地址字單元內容為段基值。指令執行時,將有:
IP<=(EA)EA字單元內容
CS<=(EA+2)EA+2字單元內容例:JMPDWORDPTRADDR1;雙字單元ADDR1的內容為轉移目的地的偏移量和段基值。
JMPDWORDPTR[BX];由BX所指向的一個雙字存儲單元內容為轉移目的地的偏移量和段基值。15其中:XX為1—2個字母組合,用來表示各種條件。執行該指令時,若指定的條件成立,則轉移至目標處。否則順序執行。條件用標志寄存器中的一個或幾個標志位的狀態來表示。指令格式與段內無條件轉移直接尋址指令的情況相似.但是,該指令中的DISP的長度為一個字節。因此轉移范圍為-128—+127字節。2.條件轉移指令8086/8088指令系統有18條條件轉移指令一般格式為:JXX目標16
標志位指令轉移條件含義
CFJCCF=1有進位/借位轉移
JNCCF=0無進位/借位轉移
ZFJE/JZZF=1相等/等于0轉移
JNE/JNZZF=0不相等/不等于0轉移
SFJSSF=1是負數轉移
JNSSF=0是正數轉移
OFJOOF=1有溢出轉移
JNOOF=0無溢出轉移
PFJP/JPEPF=1有偶數個1轉移
JNP/JPOPF=0有奇數個1轉移條件轉移指令分為三大類:(1)簡單條件轉移指令——條件為單個標志位的狀態17指令轉移條件含義
JA/JNBECF=0且ZF=0A>B轉移
JAE/JNBCF=0或ZF=1A≥B轉移
JB/JNAECF=1且ZF=0A<B轉移
JBE/JNACF=1或
ZF=1A≤B轉移(2)無符號數條件轉移——在轉移指令前執行了兩個無符號數A和B相減的指令(A—B)18指令轉移條件含義
JG/JNLESF=OF且ZF=0A>B轉移
JGE/JNLSF=OF或ZF=1A≥B轉移
JL/JNGESF≠OF且ZF=0A<B轉移
JLE/JNGSF≠OF或ZF=1A≤B轉移(3)帶符號數條件轉移指令——在轉移指令之前執行了兩個帶符號數相減(A—B)的指令對于帶符號數的比較,需要使用符號標志位SF、溢出標志位OF和零標志位ZF來判斷。下面以A>B的情況為例進行分析。19A>B可以分為以下幾種情況:1.A和B都為負數若要A>B,則A-B的結果一定是正數(SF=0),也不會發生溢出(OF=0),且結果不為零(ZF=0)。2.A和B都為正數若要A>B,則A-B的結果一定是正數(SF=0),也不會發生溢出(OF=0),并且結果不為零(ZF=0)。3.A為正數,B為負數執行A-B的結果可能有兩種情況:(1)不發生溢出。這時結果為正數(SF=0),即有SF=OF。(2)發生溢出。這時結果變為負數(SF=1),即有SF=OF。20二、分支程序設計分支程序的結構有兩種常見結構:1、用比較/測試指令+條件轉移指令實現分支比較指令:CMPDEST,SRC該指令的功能與減法指令SUB相似,區別是(DEST)-(SRC)的差值不送入DEST。而其結果影響標志位。21這種類型的分支程序有兩種結構比較/測試判定條件程序段1程序段2滿足不滿足比較/測試判定條件程序段滿足不滿足一條條件轉移指令只能實現兩條分支程序的設計。要實現更多條分支的程序,需使用多條條件轉移指令。22例5.3.2數據段的ARY數組中存放有10個無符號數,試找出其中最大者送入MAX單元。算法分析:依次比較相鄰兩數的大小,將較大的送入AL中。每次比較后,較大數存放在AL中,相當于較大的數往下傳。比較一共要做9次。比較結束后,AL中存放的就是最大數。23DATASEGMENTARYDB17,5,40,0,67,12,34,78,32,10MAXDB?DATAENDS......MOVSI,OFFSETARY;SI指向ARY的第一個元素
MOVCX,9;CX作次數計數器
MOVAL,[SI];取第一個元素到ALLOP:INCSI;SI指向后一個元素
CMPAL,[SI];比較兩個數
JAEBIGER;前元素≥后元素轉移
MOVAL,[SI];取較大數到ALBIGER:DECCX;減1計數
JNZLOP;未比較完轉回去,否則順序執行
MOVMAX,AL;存最大數
.........24例5.3.4編寫一程序,實現將存儲器中的源數據塊傳送到目的數據塊。兩個數據塊分離目的塊源塊0可以從首址或末址開始傳送源塊首址<目的塊首址目的塊源塊0必須從數據塊末址開始傳送源塊首址>目的塊首址目的塊源塊0必須從數據塊首址開始傳送在存儲器中兩個數據塊的存放有三種情況:兩個數據塊分離和有部分重疊。25三種相對位置情況的傳送方法:當源塊首地址<目的塊首地址時,從數據塊末地址開始傳送。反之,則從首地址開始傳送。對于源塊和目的塊分離的情況,不論是從數據塊的首址還是末址開始傳送都可以。對于源塊與目的塊有重疊且源塊首址>目的塊首址的情況,必須從數據塊首址開始傳送。對于源塊與目的塊有重疊且源塊首址<目的塊首址的情況,必須從數據塊末址開始傳送。將上述三種情況綜合起來,只考慮源塊和目的塊的地址相對大小,傳送方法如下:26SI<=源數據塊首址DI<=目的數據塊首址CX<=傳送的字節數(SI)>(DI)?形成末址SI<=(SI)+(CX)-1DI<=(DI)+(CX)-1(DI)<=((SI))SI<=(SI)-1DI<=(DI)-1CX<=(CX)-1(CX)=0?(DI)<=((SI))SI<=(SI)+1DI<=(DI)+1CX<=(CX)-1(CX)=0?結束NYNYNYBOTTOMTOP開始27
TITLEDATABLOCKMOVEDATASEGMENTORG$+20HSTRGDB‘ABCDEFGHIJ’;數據塊LENGEQU$-STRG;數據塊字節長度BLOCK1DWSTRG;源塊首址BLOCK2DWSTRG-5;目的塊首址DATAENDSSTACK1SEGMENTSTACKDW20HDUP(0)STACK1ENDS28COSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1BEGIN:MOVAX,DATAMOVDS,AXMOVCX,LENG;設置計數器初值
MOVSI,BLOCK1;SI指向源塊首址
MOVDI,BLOCK2;DI指向目的塊首址
CMPSI,DI;源塊首址>目的塊首址嗎?
JATOP;大于則轉到TOP處,否則順序執行
ADDSI,LENG-1;SI指向源塊末址
ADDDI,LENG-1;DI指向目的塊末址29BOTTOM:MOVAL,[SI];從末址開始傳送
MOV[DI],ALDECSIDECDIDECCXJNEBOTTOMJMPEND1TOP:MOVAL,[SI];從首址開始傳送
MOV[DI],ALINCSIINCDIDECCXJNETOPEND1:MOVAH,4CHINT21HCOSEGENDSENDBEGIN302、用跳轉表形成多路分支當程序的分支數量較多時,采用跳轉表的方法可以使程序長度變短,跳轉表有兩種構成方法:(1)跳轉表用入口地址構成在程序中將各分支的入口地址組織成一個表放在數據段中,在程序中通過查表的方法獲得各分支的入口地址。31例5.3.5設某程序有10路分支,試根據變量N的值(1~10),將程序轉移到其中的一路分支去。設10路分支程序段的入口地址分別為:BRAN1、BRAN2......BRAN10。當變量N為1時,轉移到BRAN1;N為2時,轉移到BRAN2,依次類推。在跳轉表中每兩個字節存放一個入口地址的偏移量,如右圖所示。跳轉表程序中,先根據N的值形成查表地址:(N-1)×2+表首址。32開始BX<=表首址求查表地址:BX<=(N-1)*2+(BX)獲得入口地址:CX<=((BX))(CX)=?結束N=1BRAN1N=2BRAN2N=10BRAN10……多路分支結構流程圖33TITLEJUMPTABLEOFADDRESSDATASEGMENTATABLEDWBRAN1,BRAN2,BRAN3,...,BRAN10NDB3DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AX...
34XORAH,AHMOVAL,NDECALSHLAL,1MOVBX,OFFSETATABLE;BX指向表首址ADDBX,AX;BX指向查表地址MOVCX,[BX];將N對應的分支入口地址送到CX中JMPCX;轉移到N對應的分支入口地址35BRAN1: JMPEND1 BRAN2:JMPEND1BRAN3:JMPEND1
BRAN10:END1:MOVAH,4CHINT21HCODEENDSENDSTART36跳轉表的每一個項目就是一條無條件轉移指令。這時跳轉表是代碼段中的一段程序。(2)跳轉表用無條件轉移指令構成37TITLEJUMPTABLEOFINSTRUCTIONDATASEGMENTNDB3DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AX...MOVBH,0MOVBL,N例5.3.5的源程序可修改為如下程序:38DECBL;四條指令實現(N-1)*3
MOVAL,BL
SHLBL,1
ADDBL,AL
ADDBX,OFFSETITABLE;BX指向查表地址
JMPBX;轉移到N對應的JMP指令
JMPBRAN1;JMP指令構成的跳轉表JMPBRAN2
JMPBRAN3::JMPBRAN10ITABLE:39BRAN1:...:JMPEND1BRAN2:...:JMPEND1::BRAN10:...::END1:MOVAH,4CHINT21HCODEENDSENDSTART408086/8088指令系統中有4條循環控制指令,長度都是2字節。指令使用CX寄存器做循環計數。循環控制指令的執行對標志位沒有影響。5.3循環程序設計一、循環控制指令1、LOOP指令2、LOOPE/LOOPZ指令3、LOOPNE/LOOPNZ指令4、JCXZ指令41其中目標是程序中的一個標號。執行一次LOOP指令將使:CX<=(CX)—1若(CX)≠0,則轉到目標處執行,否則順序執行。
例5.4.1在例5.3.2中,數據段的ARY數組中存放有10個無符號數,試找出其中最大者送入MAX單元。若使用循環指令,則程序可修改如下:1、LOOP指令格式:LOOP目標42源程序結構如下:DATASEGMENTARYDB17,5,40,0,67,12,34,78,32,10LENEQU$-ARYMAXDB?DATAENDS::MOVSI,OFFSETARY;SI指向ARY的第一個元素
MOVCX,LEN-1;CX作循環次數計數
MOVAL,[SI]LOP:INCSICMPAL,[SI]JAEBIGERMOVAL,[SI]BIGER:LOOPLOPMOVMAX,AL……43指令執行:CX<=(CX)—1,若(CX)≠0且ZF=1,則轉到目標處執行,否則順序執行。DATASEGMENTSTRGDB‘CHECKNO_SPACE’LENGEQU$-STRGINDEXDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDS
例5.4.2編寫一程序,在一字符串中查找第一個非空格字符,并將其在字符串中的序號(1~n)送入INDEX單元中。若未找到,則將INDEX單元置為全1。2、LOOPE/LOOPZ指令格式:LOOPE目標或LOOPZ目標44CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVCX,LENG;字符串長度送入CXMOVBX,-1;設地址指針初值NEXT:INCBXCMPSTRG[BX],''LOOPENEXT;是空格字符且計數不為0,繼續查找
JNZFOUND;找到非空格字符,轉FOUNDMOVBL,0FEH;未找到非空格字符FOUND:INCBL;使位置序號從1開始
MOVINDEX,BL;存結果
MOVAH,4CHINT21HCODEENDSENDSTART45指令執行:CX<=(CX)—1,若(CX)≠0且ZF=0,則轉到目標處執行,否則順序執行。
例5.4.3編寫程序,計算兩個字節數組ARY1和ARY2對應元素之和,一直計算到兩數之和為0或數組結束為止。并將和存入數組SUM中,將該數組的長度存放在NUM單元中。3、LOOPNE/LOOPNZ指令使用格式:LOOPNE目標或LOOPNZ目標46源程序如下:DATASEGMENTARY1DB12,10,3,5,-1,7,34,8,9,10ARY2DB14,23,6,-2,1,9,45,21,8,24LENGEQUARY2-ARY1SUMDBLENGDUP(?)NUMDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDS
CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1BEGIN:MOVAX,DATA
MOVDS,AX47
MOVCX,LENGMOVBX,-1;設置指針初值NZERO:INCBXMOVAL,ARY1[BX];取被加數
ADDAL,ARY2[BX]MOVSUM[BX],ALLOOPNENZERO;和不為0轉到NZERO處
JZZERO;和為0轉到ZERO處
INCBLZERO:MOVNUM,BL;存結果數組長度
MOVAH,4CHINT21HCODEENDSENDBEGIN484、JCXZ指令指令格式:JCXZ目標該指令測試CX的內容是否為0,如果(CX)=0,則轉移到目標處指令,否則順序執行。該指令相當于條件轉移指令。它一般用在一個循環的開始,當循環次數計數寄存器CX為0時,就不執行該循環。如果沒有這個控制,將使得循環次數變得非常大(0-1=0FFFFH),從而產生錯誤結果。49程序結構為:
..........MOVCX,COUNTJCXZNEXTLOP:..........LOOPLOPNEXT:..............50二、循環程序的結構循環程序有兩種結構形式1、先執行后判斷結構2、先判斷后執行結構循環初始化部分循環體控制條件結束處理部分NY循環初始化部分控制條件結束處理部分循環體NY51在循環程序中主要包括以下四個部分:用于建立循環的初始狀態。包括:循環次數計數器、地址指針以及其他循環參數的初始設定。循環程序完成的主要任務。包括工作部分和修改部分。工作部分:是完成循環程序任務的主要程序段。修改部分:為循環的重復執行,完成某些參數的修改。1、初始化部分2、循環體52判斷循環條件是否成立。可以有以下兩種判斷方法:(1)用計數控制循環——循環次數已知(2)用條件控制循環——循環次數未知處理循環結束后的結果。如存儲結果等。3、循環控制部分4、結束處理部分53三、單循環程序設計單循環程序的循環體由順序結構或分支結構組成常選用CX作計數器,可選用LOOP、LOOPE或LOOPNE等循環控制指令。1、計數控制循環54
由于循環體中有“+”和“-”兩種可能的運算,通過設置標志0和1來判斷。八個運算表達式由8位邏輯尺:10011010B來識別。
例5.4.4設有兩個數組X和Y,它們都有8個元素,其元素按下標從小到大的順序存放在數據段中。試編寫程序完成下列計算:Z1=X1+Y1Z2=X2-Y2Z3=X3+Y3Z4=X4-Y4Z5=X5-Y5Z6=X6+Y6Z7=X7+Y7Z8=X8-Y8開始初始化:置指針SI<=0;CX<=計數初值BL<=邏輯尺BL右移一位到CFCF=?Xi—YiXi+YiZi<=結果修改指針:SI<=(SI)+1CX<=(CX)-1(cx)=0?結束=1=0NY55DATASEGMENTXDB0A2H,7CH,34H,9FH,0F4H,10H,39H,5BHYDB14H,05BH,28H,7AH,0EH,13H,46H,2CHLENEQU$—YZDBLENDUP(?)LOGRDB10011010BDATAENDSSTACK0SEGMENTPARASTACKDW20HDUP(0)STACK0ENDSCOSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK0BEGIN:MOVAX,DATAMOVDS,AXMOVCX,LEN;初始化計數器
MOVSI,0;初始化指針
MOVBL,LOGR;初始化邏輯尺56LOP:MOVAL,X[SI]SHRBL,1;標志位送CFJCSUB1;為1,轉做減法
ADDAL,Y[SI];為0,做加法
JMPRESSUB1:SUBAL,Y[SI]RES:MOVZ[SI],AL;存結果
INCSI;修改指針
LOOPLOPMOVAH,4CHINT21HCOSEGENDSENDBEGIN572、條件控制循環
例5.4.5編寫一程序,將用二進制數表示的字單元VARW中“1”的個數統計出來,存入CONT單元中。
本例中通過將字單元各位逐位移入最高位來判斷
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 儀器買賣責任合同標準文本
- 臨時保安勞務合同樣本
- ppp政府項目合同樣本
- 個人向個人合同樣本
- 輔導員招聘考試職業素養與領導能力考核試題及答案
- 公司標準采購合同樣本
- 借款抵押合同樣本個人
- 高校輔導員如何提升自我效能感及試題及答案
- 公路借用合同樣本
- 代辦公司合同樣本
- Starter Unit2 單詞英漢互譯 2024-2025學年人教版英語七年級上冊
- 投資資金合同協議書
- 股權轉讓確認函
- YDT 4492-2023工業互聯網 時間敏感網絡技術要求
- 徐州2024年江蘇徐州睢寧縣招聘教師306人筆試歷年典型考題及考點附答案解析
- 設計和開發控制程序-國軍標
- 紀念中國第一顆原子彈爆炸50周年
- 江西省南昌二十八中教育集團2023-2024學年八年級下學期期中考試數學試卷
- 中考數學專題復習《代數推理題》知識點梳理及典例講解課件
- 第十六章-中國文化的基本精神
- 小學語文六年級下冊第三單元作業設計
評論
0/150
提交評論