循環(huán)與分支程序設(shè)計課件_第1頁
循環(huán)與分支程序設(shè)計課件_第2頁
循環(huán)與分支程序設(shè)計課件_第3頁
循環(huán)與分支程序設(shè)計課件_第4頁
循環(huán)與分支程序設(shè)計課件_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第五章循環(huán)與分支程序設(shè)計§5.1循環(huán)與轉(zhuǎn)移指令§5.2循環(huán)程序設(shè)計§5.3分支程序設(shè)計第五章循環(huán)與分支程序設(shè)計§5.1循環(huán)與轉(zhuǎn)移指令一、循環(huán)控制指令二、轉(zhuǎn)移指令控制轉(zhuǎn)移類指令通過改變IP(和CS)值,實現(xiàn)程序執(zhí)行順序的改變§5.1循環(huán)與轉(zhuǎn)移指令一、循環(huán)控制指令控制轉(zhuǎn)移類指令通過改一、循環(huán)控制指令8086指令系統(tǒng)的循環(huán)控制指令均為二字節(jié)指令一字節(jié)為轉(zhuǎn)移的相對位移量(8位帶符號的二進(jìn)制數(shù)) IP←IP+相對位移量

EIP←EIP+相對位移量隱含使用CX作為循環(huán)計數(shù)器

程序中的某段需反復(fù)執(zhí)行若干次時,用循環(huán)來實現(xiàn)短轉(zhuǎn)移一、循環(huán)控制指令8086指令系統(tǒng)的循環(huán)控制指令均為二字節(jié)指令LOOPlabel

;CX←CX-1,CX≠0,循環(huán)到標(biāo)號label一、循環(huán)控制指令LOOPE/LOOPZlabel ;CX←CX-1,CX≠0且ZF=1,循環(huán)到標(biāo)號labelLOOPNE/NZlabel ;CX←CX-1,CX≠0且ZF=0,循環(huán)到標(biāo)號label等于時循環(huán)不等于時循環(huán)LOOPlabel 一、循環(huán)控制指令LOOPE/L一、循環(huán)控制指令(例) MOVCX,COUNT ;設(shè)置循環(huán)次數(shù)

MOVSI,OFFSETDATA_BYTE XORAX,AX ;BX清0,用于存放累加和AGAIN: ADDAL,[SI] ADCAH,0

INCSI LOOPAGAIN ;計數(shù)器減1,不為0繼續(xù)循環(huán)一、循環(huán)控制指令(例) MOVCX,COUNT ;設(shè)置循一、循環(huán)控制指令(例) MOVCX,COUNT ;設(shè)置循環(huán)次數(shù)

MOVSI,OFFSETSTRING XORBX,BX ;BX清0,用于記錄空格數(shù)

MOVAL,20HAGAIN: CMPAL,[SI] JNZNEXT ;ZF=0,非空格,轉(zhuǎn)移

INCBX ;ZF=1,是空格,個數(shù)加1 NEXT: INCSI LOOPAGAIN ;計數(shù)器減1,不為0繼續(xù)循環(huán)一、循環(huán)控制指令(例) MOVCX,COUNT ;設(shè)置循二、轉(zhuǎn)移指令無條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令二、轉(zhuǎn)移指令無條件轉(zhuǎn)移指令 JMPlabel

;程序轉(zhuǎn)向label標(biāo)號指定的地址NEARFAR只要執(zhí)行無條件轉(zhuǎn)移指令JMP,就使程序轉(zhuǎn)到指定的目標(biāo)地址處,從目標(biāo)地址處開始執(zhí)行那里的指令JMP指令分成4種類型:⑴段內(nèi)轉(zhuǎn)移、直接尋址⑵段內(nèi)轉(zhuǎn)移、間接尋址⑶段間轉(zhuǎn)移、直接尋址⑷段間轉(zhuǎn)移、間接尋址目的地址與JMP屬同一邏輯段,只修改IP值從一個代碼段轉(zhuǎn)移到另一個代碼段,CS和IP都會被修改無條件轉(zhuǎn)移指令 JMPlabel NEAR只要執(zhí)行無條件轉(zhuǎn)1.

