微機原理37教材_第1頁
微機原理37教材_第2頁
微機原理37教材_第3頁
微機原理37教材_第4頁
微機原理37教材_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.7分支程序的設計分支程序就是根據(jù)條件的不同完成不同功能的程序。編寫分支程序要用到條件轉(zhuǎn)移指令。

執(zhí)行轉(zhuǎn)移/調(diào)用指令時,8086指令隊列寄存器原內(nèi)容(按順序取出的后續(xù)指令)被清除,轉(zhuǎn)向指令的地址(目標地址OPR)→CS、IP。CPU按CS、IP的指示,跳轉(zhuǎn)到目標地址去執(zhí)行。

3.7.1無條件轉(zhuǎn)移指令使程序無條件跳轉(zhuǎn)到目標地址(OPR)去執(zhí)行。一.段內(nèi)轉(zhuǎn)移轉(zhuǎn)移指令和待轉(zhuǎn)向指令在同一代碼段中,只改變IP的內(nèi)容。1.段內(nèi)直接轉(zhuǎn)移

格式:JMPOPR;OPR—待轉(zhuǎn)向指令標號

操作:IP←標號偏移地址說明:①標號偏移地址=JMP指令的下一條指令的偏移地址+位移量 位移量由匯編程序在匯編過程中,根據(jù)標號地址與JMP指令所在地址進行計算得到。例:

JMPSHORTNEXT; :

NEXT:MOVAL,05H;

:操作碼08H操作碼CS:0100H05H0101H0102H010AH010BHJMPSHORTNEXT8位位移量MOVAL,05H由計算機根據(jù)轉(zhuǎn)移的相對位置計算得到。②轉(zhuǎn)移范圍 短轉(zhuǎn)移(位移量為8位)—以JMP為中心的256個單元;

近轉(zhuǎn)移(位移量為16位)—以JMP為中心的64KB個單元。③短轉(zhuǎn)移和近轉(zhuǎn)移也可以分別表示為

JMPSHORTOPR JMPNEARPTROPR例: :

JMPNEARPTRNEXT; :

NEXT:MOVAL,05H;由計算機根據(jù)轉(zhuǎn)移的相對位置計算得到。操作碼07H操作碼CS:0100H05H0101H0102H010AH010BHJMPNEXT16位位移量MOVAL,05H00H2.段內(nèi)間接轉(zhuǎn)移

格式:JMPOPR ;OPR≡{R,M}

操作:IP←(EA)

說明:①有效地址EA由OPR的尋址方式確定;②轉(zhuǎn)移范圍為以JMP為中心的64KB。例:

BUFDW0301H … MOVBX,2C8FH JMPBUF … JMPNEXT … JMPBX … JMPWORDPTR[BX] NEXT:ADDAX,BX …;IP←NEXT偏移地址;IP←2C8FH;IP←0301H;IP←(2C8FH,2C90H)二.段間轉(zhuǎn)移轉(zhuǎn)移指令和待轉(zhuǎn)向指令不在同一代碼段中,同時改變CS、IP。

轉(zhuǎn)移范圍:1MB。

1.段間直接轉(zhuǎn)移指令中直接給出不在本代碼段中待轉(zhuǎn)向指令標號。格式:JMP

FARPTROPR; OPR待轉(zhuǎn)向指令的標號操作:CS←標號段地址,IP←標號偏移地址。例3.20

在C1代碼段有一條轉(zhuǎn)移到C2代碼段的無條件轉(zhuǎn)移指令,如下如示:

C1 SEGMENT … JMPFARPTRNEXT …

C1 ENDS

C2 SEGMENT … NEXT:MOVCL,AL …

C2 ENDS2.段間間接轉(zhuǎn)移待轉(zhuǎn)向指令的段地址、段內(nèi)偏移地址放在連續(xù)的4個內(nèi)存單元中(指令中給出訪問內(nèi)存單元的尋址方式—同操作數(shù)的尋址方式)。

格式:JMP

DWORDPTROPR;OPR≡{M}

操作:IP←(EA),CS←(EA+2)

例3.21

JMPDWORDPTR[BP][DI]

設SS=5000H,BP=1000H,DI=0050H,存放轉(zhuǎn)向地址的堆棧段中的存儲單元物理地址:

PA=50000H+1000H+0050H=51050H

此時轉(zhuǎn)向地址的存儲情況如圖3.6所示,JMP指令位于C1代碼段,轉(zhuǎn)移到C2代碼段,程序形式如下:

C1SEGMENT … 1000H:1300H JMPDWORDPTR[BP][DI] … C1ENDS

C2SEGMENT … 2000H:2500H MOVDL,AL …

