IBM-PC匯編語言程序設(shè)計(jì)第5章_第1頁(yè)
IBM-PC匯編語言程序設(shè)計(jì)第5章_第2頁(yè)
IBM-PC匯編語言程序設(shè)計(jì)第5章_第3頁(yè)
IBM-PC匯編語言程序設(shè)計(jì)第5章_第4頁(yè)
IBM-PC匯編語言程序設(shè)計(jì)第5章_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

本章主要內(nèi)容:順序程序設(shè)計(jì)無條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令分支程序設(shè)計(jì)循環(huán)控制指令循環(huán)程序設(shè)計(jì)第五章程序控制結(jié)構(gòu)及其設(shè)計(jì)技術(shù)15.1順序程序設(shè)計(jì)順序程序是指程序的結(jié)構(gòu)從開始到結(jié)尾一直是順序執(zhí)行,中途沒有分支。例5.2.1試編寫程序計(jì)算以下表達(dá)式:Z=(3X+Y-5)/2設(shè)X、Y的值放在字變量VARX、VARY中,結(jié)果存放在VARZ中。算法分析:

1、乘2n和除2n可以使用算術(shù)左移和右移實(shí)現(xiàn)

2、其它非2n的乘除運(yùn)算可以用移位和加減組合運(yùn)算來實(shí)現(xiàn)。如

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;存結(jié)果

RETCOMPENDPCODEENDSENDCOMP4例5.2.2利用學(xué)號(hào)查學(xué)生的數(shù)學(xué)成績(jī)表。算法分析:首先在數(shù)據(jù)段中建立一個(gè)成績(jī)表TABLE,在表中各學(xué)生的成績(jī)按照學(xué)號(hào)從小到大的順序存放。要查的學(xué)號(hào)存放在變量NUM中,查表的結(jié)果放在變量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;實(shí)際學(xué)號(hào)是從1開始的

ADDBX,AX;BX加上學(xué)號(hào)指向要查的成績(jī)

MOVAL,[BX];查到成績(jī)送ALMOVMATH,AL;存結(jié)果

MOVAH,4CH;返回DOSINT21HCOSEGENDSENDSTART7在上述程序中,如果使用換碼指令XLAT,可以簡(jiǎn)化程序。XLAT表首址;功能為:AL<=((BX)+(AL))換碼指令格式為:其中表首址可以省略。在XLAT指令執(zhí)行前,要求將表首址的偏移量送入BX中,待查項(xiàng)與表首址之間的字節(jié)距離(0~255)送入AL中。8START:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABLE;BX指向表首址

;或者LEABX,TABLE ;XORAH,AHMOVAL,NUMDECAL;實(shí)際學(xué)號(hào)是從1開始的

;ADDBX,AX;BX加上學(xué)號(hào)指向要查的成績(jī)

XLAT

;MOVAL,[BX];查到成績(jī)送ALMOVMATH,AL;存結(jié)果

MOVAH,4CH;返回DOSINT21HCOSEGENDSENDSTART9一.轉(zhuǎn)移指令

目標(biāo)是程序中的一個(gè)標(biāo)號(hào),表示轉(zhuǎn)移指令所轉(zhuǎn)移的目的地指令的地址。1.無條件轉(zhuǎn)移指令5.2分支程序設(shè)計(jì)分支程序結(jié)構(gòu)是指程序的執(zhí)行順序?qū)⒏鶕?jù)某些指令的執(zhí)行結(jié)果,選擇某些指令執(zhí)行或不執(zhí)行。分支程序的實(shí)現(xiàn)主要是由轉(zhuǎn)移指令完成。格式:JMP目標(biāo)10

:JMPTARGET:TARGET:...........:根據(jù)目標(biāo)所在的位置,JMP指令分為段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移。(1)段內(nèi)轉(zhuǎn)移

JMP指令與轉(zhuǎn)移目標(biāo)位于同一個(gè)代碼段內(nèi)。轉(zhuǎn)移時(shí)IP寄存器內(nèi)容被改變,而CS保持不變。程序結(jié)構(gòu):11

..….

JMPLABEL1……LABEL1:……目標(biāo)地址可以有兩種提供方法:A.段內(nèi)轉(zhuǎn)移直接尋址----指令中直接給出轉(zhuǎn)移目的地標(biāo)號(hào)例如