無條件轉(zhuǎn)移指令

—目標(biāo)地址的尋址方式直接尋址方式轉(zhuǎn)移地址象立即數(shù)一樣,直接在指令的機器代碼中,就是直接尋址方式間接尋址方式轉(zhuǎn)移地址在寄存器或主存單元中,就是通過寄存器或存儲器的間接尋址方式用標(biāo)號表達(dá)用寄存器或存儲器操作數(shù)表達(dá)1.無條件轉(zhuǎn)移指令

—目標(biāo)地址的尋址方式直接尋址方1.

無條件轉(zhuǎn)移指令

—目標(biāo)地址的范圍:段內(nèi)段內(nèi)轉(zhuǎn)移——近轉(zhuǎn)移(near)在當(dāng)前代碼段64KB范圍內(nèi)轉(zhuǎn)移

(±32KB范圍)不需要更改CS段基值,只要改變IP偏移地址段內(nèi)轉(zhuǎn)移——短轉(zhuǎn)移(short)轉(zhuǎn)移范圍可以用一個字節(jié)表達(dá),在段內(nèi)-128~+127范圍的轉(zhuǎn)移代碼段代碼段1.無條件轉(zhuǎn)移指令

—目標(biāo)地址的范圍:段內(nèi)段內(nèi)轉(zhuǎn)移1.無條件轉(zhuǎn)移指令

—目標(biāo)地址的范圍:段間段間轉(zhuǎn)移——遠(yuǎn)轉(zhuǎn)移(far)從當(dāng)前代碼段跳轉(zhuǎn)到另一個代碼段,可以在1MB范圍需要更改CS段基值和IP偏移地址目標(biāo)地址必須用一個32位數(shù)表達(dá),叫做32位遠(yuǎn)指針,它就是邏輯地址代碼段代碼段實際編程時,匯編程序會根據(jù)目標(biāo)地址的距離,自動處理成短轉(zhuǎn)移、近轉(zhuǎn)移或遠(yuǎn)轉(zhuǎn)移程序員可用操作符short、nearptr或farptr強制1.無條件轉(zhuǎn)移指令

—目標(biāo)地址的范圍:段間段間轉(zhuǎn)移——遠(yuǎn)段內(nèi)直接尋址轉(zhuǎn)移JMPlabel ;IP←IP+位移量位移量是緊接著JMP指令后的那條指令的偏移地址,到目標(biāo)指令的偏移地址的地址位移當(dāng)向地址增大方向轉(zhuǎn)移時,位移量為正;向地址減小方向轉(zhuǎn)移時,位移量為負(fù)實際為相對尋址

JMPAGAIN ;轉(zhuǎn)移到AGAIN處繼續(xù)執(zhí)行

…… AGAIN: DECCX ;標(biāo)號AGAIN的指令

……

JMPOUTPUT ;轉(zhuǎn)向OUTPUT …… OUTPUT: MOVRESULT,AL ;標(biāo)號OUTPUT的指令段內(nèi)直接尋址轉(zhuǎn)移JMPlabel ;IP←IP段內(nèi)間接尋址轉(zhuǎn)移JMPr16/m16 ;IP←r16/m16將一個16位寄存器或主存字單元內(nèi)容送入IP寄存器,作為新的指令指針,但不修改CS寄存器的內(nèi)容

JMPAX ;IP←AX JMPWORDPTR[BX] ;IP←[BX]段內(nèi)間接尋址轉(zhuǎn)移JMPr16/m16 ;IP←r段間直接尋址轉(zhuǎn)移JMPfarptrlabel

;IP←label的偏移地址 ;CS←label的段基值將標(biāo)號所在段的段基值作為新的CS值,標(biāo)號在該段內(nèi)的偏移地址作為新的IP值;程序跳轉(zhuǎn)到新的代碼段執(zhí)行JMPFARPTROTHERSEG