C2ENDS存儲單元的內(nèi)容10000H1000H:1300H20000H2000H:2500H代碼段C1段首地址JMP指令MOV指令C2段首地址00H25H00H20H堆棧段偏移地址→IP=2500H段地址→CS=2000H51050H51050H0050H1000H5000HSSBPDI+3.7.2條件轉(zhuǎn)移指令

根據(jù)標志位來判斷測試條件:滿足條件則轉(zhuǎn)移到指令指定地址執(zhí)行(分支);否則順序執(zhí)行下一條指令。條件滿足否?是否轉(zhuǎn)向轉(zhuǎn)移地址執(zhí)行順序執(zhí)行格式:JXXOPR;OPR≡{標號}操作:當條件XX滿足時則轉(zhuǎn)移到OPR執(zhí)行,否則順序執(zhí)行。注意:

屬于段內(nèi)直接短轉(zhuǎn)移指令,轉(zhuǎn)移范圍為256字節(jié)(IP-128~IP+127)。

JS OPR;結(jié)果為負轉(zhuǎn)移

JNS OPR;結(jié)果為正轉(zhuǎn)移JP/JPE OPR;結(jié)果中“1”的個數(shù)為偶轉(zhuǎn)移JNP/JPO OPR;結(jié)果中“1”的個數(shù)為奇轉(zhuǎn)移JO OPR;結(jié)果有溢出轉(zhuǎn)移JNO OPR;結(jié)果無溢出轉(zhuǎn)移JC OPR;結(jié)果有進位轉(zhuǎn)移JNC OPR;結(jié)果無進位轉(zhuǎn)移JZ/JE OPR;結(jié)果為零/相等轉(zhuǎn)移JNZ/JNE OPR;結(jié)果不為零/不相等轉(zhuǎn)移(1)單條件轉(zhuǎn)移指令JB/JNAEOPR;小于/不大于等于(CF=1)轉(zhuǎn)移JNB/JAE OPR;不小于/大于等于(CF=0)轉(zhuǎn)移JBE/JNA OPR;小于等于/不大于(CF∨ZF=1)轉(zhuǎn)移JNBE/JAOPR;不小于等于/大于(CF∨ZF=0)轉(zhuǎn)移B:Below——小于(低于)A:Above——大于(高于)E:Equal——等于(2)適合無符號數(shù)比較的條件轉(zhuǎn)移指令L:Less——小于G:Greater——大于E:Equal——等于JNL/JGE OPR;不小于/大于等于轉(zhuǎn)移JLE/JNG OPR;小于等于/不大于轉(zhuǎn)移JNLE/JG OPR;不小于等于/大于轉(zhuǎn)移(3)適合帶符號數(shù)比較的條件轉(zhuǎn)移指令JL/JNGEOPR;小于/不大于等于轉(zhuǎn)移SFOF=1SFOF=0((SFOF)∨ZF)=1((SFOF)∨ZF)=0注意:上述條件轉(zhuǎn)移指令通常是與算術(shù)、邏輯、移位等指令聯(lián)用的。且注意有符號和無符號的區(qū)別。如:若AL的內(nèi)容是一個無符號數(shù),那么

CMPAL,0;JANEXT;即當AL>0時轉(zhuǎn)移若AL的內(nèi)容是一個有符號數(shù),那么

CMPAL,0;JGDONE;即當AL>0時轉(zhuǎn)移3.7.3分支程序的結(jié)構(gòu)單分支結(jié)構(gòu)

判定條件是否分支程序段順序往下執(zhí)行多分支結(jié)構(gòu)判定條件程序段n條件1程序段2程序段1條件2條件n…分為:單分支結(jié)構(gòu)和多分支結(jié)構(gòu)兩種3.7.4分支程序設計舉例

例:比較兩個無符號數(shù)的大小,將大數(shù)存入MAX單元。

例3.23

檢查NN單元的數(shù)據(jù)是否為1位16進制數(shù),是則將其轉(zhuǎn)換為ASCII碼,否則置為0FFH。AL←NAL≥0?AL=AL+30HS存AL值ENDNYAL=AL+07HAL≤9?AL≤15?AL=0FFHYNNY×程序如下:ASTACKSEGMENTSTACKDW256DUP(?)TOPLABELWORDASTACKENDSDATASEGMENTNNDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA;SS:ASTACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AX

MOVSP,OFFSETTOP

MOVAL,NN;AL←NCMPAL,9;AL和9比較

JBEALOOP1;AL≤9,轉(zhuǎn)ALOOP1CMPAL,15;AL和15比較

JAALOOP2;AL>15,轉(zhuǎn)ALOOP2ADDAL,07H;AL←AL+07HALOOP1:ADDAL,30H;AL←AL+30HDONE:MOVAH,4CH;返回DOSINT21HALOOP2:MOVAL,0FFH;AL←0FFHJMPDONECODE:ENDSENDSTART例3.22

符號函數(shù)

1(x>0)y=0(x=0)