..….LABEL2:…………JMPLABEL2或者12B.段內(nèi)轉(zhuǎn)移間接尋址——指令中指定一個(gè)16位通用寄存器或字存儲(chǔ)單元,其內(nèi)容為轉(zhuǎn)移目標(biāo)地址。例如:JMPCX

JMPWORDPTR[BX][SI]IP<=(通用寄存器)或IP<=(EA)13(2)段間轉(zhuǎn)移——JMP指令與目標(biāo)地址不在同一個(gè)段內(nèi)COSEG1SEGMENTCOSEG2SEGMENT:JMPFARPTRTARGETTARGET:.........::COSEG1ENDSCOSEG2ENDSA、段間轉(zhuǎn)移直接尋址在JMP指令中,目標(biāo)地址符前面加屬性說明符FAR。例如:執(zhí)行該轉(zhuǎn)移指令,將同時(shí)改變CS和IP的內(nèi)容。指令執(zhí)行時(shí):IP<=目標(biāo)地址偏移量CS<=目標(biāo)地址段基值

14B.段間間接尋址——目標(biāo)地址存放在一個(gè)雙字存儲(chǔ)單元中低地址字單元內(nèi)容為偏移量,高地址字單元內(nèi)容為段基值。指令執(zhí)行時(shí),將有:

IP<=(EA)EA字單元內(nèi)容

CS<=(EA+2)EA+2字單元內(nèi)容例:JMPDWORDPTRADDR1;雙字單元ADDR1的內(nèi)容為轉(zhuǎn)移目的地的偏移量和段基值。

JMPDWORDPTR[BX];由BX所指向的一個(gè)雙字存儲(chǔ)單元內(nèi)容為轉(zhuǎn)移目的地的偏移量和段基值。15其中:XX為1—2個(gè)字母組合,用來表示各種條件。執(zhí)行該指令時(shí),若指定的條件成立,則轉(zhuǎn)移至目標(biāo)處。否則順序執(zhí)行。條件用標(biāo)志寄存器中的一個(gè)或幾個(gè)標(biāo)志位的狀態(tài)來表示。指令格式與段內(nèi)無條件轉(zhuǎn)移直接尋址指令的情況相似.但是,該指令中的DISP的長(zhǎng)度為一個(gè)字節(jié)。因此轉(zhuǎn)移范圍為-128—+127字節(jié)。2.條件轉(zhuǎn)移指令8086/8088指令系統(tǒng)有18條條件轉(zhuǎn)移指令一般格式為:JXX目標(biāo)16

標(biāo)志位指令轉(zhuǎn)移條件含義

CFJCCF=1有進(jìn)位/借位轉(zhuǎn)移

JNCCF=0無進(jìn)位/借位轉(zhuǎn)移

ZFJE/JZZF=1相等/等于0轉(zhuǎn)移

JNE/JNZZF=0不相等/不等于0轉(zhuǎn)移

SFJSSF=1是負(fù)數(shù)轉(zhuǎn)移

JNSSF=0是正數(shù)轉(zhuǎn)移

OFJOOF=1有溢出轉(zhuǎn)移

JNOOF=0無溢出轉(zhuǎn)移

PFJP/JPEPF=1有偶數(shù)個(gè)1轉(zhuǎn)移

JNP/JPOPF=0有奇數(shù)個(gè)1轉(zhuǎn)移條件轉(zhuǎn)移指令分為三大類:(1)簡(jiǎn)單條件轉(zhuǎn)移指令——條件為單個(gè)標(biāo)志位的狀態(tài)17指令轉(zhuǎn)移條件含義

JA/JNBECF=0且ZF=0A>B轉(zhuǎn)移

JAE/JNBCF=0或ZF=1A≥B轉(zhuǎn)移

JB/JNAECF=1且ZF=0A<B轉(zhuǎn)移

JBE/JNACF=1或

ZF=1A≤B轉(zhuǎn)移(2)無符號(hào)數(shù)條件轉(zhuǎn)移——在轉(zhuǎn)移指令前執(zhí)行了兩個(gè)無符號(hào)數(shù)A和B相減的指令(A—B)18指令轉(zhuǎn)移條件含義

JG/JNLESF=OF且ZF=0A>B轉(zhuǎn)移

JGE/JNLSF=OF或ZF=1A≥B轉(zhuǎn)移

JL/JNGESF≠OF且ZF=0A<B轉(zhuǎn)移