;遠(yuǎn)轉(zhuǎn)移到代碼段2的otherseg段間直接尋址轉(zhuǎn)移JMPfarptrlabel段間間接尋址轉(zhuǎn)移JMPfarptrmem

;IP←[mem],CS←[mem+2]用一個雙字存儲單元表示要跳轉(zhuǎn)的目標(biāo)地址。這個目標(biāo)地址存放在主存中連續(xù)的兩個字單元中的,低位字送IP寄存器,高位字送CS寄存器MOVWORDPTR[BX],0MOVWORDPTR[BX+2],1500HJMPFARPTR[BX];轉(zhuǎn)移到1500H:0段間間接尋址轉(zhuǎn)移JMPfarptrmem2.條件轉(zhuǎn)移指令Jcclabel

;條件滿足,發(fā)生轉(zhuǎn)移:IP←IP+8位位移量;條件不滿足,順序執(zhí)行指定的條件cc如果成立,程序轉(zhuǎn)移到由標(biāo)號label指定的目標(biāo)地址去執(zhí)行指令;條件不成立,則程序?qū)㈨樞驁?zhí)行下一條指令操作數(shù)label是采用短轉(zhuǎn)移,稱為相對尋址方式2.條件轉(zhuǎn)移指令Jcclabel指定的條件cc如果成立,程2.條件轉(zhuǎn)移指令Jcc指令的操作數(shù)label是一個標(biāo)號一個8位位移量是相對于當(dāng)前IP的,且距當(dāng)前IP地址-128~+127個單元的范圍之內(nèi),屬于段內(nèi)短距離轉(zhuǎn)移Jcc指令為2個字節(jié),條件不滿足時的順序執(zhí)行就是當(dāng)前指令偏移指針I(yè)P加22.條件轉(zhuǎn)移指令Jcc指令的操作數(shù)label是一個標(biāo)號2.條件轉(zhuǎn)移指令—指令的分類Jcc指令不影響標(biāo)志,但要利用標(biāo)志。根據(jù)利用的標(biāo)志位不同,19條指令分成4種情況:⑴判斷單個標(biāo)志位狀態(tài)⑵比較無符號數(shù)高低⑶比較有符號數(shù)大?、扰袛嘤嫈?shù)器CX為02.條件轉(zhuǎn)移指令—指令的分類Jcc指令不影響標(biāo)志,但要利用助記符標(biāo)志位助記符標(biāo)志位JCCF=1JA/JNBECF=0且ZF=0JNCCF=0JAE/JNBCF=0或ZF=1JZ/JEZF=1JB/JNAECF=1且ZF=0JNZ/JNEZF=0JBE/JNACF=1或ZF=1JSSF=1JG/JNLESF=OF且ZF=0JNSSF=0JGE/JNLSF=OF或ZF=1JP/JPEPF=1JL/JNGESF≠OF且ZF=0JNP/JPOPF=0JLE/JNGSF≠OF或ZF=1JOOF=1JCXZCX=0JNOOF=0

實際雖然指令只有19條,但卻有31個助記符

采用多個助記符,只是為了方便記憶和使用助記符標(biāo)志位助記符標(biāo)志位JCCF=1JA/JNBECF=0且判斷單個標(biāo)志位狀態(tài)這組指令單獨判斷5個狀態(tài)標(biāo)志之一⑴JZ/JE和JNZ/JNE:利用零標(biāo)志ZF,判斷結(jié)果是否為零(或相等)⑵JS和JNS:利用符號標(biāo)志SF,判斷結(jié)果是正是負(fù)⑶JO和JNO:利用溢出標(biāo)志OF,判斷結(jié)果是否產(chǎn)生溢出⑷JP/JPE和JNP/JPO:利用奇偶標(biāo)志PF,判斷結(jié)果中“1”的個數(shù)是偶是奇⑸JC和JNC:利用進(jìn)位標(biāo)志CF,判斷結(jié)果是否進(jìn)位或借位例題例題例題例題例題