-1(x<0)開始x=?Y←0Y←1Y←-1結(jié)束>0<0=0開始x=0?Y←0Y←1Y←-1結(jié)束NNYx≥0?YASTACK SEGMENT STACK DW256DUP(?)

TOP LABELWORDASTACK ENDSDATA SEGMENTXX DBXYY DB?DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:ASTACKSTART:

MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX LEA SP,TOP

MOV AL,XX ;AL←X

CMP AL,0 ;X與0比較

JGE NEPA ;X≥0,轉(zhuǎn)NEPA

MOV YY,0FFH ;X<0,YY←-1 JMP STOP能否缺???為什么?NEPA: JENEPB ;X=0,轉(zhuǎn)NEPB MOV YY,1 ;X>0,YY←1 JMP STOPNEPB: MOV YY,0 ;X=0,YY←0STOP: MOV AH,4CH ;返回DOS INT 21HCODE ENDS

END START

例3.24從鍵盤接受一個字符送入AL,根據(jù)AL的數(shù)值進行跳轉(zhuǎn)AL←字符AL≤30H?BX=Li首址S轉(zhuǎn)移到Li執(zhí)行ENDYNAL邏輯左移1位AL≥39H?YNAL=AL-30HAH=0TAB+1+2+3+17+18L0L0L1L1L9L9設由鍵盤輸入‘0’~‘9’中的任一個到AL,則AL的內(nèi)容就為‘0’~‘9’中的任一個字符的ASCII值。然后根據(jù)ASCII值轉(zhuǎn)到L0、L1、……、L9程序段中。STACK SEGMENT STACK DW256DUP(?)

TOP LABELWORDSTACKENDSDATA SEGMENTTAB DWL0,L1,L2,L3,L4,L5,L6,L7,

L8,L9DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKSTART:

MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSETTOPMOVAH,01H ;鍵入字符INT 21HCMPAL,30H ;AL和30H比較

JB DONE ;AL<30H,轉(zhuǎn)DONECMPAL,39H ;AL和39H比較JA DONE ;AL>39H,轉(zhuǎn)DONESUB AL,30HSHL AL,1 ;AX←2*iMOVAH,0LEA BX,TAB ;BX←TAB偏移地址ADDBX,AX;BX←TAB+2*iJMP WORDPTR[BX];轉(zhuǎn)(TAB+2*i)=Li處執(zhí)行DONE:MOVAH,4CH ;返回DOS INT 21HL0:…

;分支L0 JMP DONEL1:…

;分支L1 JMP DONE

L9:…

;分支L9 JMP DONECODEENDSENDSTART多分支結(jié)構(gòu)的實現(xiàn)形式之一endTAB+1+2+3+17+18L0L0L1L1L9L9DATA SEGMENTTAB DWL0,L1,L2,L3,L4,L5,L6,L7,L8,L9DATA ENDSL0:…

;分支L0 JMP DONEL1:…

;分支L1 JMP DONE

L9:…

;分支L9 JMP DONE多分支結(jié)構(gòu)的實現(xiàn)形式之一(1)段內(nèi)直接轉(zhuǎn)移指令格式:JMPSHORTOPRD;OPRD≡{標號}功能:將程序無條件地轉(zhuǎn)移到標號OPRD為起點的程序段執(zhí)行。操作:IP←IP+D8;D8為8位偏移量的補碼轉(zhuǎn)移范圍:IP-128~IP+127(256字節(jié))3.7.1無條件轉(zhuǎn)移指令①段內(nèi)直接短轉(zhuǎn)移指令說明:轉(zhuǎn)移指令可以從現(xiàn)行指令地址(IP)向低地址轉(zhuǎn)移——D8為負數(shù);也可以向高地址轉(zhuǎn)移——D8為正數(shù)。注意:JMPSHORTPTRCCC;錯誤指令

格式:JMP

NEARPTROPRD;

其中,OPRD≡{標號}功能:將程序無條件地轉(zhuǎn)移到標號OPRD為起點的程序段執(zhí)行。操作:IP←IP+D16;D16為16位偏移量的補碼轉(zhuǎn)移范圍:IP-32768~IP+32767(64K一個段)②段內(nèi)直接近轉(zhuǎn)移指令說明:直接轉(zhuǎn)移指令中的目標地址OPRD直接使用要轉(zhuǎn)向指令的標號,屬性操作符NEARPTR在指令中可省略,直接寫成:其中,標號的偏移地址=當前轉(zhuǎn)移指令的下一條指令的偏移地址+位移量位移量是是16位的,可以由匯編程序在匯編過程中,根據(jù)標號地址與JMP指令所在地址進行計算得到。

JMP

標號;IP←標號的偏移地址格式:JMPOPRD;OPRD≡{R,M}操作:IP←[EA];EA為OPRD確定的有效地址。例如:JM

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論