JLE/JNGSF≠OF或ZF=1A≤B轉(zhuǎn)移(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令——在轉(zhuǎn)移指令之前執(zhí)行了兩個(gè)帶符號(hào)數(shù)相減(A—B)的指令對(duì)于帶符號(hào)數(shù)的比較,需要使用符號(hào)標(biāo)志位SF、溢出標(biāo)志位OF和零標(biāo)志位ZF來判斷。下面以A>B的情況為例進(jìn)行分析。19A>B可以分為以下幾種情況:1.A和B都為負(fù)數(shù)若要A>B,則A-B的結(jié)果一定是正數(shù)(SF=0),也不會(huì)發(fā)生溢出(OF=0),且結(jié)果不為零(ZF=0)。2.A和B都為正數(shù)若要A>B,則A-B的結(jié)果一定是正數(shù)(SF=0),也不會(huì)發(fā)生溢出(OF=0),并且結(jié)果不為零(ZF=0)。3.A為正數(shù),B為負(fù)數(shù)執(zhí)行A-B的結(jié)果可能有兩種情況:(1)不發(fā)生溢出。這時(shí)結(jié)果為正數(shù)(SF=0),即有SF=OF。(2)發(fā)生溢出。這時(shí)結(jié)果變?yōu)樨?fù)數(shù)(SF=1),即有SF=OF。20二、分支程序設(shè)計(jì)分支程序的結(jié)構(gòu)有兩種常見結(jié)構(gòu):1、用比較/測(cè)試指令+條件轉(zhuǎn)移指令實(shí)現(xiàn)分支比較指令:CMPDEST,SRC該指令的功能與減法指令SUB相似,區(qū)別是(DEST)-(SRC)的差值不送入DEST。而其結(jié)果影響標(biāo)志位。21這種類型的分支程序有兩種結(jié)構(gòu)比較/測(cè)試判定條件程序段1程序段2滿足不滿足比較/測(cè)試判定條件程序段滿足不滿足一條條件轉(zhuǎn)移指令只能實(shí)現(xiàn)兩條分支程序的設(shè)計(jì)。要實(shí)現(xiàn)更多條分支的程序,需使用多條條件轉(zhuǎn)移指令。22例5.3.2數(shù)據(jù)段的ARY數(shù)組中存放有10個(gè)無符號(hào)數(shù),試找出其中最大者送入MAX單元。算法分析:依次比較相鄰兩數(shù)的大小,將較大的送入AL中。每次比較后,較大數(shù)存放在AL中,相當(dāng)于較大的數(shù)往下傳。比較一共要做9次。比較結(jié)束后,AL中存放的就是最大數(shù)。23DATASEGMENTARYDB17,5,40,0,67,12,34,78,32,10MAXDB?DATAENDS......MOVSI,OFFSETARY;SI指向ARY的第一個(gè)元素

MOVCX,9;CX作次數(shù)計(jì)數(shù)器

MOVAL,[SI];取第一個(gè)元素到ALLOP:INCSI;SI指向后一個(gè)元素

CMPAL,[SI];比較兩個(gè)數(shù)

JAEBIGER;前元素≥后元素轉(zhuǎn)移

MOVAL,[SI];取較大數(shù)到ALBIGER:DECCX;減1計(jì)數(shù)

JNZLOP;未比較完轉(zhuǎn)回去,否則順序執(zhí)行

MOVMAX,AL;存最大數(shù)