判斷單個標(biāo)志位狀態(tài)這組指令單獨判斷5個狀態(tài)標(biāo)志之一例題例2.條件轉(zhuǎn)移指令—JZ/JNZ指令 REPZCMPSB ;重復(fù)比較兩個字符

JNZUNMAT

;ZF=0(不等),轉(zhuǎn)移

MOVAL,0 ;順序執(zhí)行(相等)

JMPOUTPUT UNMAT: MOVAL,0FFH OUTPUT: MOVRESULT,AL

REPZCMPSB ;重復(fù)比較兩個字符

JZMAT ;ZF=1(相等),轉(zhuǎn)移

MOVAL,0FFH ;順序執(zhí)行(不等)

JMPOUTPUT MAT: MOVAL,0 OUTPUT: MOVRESULT,AL2.條件轉(zhuǎn)移指令—JZ/JNZ指令 REPZCMPS2.條件轉(zhuǎn)移指令—JS/JNS指令計算|X-Y|(絕對值)。X和Y為存放于X單元和Y單元的16位操作數(shù),結(jié)果存入RESULT。

MOVAX,X SUBAX,Y JNSNONNEG NEGAX NONNEG: MOVRESULT,AX2.條件轉(zhuǎn)移指令—JS/JNS指令計算|X-Y|(絕對值2.條件轉(zhuǎn)移指令—JO/JNO指令計算X-Y。X和Y為存放于X單元和Y單元的16位操作數(shù),若溢出,則轉(zhuǎn)移到OVERFLOW處理

MOVAX,X SUBAX,Y JOOVERFLOW ... ;無溢出,結(jié)果正確OVERFLOW: ...

;有溢出處理2.條件轉(zhuǎn)移指令—JO/JNO指令計算X-Y。X和Y為存放2.條件轉(zhuǎn)移指令—JP/JNP指令設(shè)字符的ASCII碼在AL寄存器中。將字符加上奇校驗位:在字符ASCII碼中為“1”的個數(shù)為奇數(shù)時令其最高位為“0”,否則令最高位為“1”

ANDAL,7FH;最高位置“0”,同時判斷“1”的個數(shù)

JNPNEXT ;個數(shù)已為奇數(shù),則轉(zhuǎn)向NEXT

ORAL,80H

;否則,最高位置“1” NEXT: ...2.條件轉(zhuǎn)移指令—JP/JNP指令設(shè)字符的ASCII碼在A2.條件轉(zhuǎn)移指令—JC/JNC指令記錄BX中1的個數(shù)

XORAL,AL ;AL=0,CF=0 AGAIN: TESTBX,0FFFFH ;等價于CMPBX,0 JZNEXT SHLBX,1 JNCAGAIN INCAL JMPAGAIN NEXT: ... ;AL保存1的個數(shù)2.條件轉(zhuǎn)移指令—JC/JNC指令記錄BX中1的個數(shù) 2.條件轉(zhuǎn)移指令

—無符號數(shù)的比較無符號數(shù)的大小用高(Above)低(Below)表示利用CF確定高低、利用ZF標(biāo)志確定相等(Equal)兩數(shù)的高低分成4種關(guān)系:⑴高于(不低于等于):JA

(JNBE)⑵高于等于(不低于):JAE

(JNB)⑶低于(不高于等于):JB(JNAE)⑷低于等于(不高于):JBE(JNA)2.條件轉(zhuǎn)移指令

—無符號數(shù)的比較無符號數(shù)的大小用高2.

條件轉(zhuǎn)移指令

—無符號數(shù)的比較(例) CMPAX,BX ;比較AX和BX JAENEXT ;若AX≥BX,轉(zhuǎn)移

XCHGAX,BX ;若AX<BX,交換 NEXT: ...結(jié)果:AX保存較大的無符號數(shù)2.條件轉(zhuǎn)移指令

—無符號數(shù)的比較(例) CMP2.條件轉(zhuǎn)移指令

—有符號數(shù)的比較有符號數(shù)的大(Greater)?。↙ess)需要組合OF、SF標(biāo)志,并利用ZF標(biāo)志確定相等(Equal)兩數(shù)的大小分成4種關(guān)系:⑴小于(不大于等于):JL(JNGE)⑵小于等于(不大于):JLE(JNG)⑶大于(不小于等于):JG

(JNLE)⑷大于等于(不小于):JGE

(JNL)2.條件轉(zhuǎn)移指令

—有符號數(shù)的比較有符號數(shù)的大(G2.

條件轉(zhuǎn)移指令

—有符號數(shù)的比較(例) CMPAX,BX ;比較AX和BX JGENEXT ;若AX≥BX,轉(zhuǎn)移

XCHGAX,BX ;若AX<BX,交換 NEXT:...結(jié)果:AX保存較大的有符號數(shù)2.條件轉(zhuǎn)移指令

—有符號數(shù)的比較(例) CMP2.

條件轉(zhuǎn)移指令

—計數(shù)器CX為0轉(zhuǎn)移 JCXZlabel;CX=0,發(fā)生轉(zhuǎn)移:IP←IP+8位位移量;CX≠0,順序執(zhí)行CX寄存器通常在程序中用做計數(shù)器JCXZ指令用來判斷計數(shù)是否為02.條件轉(zhuǎn)移指令

—計數(shù)器CX為0轉(zhuǎn)移 JCXZ§5.2循環(huán)程序設(shè)計一、循環(huán)程序的結(jié)構(gòu)形式二、循環(huán)程序設(shè)計三、多重循環(huán)程序設(shè)計§5.2循環(huán)程序設(shè)計一、循環(huán)程序的結(jié)構(gòu)形式

結(jié)束

初始化

循環(huán)的初始狀態(tài)

循環(huán)體

循環(huán)的工作部分及修改部分

計數(shù)控制循環(huán)條件控制循環(huán)修改部分控制條件YN先循環(huán),后判斷一、循環(huán)程序的結(jié)構(gòu)形式結(jié)束初始化循環(huán)的初一、循環(huán)程序的結(jié)構(gòu)形式

結(jié)束

初始化

循環(huán)的初始狀態(tài)

循環(huán)體

循環(huán)的工作部分及修改部分

計數(shù)控制循環(huán)條件控制循環(huán)修改部分控制條件YN先判斷,后循環(huán)一、循環(huán)程序的結(jié)構(gòu)形式結(jié)束初始化循環(huán)的初

xorax,ax ;被加數(shù)ax清0

movcx,100again: addax,cx ;從100,99,...,2,1倒序累加

loopagain

.modelsmall .stack256 .data sum dw? .code .startup movsum,ax ;將累加和送入指定單元 .exit0 end二、循環(huán)程序設(shè)計(例) xorax,ax ;被加數(shù)ax清0 .model例5.2在ADDR單元存放著數(shù)Y的地址,試編制一程序把Y中1的個數(shù)存入COUNT單元中開始1的個數(shù)計數(shù)器←0循環(huán)次數(shù)計數(shù)器CX←16Y左移一次CF=11的個數(shù)計數(shù)器+1CX←CX-1=0COUNT←

1的個數(shù)計數(shù)器結(jié)束NYNY

循環(huán)次數(shù)固定,完全由循環(huán)計數(shù)器控制例5.2在ADDR單元存放著數(shù)Y的地址,試編制一程序把Y中DATA SEGMENTY DW1234HADDR DWYCOUNT DB?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVDL,0 MOVBX,ADDR MOVAX,[BX] MOVCX,16REPEAT: SHLAX,1 JNCNEXT INCDL NEXT:LOOPREPEAT EXIT0:MOVCOUNT,DL MOVAH,4CH INT21H CODEENDS

ENDSTART例5.2DATA SEGMENTREPEAT:開始1的個數(shù)計數(shù)器←0循環(huán)次數(shù)計數(shù)器CX←16Y左移一次CF=11的個數(shù)計數(shù)器+1CX←CX-1=0COUNT←

1的個數(shù)計數(shù)器結(jié)束NYNYY=0NY例5.2開始1的個數(shù)計數(shù)器←0循環(huán)次數(shù)計數(shù)器CX←16Y左移一次CFDATA SEGMENTY DW1234HADDR DWYCOUNTDB?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVDL,0 MOVBX,ADDR MOVAX,[BX] MOVCX,16REPEAT: SHLAX,1 JNCNEXT INCDL NEXT: LOOPREPEAT EXIT0: MOVCOUNT,DL

ADDDL,30H MOVAH,2 INT21H MOVAH,4CH INT21H CODE ENDS

ENDSTARTCMPAX,0JZEXIT0例5.2JMPREPEATDATA SEGMENTREPEAT: 例5.4將正數(shù)N插入一個已升序排列的字?jǐn)?shù)組的正確位置。該數(shù)組的首地址和末地址分別為ARRAY_HEAD和ARRAY_END,其中所有的數(shù)均為正數(shù)。