.........24例5.3.4編寫一程序,實(shí)現(xiàn)將存儲(chǔ)器中的源數(shù)據(jù)塊傳送到目的數(shù)據(jù)塊。兩個(gè)數(shù)據(jù)塊分離目的塊源塊0可以從首址或末址開始傳送源塊首址<目的塊首址目的塊源塊0必須從數(shù)據(jù)塊末址開始傳送源塊首址>目的塊首址目的塊源塊0必須從數(shù)據(jù)塊首址開始傳送在存儲(chǔ)器中兩個(gè)數(shù)據(jù)塊的存放有三種情況:兩個(gè)數(shù)據(jù)塊分離和有部分重疊。25三種相對(duì)位置情況的傳送方法:當(dāng)源塊首地址<目的塊首地址時(shí),從數(shù)據(jù)塊末地址開始傳送。反之,則從首地址開始傳送。對(duì)于源塊和目的塊分離的情況,不論是從數(shù)據(jù)塊的首址還是末址開始傳送都可以。對(duì)于源塊與目的塊有重疊且源塊首址>目的塊首址的情況,必須從數(shù)據(jù)塊首址開始傳送。對(duì)于源塊與目的塊有重疊且源塊首址<目的塊首址的情況,必須從數(shù)據(jù)塊末址開始傳送。將上述三種情況綜合起來,只考慮源塊和目的塊的地址相對(duì)大小,傳送方法如下:26SI<=源數(shù)據(jù)塊首址DI<=目的數(shù)據(jù)塊首址CX<=傳送的字節(jié)數(shù)(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?結(jié)束NYNYNYBOTTOMTOP開始27

TITLEDATABLOCKMOVEDATASEGMENTORG$+20HSTRGDB‘ABCDEFGHIJ’;數(shù)據(jù)塊LENGEQU$-STRG;數(shù)據(jù)塊字節(jié)長(zhǎng)度BLOCK1DWSTRG;源塊首址BLOCK2DWSTRG-5;目的塊首址DATAENDSSTACK1SEGMENTSTACKDW20HDUP(0)STACK1ENDS28COSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1BEGIN:MOVAX,DATAMOVDS,AXMOVCX,LENG;設(shè)置計(jì)數(shù)器初值

MOVSI,BLOCK1;SI指向源塊首址

MOVDI,BLOCK2;DI指向目的塊首址

CMPSI,DI;源塊首址>目的塊首址嗎?

JATOP;大于則轉(zhuǎn)到TOP處,否則順序執(zhí)行

ADDSI,LENG-1;SI指向源塊末址

ADDDI,LENG-1;DI指向目的塊末址29BOTTOM:MOVAL,[SI];從末址開始傳送

MOV[DI],ALDECSIDECDIDECCXJNEBOTTOMJMPEND1TOP:MOVAL,[SI];從首址開始傳送

MOV[DI],ALINCSIINCDIDECCXJNETOPEND1:MOVAH,4CHINT21HCOSEGENDSENDBEGIN302、用跳轉(zhuǎn)表形成多路分支當(dāng)程序的分支數(shù)量較多時(shí),采用跳轉(zhuǎn)表的方法可以使程序長(zhǎng)度變短,跳轉(zhuǎn)表有兩種構(gòu)成方法:(1)跳轉(zhuǎn)表用入口地址構(gòu)成在程序中將各分支的入口地址組織成一個(gè)表放在數(shù)據(jù)段中,在程序中通過查表的方法獲得各分支的入口地址。31例5.3.5設(shè)某程序有10路分支,試根據(jù)變量N的值(1~10),將程序轉(zhuǎn)移到其中的一路分支去。設(shè)10路分支程序段的入口地址分別為:BRAN1、BRAN2......BRAN10。當(dāng)變量N為1時(shí),轉(zhuǎn)移到BRAN1;N為2時(shí),轉(zhuǎn)移到BRAN2,依次類推。在跳轉(zhuǎn)表中每?jī)蓚€(gè)字節(jié)存放一個(gè)入口地址的偏移量,如右圖所示。跳轉(zhuǎn)表程序中,先根據(jù)N的值形成查表地址:(N-1)×2+表首址。32開始BX<=表首址求查表地址:BX<=(N-1)*2+(BX)獲得入口地址:CX<=((BX))(CX)=?結(jié)束N=1BRAN1N=2BRAN2N=10BRAN10……多路分支結(jié)構(gòu)流程圖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對(duì)應(yīng)的分支入口地址送到CX中JMPCX;轉(zhuǎn)移到N對(duì)應(yīng)的分支入口地址35BRAN1: JMPEND1 BRAN2:JMPEND1BRAN3:JMPEND1

BRAN10:END1:MOVAH,4CHINT21HCODEENDSENDSTART36跳轉(zhuǎn)表的每一個(gè)項(xiàng)目就是一條無條件轉(zhuǎn)移指令。這時(shí)跳轉(zhuǎn)表是代碼段中的一段程序。(2)跳轉(zhuǎn)表用無條件轉(zhuǎn)移指令構(gòu)成37TITLEJUMPTABLEOFINSTRUCTIONDATASEGMENTNDB3DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AX...MOVBH,0MOVBL,N例5.3.5的源程序可修改為如下程序:38DECBL;四條指令實(shí)現(xiàn)(N-1)*3

MOVAL,BL

SHLBL,1

ADDBL,AL

ADDBX,OFFSETITABLE;BX指向查表地址