解法一:從數(shù)組的尾部開始比較N較大,則在比較對象后插入,結(jié)束循環(huán)N較小,則把比較對象及其后元素后移一個字循環(huán)結(jié)束的控制:執(zhí)行插入操作后結(jié)束循環(huán)若N比所有元素都小,掃描整個數(shù)組后仍無法結(jié)束循環(huán),將-1加在數(shù)組前可解決該問題

23,37,49,5232ENDHEAD-1,

23,37,49,5232,-1,例5.4將正數(shù)N插入一個已升序排列的字?jǐn)?shù)組的正確位置。該數(shù)開始(ARRAY_HEAD-2)←-1初始化變址寄存器SI將N放在K的后面K<=N修改地址K后移一個字單元結(jié)束YN例5.4開始(ARRAY_HEAD-2)←-1初始化變址寄存器SI將DATAREA SEGMENT X DW?ARRAY_HEAD DW3,5,15,23,37,49ARRAY_END DW105 N DW32DATAREA ENDSPROGRAM SEGMENTMAIN PROCFARASSUMECS:PROGRAM,DS:DATAREASTART: PUSHDS SUBAX,AX PUSHAX MOVAX,DATAREA MOVDS,AX MOVAX,N MOVARRAY_HEAD-2,-1 MOVSI,0COMP:CMPARRAY_END[SI],AX JLEINSERT MOVBX,ARRAY_END[SI] MOVARRAY_END[SI+2],BX SUBSI,2 JMPCOMPINSERT: MOVARRAY_END[SI+2],AX RETMAIN ENDPPROGRAMENDS ENDSTART例5.4MOVBX,ARRAY_END[SI]CMPBX,AXJLEINSERT DATAREA SEGMENT MOVAX,例5.4將正數(shù)N插入一個已升序排列的字?jǐn)?shù)組的正確位置。

該數(shù)組的首地址和末地址分別為ARRAY_HEAD和ARRAY_END,其中所有的數(shù)均為正數(shù)。

解法二:從數(shù)組的頭部開始比較N較小,則在比較對象前插入,結(jié)束循環(huán)N較大,則把比較對象及其前元素前移一個字循環(huán)結(jié)束的控制:可掃描整個數(shù)組,循環(huán)次數(shù)為數(shù)組元素個數(shù)執(zhí)行插入操作后結(jié)束循環(huán)若N比所有元素都小,形成新的頭;若N比所有元素都大,則被置于尾部例5.4將正數(shù)N插入一個已升序排列的字?jǐn)?shù)組的正確位置。該DSEG SEGMENTPARA'DATA' DW?ARRAY_HEADDW3,5,13H,23H,37H DW49H,52H,65H,78H,99H,105HCOUNT EQU($-ARRAY_HEAD)/2N DW32HDSEG ENDSCSEG SEGMENTPARA'CODE' ASSUMECS:CSEG ASSUMEDS:DSEG,SS:SSEGMAIN PROCFAR

;MAKENECCESSARYINITALIZALITION MOVAX,DSEG MOVDS,AX MOVES,AX