JMPBX;轉(zhuǎn)移到N對(duì)應(yīng)的JMP指令

JMPBRAN1;JMP指令構(gòu)成的跳轉(zhuǎn)表JMPBRAN2

JMPBRAN3::JMPBRAN10ITABLE:39BRAN1:...:JMPEND1BRAN2:...:JMPEND1::BRAN10:...::END1:MOVAH,4CHINT21HCODEENDSENDSTART408086/8088指令系統(tǒng)中有4條循環(huán)控制指令,長(zhǎng)度都是2字節(jié)。指令使用CX寄存器做循環(huán)計(jì)數(shù)。循環(huán)控制指令的執(zhí)行對(duì)標(biāo)志位沒有影響。5.3循環(huán)程序設(shè)計(jì)一、循環(huán)控制指令1、LOOP指令2、LOOPE/LOOPZ指令3、LOOPNE/LOOPNZ指令4、JCXZ指令41其中目標(biāo)是程序中的一個(gè)標(biāo)號(hào)。執(zhí)行一次LOOP指令將使:CX<=(CX)—1若(CX)≠0,則轉(zhuǎn)到目標(biāo)處執(zhí)行,否則順序執(zhí)行。

例5.4.1在例5.3.2中,數(shù)據(jù)段的ARY數(shù)組中存放有10個(gè)無符號(hào)數(shù),試找出其中最大者送入MAX單元。若使用循環(huán)指令,則程序可修改如下:1、LOOP指令格式:LOOP目標(biāo)42源程序結(jié)構(gòu)如下:DATASEGMENTARYDB17,5,40,0,67,12,34,78,32,10LENEQU$-ARYMAXDB?DATAENDS::MOVSI,OFFSETARY;SI指向ARY的第一個(gè)元素

MOVCX,LEN-1;CX作循環(huán)次數(shù)計(jì)數(shù)

MOVAL,[SI]LOP:INCSICMPAL,[SI]JAEBIGERMOVAL,[SI]BIGER:LOOPLOPMOVMAX,AL……43指令執(zhí)行:CX<=(CX)—1,若(CX)≠0且ZF=1,則轉(zhuǎn)到目標(biāo)處執(zhí)行,否則順序執(zhí)行。DATASEGMENTSTRGDB‘CHECKNO_SPACE’LENGEQU$-STRGINDEXDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDS

例5.4.2編寫一程序,在一字符串中查找第一個(gè)非空格字符,并將其在字符串中的序號(hào)(1~n)送入INDEX單元中。若未找到,則將INDEX單元置為全1。2、LOOPE/LOOPZ指令格式:LOOPE目標(biāo)或LOOPZ目標(biāo)44CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVCX,LENG;字符串長(zhǎng)度送入CXMOVBX,-1;設(shè)地址指針初值NEXT:INCBXCMPSTRG[BX],''LOOPENEXT;是空格字符且計(jì)數(shù)不為0,繼續(xù)查找

JNZFOUND;找到非空格字符,轉(zhuǎn)FOUNDMOVBL,0FEH;未找到非空格字符FOUND:INCBL;使位置序號(hào)從1開始

MOVINDEX,BL;存結(jié)果

MOVAH,4CHINT21HCODEENDSENDSTART45指令執(zhí)行:CX<=(CX)—1,若(CX)≠0且ZF=0,則轉(zhuǎn)到目標(biāo)處執(zhí)行,否則順序執(zhí)行。

例5.4.3編寫程序,計(jì)算兩個(gè)字節(jié)數(shù)組ARY1和ARY2對(duì)應(yīng)元素之和,一直計(jì)算到兩數(shù)之和為0或數(shù)組結(jié)束為止。并將和存入數(shù)組SUM中,將該數(shù)組的長(zhǎng)度存放在NUM單元中。3、LOOPNE/LOOPNZ指令使用格式:LOOPNE目標(biāo)或LOOPNZ目標(biāo)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;設(shè)置指針初值NZERO:INCBXMOVAL,ARY1[BX];取被加數(shù)

ADDAL,ARY2[BX]MOVSUM[BX],ALLOOPNENZERO;和不為0轉(zhuǎn)到NZERO處

JZZERO;和為0轉(zhuǎn)到ZERO處

INCBLZERO:MOVNUM,BL;存結(jié)果數(shù)組長(zhǎng)度