MOVAX,N MOVSI,0 MOVCX,COUNTREPEAT: MOVBX,ARRAY_HEAD[SI] CMPBX,AX JAEINSERT ;N較小,則轉(zhuǎn)插入操作

MOVARRAY_HEAD[SI-2],BX

;數(shù)組元素前移1字單元

INCSI INCSI LOOPREPEATINSERT: MOVARRAY_HEAD[SI-2],AX

;將N加入到數(shù)組中

MOVAX,4C00H INT21HMAIN ENDP CSEG ENDS ENDMAIN;SETENTRYPOINTDSEG SEGMENTPARA'DATA' MOV例5.5設(shè)有數(shù)組X和Y,每個數(shù)組都有10個元素,完成以下計算:Z1=X1+Y1 Z2=X2+Y2 Z3=X3-Y3Z4=X4-Y4 Z5=X5-Y5 Z6=X6+Y6Z7=X7-Y7 Z8=X8-Y8 Z9=X9+Y9Z10=X10+Y10結(jié)果存入數(shù)組Z。 比例尺:0000000011011100B例5.5設(shè)有數(shù)組X和Y,每個數(shù)組都有10個元素,完成以下計DATA SEGMENTX DW11,33,10,60,4,7,19,80,45,23Y DW44,5,2,90,78,32,12,10,100,98Z DW10HDUP(?)FLAG DW0000000011011100BDATA ENDSSTK SEGMENTSTACK DW20HDUP(0)STK ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STKSTART: MOVAX,DATA MOVDS,AX

MOVBX,0 MOVCX,10 MOVDX,FLAGNEXT: MOVAX,X[BX] SHRDX,1 JCSUBTRACT ADDAX,Y[BX] JMPRESULTSUBTRACT: SUBAX,Y[BX]RESULT: MOVZ[BX],AX ADDBX,2 LOOPNEXT MOVAH,4CH INT21HCODE ENDS ENDSTARTDATA SEGMENT MOVBX,0三、多重循環(huán)程序設(shè)計 例5.7有一個首地址為A的N字?jǐn)?shù)組,請編制程序使該數(shù)組中的數(shù)按照從大到小的次序整序冒泡法從第一個元素開始,依次對相鄰的兩個元素進(jìn)行比較,使前一個元素不小于后一個元素;將所有元素比較完之后,最小的元素排到了最后;然后,除掉最后一個元素之外的元素依上述方法再進(jìn)行比較,得到次小的元素排在后面;如此重復(fù),直至完成就實現(xiàn)元素從大到小的排序這需要一個雙重循環(huán)程序結(jié)構(gòu)三、多重循環(huán)程序設(shè)計 例5.7有一個首地址為A的N字?jǐn)?shù)組,冒泡法的排序序號數(shù)比較遍數(shù)1234132215316485

85321615858321685158328516158853216158冒泡法的排序序號數(shù)比較遍CSEG SEGMENTPARA‘CODE’ ASSUMECS:CSEG,DS:DSEG,SS:SSEGMAIN PROCFAR ;MAKENECCESSARYINITALIZALITION PUSHDS XORAX,AX PUSHAX MOVAX,DSEG MOVDS,AX MOVES,AX MOVCX,N DECCXLOOP1: MOVDI,CX

;保存計數(shù)器

MOVBX,0 ;數(shù)組地址指針清零LOOP2: MOVAX,A[BX] CMPAX,A[BX+2] JGECOTINUE XCHGA[BX+2],AX ;交換

MOVA[BX],AXCOTINUE: ADDBX,2 ;修改數(shù)組指針

LOOPLOOP2

MOVCX,DI ;恢復(fù)循環(huán)計數(shù)器

LOOPLOOP1 RETMAIN ENDP CSEG ENDS ENDMAIN ;SETENTRYPOINTCSEG SEGMENTPARA‘CODE’CSEG SEGMENTPARA‘CODE’ ASSUMECS:CSEG,DS:DSEG,SS:SSEGMAIN PROCFAR ;MAKENECCESSARYINITALIZALITION PUSHDS XORAX,AX PUSHAX MOVAX,DSEG MOVDS,AX MOVES,AX MOVCX,N DECCXLOOP1: MOVDI,CX