MOVAH,4CHINT21HCODEENDSENDBEGIN484、JCXZ指令指令格式:JCXZ目標(biāo)該指令測(cè)試CX的內(nèi)容是否為0,如果(CX)=0,則轉(zhuǎn)移到目標(biāo)處指令,否則順序執(zhí)行。該指令相當(dāng)于條件轉(zhuǎn)移指令。它一般用在一個(gè)循環(huán)的開始,當(dāng)循環(huán)次數(shù)計(jì)數(shù)寄存器CX為0時(shí),就不執(zhí)行該循環(huán)。如果沒有這個(gè)控制,將使得循環(huán)次數(shù)變得非常大(0-1=0FFFFH),從而產(chǎn)生錯(cuò)誤結(jié)果。49程序結(jié)構(gòu)為:

..........MOVCX,COUNTJCXZNEXTLOP:..........LOOPLOPNEXT:..............50二、循環(huán)程序的結(jié)構(gòu)循環(huán)程序有兩種結(jié)構(gòu)形式1、先執(zhí)行后判斷結(jié)構(gòu)2、先判斷后執(zhí)行結(jié)構(gòu)循環(huán)初始化部分循環(huán)體控制條件結(jié)束處理部分NY循環(huán)初始化部分控制條件結(jié)束處理部分循環(huán)體NY51在循環(huán)程序中主要包括以下四個(gè)部分:用于建立循環(huán)的初始狀態(tài)。包括:循環(huán)次數(shù)計(jì)數(shù)器、地址指針以及其他循環(huán)參數(shù)的初始設(shè)定。循環(huán)程序完成的主要任務(wù)。包括工作部分和修改部分。工作部分:是完成循環(huán)程序任務(wù)的主要程序段。修改部分:為循環(huán)的重復(fù)執(zhí)行,完成某些參數(shù)的修改。1、初始化部分2、循環(huán)體52判斷循環(huán)條件是否成立??梢杂幸韵聝煞N判斷方法:(1)用計(jì)數(shù)控制循環(huán)——循環(huán)次數(shù)已知(2)用條件控制循環(huán)——循環(huán)次數(shù)未知處理循環(huán)結(jié)束后的結(jié)果。如存儲(chǔ)結(jié)果等。3、循環(huán)控制部分4、結(jié)束處理部分53三、單循環(huán)程序設(shè)計(jì)單循環(huán)程序的循環(huán)體由順序結(jié)構(gòu)或分支結(jié)構(gòu)組成常選用CX作計(jì)數(shù)器,可選用LOOP、LOOPE或LOOPNE等循環(huán)控制指令。1、計(jì)數(shù)控制循環(huán)54

由于循環(huán)體中有“+”和“-”兩種可能的運(yùn)算,通過設(shè)置標(biāo)志0和1來判斷。八個(gè)運(yùn)算表達(dá)式由8位邏輯尺:10011010B來識(shí)別。

例5.4.4設(shè)有兩個(gè)數(shù)組X和Y,它們都有8個(gè)元素,其元素按下標(biāo)從小到大的順序存放在數(shù)據(jù)段中。試編寫程序完成下列計(jì)算:Z1=X1+Y1Z2=X2-Y2Z3=X3+Y3Z4=X4-Y4Z5=X5-Y5Z6=X6+Y6Z7=X7+Y7Z8=X8-Y8開始初始化:置指針SI<=0;CX<=計(jì)數(shù)初值BL<=邏輯尺BL右移一位到CFCF=?Xi—YiXi+YiZi<=結(jié)果修改指針:SI<=(SI)+1CX<=(CX)-1(cx)=0?結(jié)束=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;初始化計(jì)數(shù)器

MOVSI,0;初始化指針

MOVBL,LOGR;初始化邏輯尺56LOP:MOVAL,X[SI]SHRBL,1;標(biāo)志位送CFJCSUB1;為1,轉(zhuǎn)做減法

ADDAL,Y[SI];為0,做加法

JMPRESSUB1:SUBAL,Y[SI]RES:MOVZ[SI],AL;存結(jié)果

INCSI;修改指針

LOOPLOPMOVAH,4CHINT21HCOSEGENDSENDBEGIN572、條件控制循環(huán)

例5.4.5編寫一程序,將用二進(jìn)制數(shù)表示的字單元VARW中“1”的個(gè)數(shù)統(tǒng)計(jì)出來,存入CONT單元中。

本例中通過將字單元各位逐位移入最高位來判斷

溫馨提示

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