;保存計數(shù)器

MOVBX,0 ;數(shù)組地址指針清零

MOVDL,0LOOP2: MOVAX,A[BX] CMPAX,A[BX+2] JGECOTINUE XCHGA[BX+2],AX ;交換

MOVA[BX],AX

INCDL

;交換次數(shù)計數(shù)器+1COTINUE: ADDBX,2 ;修改數(shù)組指針

LOOPLOOP2

CMPDL,0 JZEXIT0

;數(shù)組已整序,則退出

MOVCX,DI

;恢復(fù)循環(huán)計數(shù)器

LOOPLOOP1

EXIT0: RETMAIN ENDP CSEG ENDS ENDMAIN ;SETENTRYPOINTCSEG SEGMENTPARA‘CODE’§5.3分支程序設(shè)計一、分支程序的結(jié)構(gòu)形式二、分支程序的設(shè)計三、跳轉(zhuǎn)表§5.3分支程序設(shè)計一、分支程序的結(jié)構(gòu)形式AH=0fuction0NAH=1AH=2fuction1fuction2NNYYY(C)多分支結(jié)構(gòu)一、分支程序的結(jié)構(gòu)形式AH=0fuction0NAH=1AH分支程序的設(shè)計方法例5.9在附加段中,有一個按從小到大順序排列的無符號數(shù)數(shù)組,其首地址存放在DI寄存器中,數(shù)組中的第一個單元存放著數(shù)組長度。在AX中有一無符號數(shù),要求在數(shù)組中查找該數(shù),如找到則使CF=0,并在SI中給出該元素的偏移地址;如未找到,則使CF=1。分支程序的設(shè)計方法例5.9在附加段中,有一個按從小到大順序循環(huán)與分支程序設(shè)計課件跳躍表法例5.10試根據(jù)AL寄存器中哪一位為1(從低位到高位)把程序轉(zhuǎn)移到8個不同的程序分支去。跳轉(zhuǎn)目標(biāo)的地址在數(shù)據(jù)段中(5-10-1.asm)跳轉(zhuǎn)目標(biāo)的地址在代碼段中(5-10-2.asm)跳躍表法例5.10試根據(jù)AL寄存器中哪一位為1(從低位到高SSEG SEGMENTPARASTACK'STACK' DW100HDUP(0)SSEG ENDSDSEG SEGMENTPARA'DATA'TAB DWROUTINE1 ;程序段1在代碼段的偏移量

DWROUTINE2 DWROUTINE3 DWROUTINE4 DWROUTINE5 DWROUTINE6 DWROUTINE7 DWROUTINE8MESS DB'THISISROUTINE'NUMBER DB8 DB0AH,0DH,'$'DSEG ENDSCSEG SEGMENTPARA'CODE' ASSUMECS:CSEG,DS:DSEG,SS:SSEGMAIN PROCFAR MOVAX,DSEG ;MAKENECCESSARYINITALIZALITION MOVDS,AX MOVES,AX

MOVAL,NUMBER

CMPAL,0 JECONTINUE_MAIN_LINE

;AL值為0則繼續(xù)運行主程序段

LEABX,TABLOP1: SHRAL,1 JNCNOT_YET JMPWORDPTR[BX]NOT_YET: ADDBX,TYPETAB JMPLOP1CONTINUE_MAIN_LINE: MOVAH,4CH INT21HSSEG SEGMENTPARASTACK'STACROUTINE1: MOVNUMBER,31H JMPEXITROUTINE2: MOVNUMBER,32H JMPEXITROUTINE3: MOVNUMBER,33H JMPEXITROUTINE4: MOVNUMBER,34H JMPEXITROUTINE5: MOVNUMBER,35H JMPEXITROUTINE6: MOVNU

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論