匯編程序設(shè)計第4章王爽版分支課件_第1頁
匯編程序設(shè)計第4章王爽版分支課件_第2頁
匯編程序設(shè)計第4章王爽版分支課件_第3頁
匯編程序設(shè)計第4章王爽版分支課件_第4頁
匯編程序設(shè)計第4章王爽版分支課件_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第4章匯編語言程序設(shè)計一、概述一、概述二、順序程序設(shè)計二、順序程序設(shè)計三、三、DOS系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用四、分支程序設(shè)計四、分支程序設(shè)計五、循環(huán)程序設(shè)計五、循環(huán)程序設(shè)計六、串處理類指令六、串處理類指令4.3 DOS系統(tǒng)功能調(diào)用4.3.1 系統(tǒng)功能調(diào)用方法系統(tǒng)功能調(diào)用方法4.3.2 常用的常用的DOS系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用4.3.1 系統(tǒng)功能調(diào)用方法DOS系統(tǒng)功能調(diào)用的方法一般可分為以下幾步:系統(tǒng)功能調(diào)用的方法一般可分為以下幾步: 設(shè)置所要調(diào)用功能的入口參數(shù)。設(shè)置所要調(diào)用功能的入口參數(shù)。 在在AH寄存器中存入所要調(diào)用功能的功能號。寄存器中存入所要調(diào)用功能的功能號。 INT 21H指令自動轉(zhuǎn)

2、入中斷子程序入口。指令自動轉(zhuǎn)入中斷子程序入口。 相應(yīng)中斷子程序運行完畢,可按規(guī)定取得出口參數(shù)。相應(yīng)中斷子程序運行完畢,可按規(guī)定取得出口參數(shù)。 4.3.2 常用的DOS系統(tǒng)功能調(diào)用1 1不帶回顯的鍵盤單字符輸入(不帶回顯的鍵盤單字符輸入(8 8號功能)號功能) 2. 2. 帶回顯的鍵盤單字符輸入(帶回顯的鍵盤單字符輸入(1 1號功能)號功能)3. 3. 單字符輸出(單字符輸出(2 2號功能)號功能)4. 4. 字符串顯示(字符串顯示(9 9號功能)號功能)5. 5. 字符串輸入(字符串輸入(0AH0AH號功能)號功能)7. 7. 程序正常返回系統(tǒng)程序正常返回系統(tǒng)1號系統(tǒng)功能調(diào)用(從鍵盤讀入一個字

3、符)功能:單字符輸入。功能:單字符輸入。將鍵盤輸入的字符的將鍵盤輸入的字符的ASCIIASCII碼值送碼值送ALAL寄存器,同時寄存器,同時回顯回顯在屏在屏幕上。幕上。入口參數(shù):無入口參數(shù):無出口參數(shù):出口參數(shù):ALAL寄存器存放輸入字符的寄存器存放輸入字符的ASCIIASCII碼值碼值格式:格式:MOV AHMOV AH,1 1INT 21HINT 21H說明:在輸入一個字符后,不需要鍵入回車。若只鍵入回車,說明:在輸入一個字符后,不需要鍵入回車。若只鍵入回車,則出口參數(shù)則出口參數(shù)ALAL得到的是回車符的得到的是回車符的ASCIIASCII碼值碼值0DH0DH。2號系統(tǒng)功能調(diào)用(顯示一個字符

4、)功能:單字符輸出。即將以功能:單字符輸出。即將以DLDL寄存器內(nèi)容為寄存器內(nèi)容為ASCIIASCII碼值的碼值的ASCIIASCII字符輸出到屏幕上。字符輸出到屏幕上。入口參數(shù):入口參數(shù):DLDL要顯示字符的要顯示字符的ASCIIASCII碼值碼值出口參數(shù):無出口參數(shù):無格式:格式:MOV DLMOV DL,要顯示的字符,要顯示的字符MOV AH,2INT 21HINT 21H例:例:MOV DLMOV DL,41H 41H ; MOV DLMOV DL,AAMOV AHMOV AH,2 2INT 21HINT 21H屏幕上輸出字符屏幕上輸出字符“A”A”說明:掌握說明:掌握P104P104

5、的回車和換行符的使用。的回車和換行符的使用。4.4 分支程序設(shè)計4.4.1 無條件、條件轉(zhuǎn)移指令無條件、條件轉(zhuǎn)移指令4.4.2 分支程序設(shè)計分支程序設(shè)計4.4.3 用跳轉(zhuǎn)表實現(xiàn)多分支程序設(shè)計用跳轉(zhuǎn)表實現(xiàn)多分支程序設(shè)計分支分支控制轉(zhuǎn)移類控制轉(zhuǎn)移類指令通過改變指令通過改變IP(和(和CS)值,實值,實現(xiàn)程序執(zhí)行順序的改變,是僅次于傳送指令的最常現(xiàn)程序執(zhí)行順序的改變,是僅次于傳送指令的最常用指令,要求很好掌握用指令,要求很好掌握一、無條件轉(zhuǎn)移指令JMP指令分成指令分成4種類型:種類型: 段內(nèi)段內(nèi)直接直接轉(zhuǎn)移轉(zhuǎn)移 段內(nèi)段內(nèi)間接間接轉(zhuǎn)移轉(zhuǎn)移 段間段間直接轉(zhuǎn)移直接轉(zhuǎn)移 段間間接轉(zhuǎn)移段間間接轉(zhuǎn)移JMP la

6、belJMP label格式:格式:程序轉(zhuǎn)向程序轉(zhuǎn)向labellabel標(biāo)號指定的地址處執(zhí)行標(biāo)號指定的地址處執(zhí)行 功能:功能:說明:說明:目標(biāo)地址的范圍:段內(nèi)段內(nèi)轉(zhuǎn)移段內(nèi)轉(zhuǎn)移近轉(zhuǎn)移近轉(zhuǎn)移(near)n在當(dāng)前在當(dāng)前代碼段代碼段64KB范圍內(nèi)范圍內(nèi)轉(zhuǎn)移轉(zhuǎn)移( 32KB范圍)范圍)段內(nèi)轉(zhuǎn)移段內(nèi)轉(zhuǎn)移短轉(zhuǎn)移短轉(zhuǎn)移(short)n轉(zhuǎn)移范圍當(dāng)前轉(zhuǎn)移范圍當(dāng)前代碼段代碼段127B范范圍內(nèi)轉(zhuǎn)移圍內(nèi)轉(zhuǎn)移n不需要更改不需要更改CS段地址,段地址,只要改只要改變變IP偏移地址偏移地址代碼段代碼段代碼段代碼段目標(biāo)地址的范圍:段間段間轉(zhuǎn)移段間轉(zhuǎn)移遠(yuǎn)轉(zhuǎn)移(遠(yuǎn)轉(zhuǎn)移(far)n從當(dāng)前代碼段跳轉(zhuǎn)到從當(dāng)前代碼段跳轉(zhuǎn)到另一個另一個代碼

7、代碼段,可以在段,可以在1MB范圍范圍n需要需要更改更改CS段地址和段地址和IP偏移地址偏移地址n目標(biāo)地址必須用一個目標(biāo)地址必須用一個32位數(shù)表達(dá),位數(shù)表達(dá),叫做叫做32位遠(yuǎn)指針位遠(yuǎn)指針。代碼段代碼段代碼段代碼段 實際編程時,匯編程序會根據(jù)目標(biāo)地址的距離,實際編程時,匯編程序會根據(jù)目標(biāo)地址的距離,自自動處理動處理成短轉(zhuǎn)移、近轉(zhuǎn)移或遠(yuǎn)轉(zhuǎn)移成短轉(zhuǎn)移、近轉(zhuǎn)移或遠(yuǎn)轉(zhuǎn)移 程序員可用操作符程序員可用操作符short、near ptr 或或far ptr 強制強制直接直接n轉(zhuǎn)移地址轉(zhuǎn)移地址象立即數(shù)一樣,象立即數(shù)一樣,直接出現(xiàn)直接出現(xiàn)在指令中在指令中間接間接n轉(zhuǎn)移地址轉(zhuǎn)移地址在在寄存器寄存器或或主存單元主存單

8、元中中用標(biāo)號表達(dá)用標(biāo)號表達(dá)用寄存器或存儲器用寄存器或存儲器操作數(shù)表達(dá)操作數(shù)表達(dá)段內(nèi)直接轉(zhuǎn)移JMP labelJMP label;IPIP+IPIP+位移量位移量位移量位移量是緊接著是緊接著JMP指令后的那條指令的偏移地指令后的那條指令的偏移地址,到目標(biāo)指令的偏移地址的地址位移。址,到目標(biāo)指令的偏移地址的地址位移。當(dāng)向地址當(dāng)向地址增大方向增大方向轉(zhuǎn)移時,位移量為轉(zhuǎn)移時,位移量為正正;向地址;向地址減小方向減小方向轉(zhuǎn)移時,位移量為轉(zhuǎn)移時,位移量為負(fù)負(fù) jmp jmp output output ;轉(zhuǎn)移到;轉(zhuǎn)移到outputoutput處繼續(xù)執(zhí)行處繼續(xù)執(zhí)行output:output: mov res

9、ult,almov result,al;標(biāo)號;標(biāo)號outputoutput的指令的指令段內(nèi)間接轉(zhuǎn)移JMP r16/m16JMP r16/m16 ;IPr16/m16IPr16/m16將一個將一個1616位寄存器或主存字單元內(nèi)容送入位寄存器或主存字單元內(nèi)容送入IPIP寄寄存器,作為新的指令指針。存器,作為新的指令指針。jmp axjmp ax;IPAXIPAXjmp word ptr 2000hjmp word ptr 2000h;IP2000hIP2000h段間直接轉(zhuǎn)移JMP JMP far ptrfar ptr label label;IPlabelIPlabel的偏移地址的偏移地址;CSl

10、abelCSlabel的段地址的段地址將標(biāo)號所在段的段地址作為新的將標(biāo)號所在段的段地址作為新的CS值,標(biāo)號在值,標(biāo)號在該段內(nèi)的偏移地址作為新的該段內(nèi)的偏移地址作為新的IP值;這樣,程序跳值;這樣,程序跳轉(zhuǎn)到新的代碼段執(zhí)行轉(zhuǎn)到新的代碼段執(zhí)行jmp jmp far ptrfar ptr otherseg otherseg;遠(yuǎn)轉(zhuǎn)移到另一代碼段的;遠(yuǎn)轉(zhuǎn)移到另一代碼段的othersegotherseg處處段間間接轉(zhuǎn)移JMP JMP far ptrfar ptr mem mem;IPmemIPmem,CSmem+2CSmem+2用一個用一個雙字雙字存儲單元表示要跳轉(zhuǎn)的目標(biāo)地址。存儲單元表示要跳轉(zhuǎn)的目標(biāo)地址

11、。這個目標(biāo)地址存放在主存中這個目標(biāo)地址存放在主存中連續(xù)的兩個字單元連續(xù)的兩個字單元中,中,低位字低位字送送IPIP寄存器,寄存器,高位字高位字送送CSCS寄存器寄存器注意:此處的操作數(shù)只能是存儲器操作數(shù)注意:此處的操作數(shù)只能是存儲器操作數(shù)mov word ptr bx,0mov word ptr bx,0mov word ptr bx+2,1500hmov word ptr bx+2,1500hJMP dword ptr bx JMP dword ptr bx ;轉(zhuǎn)移到;轉(zhuǎn)移到1500:0h1500:0h二、條件轉(zhuǎn)移指令功能:指定的條件功能:指定的條件cc如果成立,程序轉(zhuǎn)移到由標(biāo)號如果成立,程

12、序轉(zhuǎn)移到由標(biāo)號label指指定的目標(biāo)地址去執(zhí)行指令;條件不成立,則程序?qū)㈨樞驁?zhí)定的目標(biāo)地址去執(zhí)行指令;條件不成立,則程序?qū)㈨樞驁?zhí)行下一條指令行下一條指令說明:(說明:(1) Jcc(2)操作數(shù)操作數(shù)label是采用是采用段內(nèi)短轉(zhuǎn)移段內(nèi)短轉(zhuǎn)移(3) Jcc指令不影響標(biāo)志,但要利用標(biāo)志指令不影響標(biāo)志,但要利用標(biāo)志Jcc labelJcc label格式:格式: Jcc指令的分類指令的分類根據(jù)利用的標(biāo)志位不同,根據(jù)利用的標(biāo)志位不同,16條指令分成條指令分成3種情況:種情況:1. 判斷判斷單個標(biāo)志位單個標(biāo)志位狀態(tài)狀態(tài)2. 比較比較無符號數(shù)無符號數(shù)高低高低3 . 比較比較有符號數(shù)有符號數(shù)大小大小1. 判

13、斷單個標(biāo)志位狀態(tài)這組指令單獨判斷這組指令單獨判斷5個狀態(tài)標(biāo)志之一個狀態(tài)標(biāo)志之一JZ/JE和和JNZ/JNE:利用零標(biāo)志:利用零標(biāo)志ZF,判斷結(jié),判斷結(jié)果是否為零(或相等)。果是否為零(或相等)。 JZ/JE表示結(jié)果為表示結(jié)果為零(或相等),則轉(zhuǎn)移。零(或相等),則轉(zhuǎn)移。JS和和JNS:利用符號標(biāo)志:利用符號標(biāo)志SF,判斷結(jié)果是,判斷結(jié)果是正是負(fù),正是負(fù), JS表示結(jié)果為負(fù)則轉(zhuǎn)移。表示結(jié)果為負(fù)則轉(zhuǎn)移。JO和和JNO:利用溢出標(biāo)志:利用溢出標(biāo)志OF,判斷結(jié)果是,判斷結(jié)果是否產(chǎn)生溢出,否產(chǎn)生溢出, JO表示溢出則轉(zhuǎn)移。表示溢出則轉(zhuǎn)移。JP/JPE和和JNP/JPO:利用奇偶標(biāo)志:利用奇偶標(biāo)志PF,判

14、,判斷結(jié)果中斷結(jié)果中“1”的個數(shù)是偶是奇。的個數(shù)是偶是奇。JP表示偶個表示偶個數(shù)個數(shù)個1JC和和JNC:利用進(jìn)位標(biāo)志:利用進(jìn)位標(biāo)志CF,判斷結(jié)果是,判斷結(jié)果是否進(jìn)位或借位。進(jìn)位或借位為否進(jìn)位或借位。進(jìn)位或借位為1則轉(zhuǎn)移。則轉(zhuǎn)移。例題例題例題例題例題例題例題例題例題例題例:例:JZ/JNZ指令指令測試測試alal最高位,若為最高位,若為0 0,將,將0 0送入送入ah,ah,若為若為1 1,將,將-1-1送入送入ah ah test al,80htest al,80h;測試最高位;測試最高位jz next0jz next0;D7D70 0(ZFZF1 1),轉(zhuǎn)移),轉(zhuǎn)移mov ah,0ffhmo

15、v ah,0ffh;D7D71 1,順序執(zhí)行,順序執(zhí)行jmp donejmp done;無條件轉(zhuǎn)向;無條件轉(zhuǎn)向next0:next0:mov ah,0mov ah,0done:done:. test al,80htest al,80h ;測試最高位;測試最高位jnz next1jnz next1;D7D71 1(ZFZF0 0),轉(zhuǎn)移),轉(zhuǎn)移mov ah,0mov ah,0;D7D70 0,順序執(zhí)行,順序執(zhí)行jmp donejmp done;無條件轉(zhuǎn)向;無條件轉(zhuǎn)向next1:next1:mov ah,0ffhmov ah,0ffhdone:done: .例:例:JS/JNS指令指令;計算計算|

16、XY|(絕對值)(絕對值);X和和Y為存放于為存放于X單元和單元和Y單元的單元的16位操作數(shù)位操作數(shù);結(jié)果存入;結(jié)果存入resultmov ax,Xmov ax,Xsub ax,Ysub ax,Yjns nonnegjns nonnegneg axneg ax;negneg是求補指令是求補指令nonneg:nonneg: mov result,axmov result,ax例:例:JO/JNO指令指令;計算;計算XY;X和和Y為存放于為存放于X單元和單元和Y單元的單元的16位操作數(shù)位操作數(shù);若溢出,則轉(zhuǎn)移到;若溢出,則轉(zhuǎn)移到overflow處理處理mov ax,Xmov ax,Xsub ax,

17、Ysub ax,Yjo overflowjo overflow.;無溢出,結(jié)果正確;無溢出,結(jié)果正確overflow:overflow: .;有溢出處理;有溢出處理例:例:JC/JNC指令指令;記錄;記錄BX中中1的個數(shù)的個數(shù)xor al,alxor al,al;ALAL0 0,CFCF0 0again:again:test bx,test bx,0ffffh 0ffffh ;等價于;等價于 cmp bx,0cmp bx,0je nextje nextshl bx,1shl bx,1jnc againjnc againinc alinc aljmp againjmp againnext:nex

18、t:.;ALAL保存保存1 1的個數(shù)的個數(shù)另一種做法另一種做法記錄記錄BX中中“1”的個數(shù)的個數(shù)xor al,alxor al,al;ALAL0 0,CFCF0 0again:again:cmp bx,0cmp bx,0jz nextjz nextshl bx,1shl bx,1;也可使用;也可使用 shr bx,1shr bx,1adc al,0adc al,0jmp againjmp againnext:next:.;ALAL保存保存1 1的個數(shù)的個數(shù)比較無符號數(shù)高低無符號數(shù)高低有無符號數(shù)高低有4種關(guān)系:種關(guān)系:高于高于(不低于等于):(不低于等于): JA ( JNBE )高于等于(不低

19、于):高于等于(不低于): JAE (JNB)低于低于(不高于等于):(不高于等于):JB(JNAE)低于等于(不高于):低于等于(不高于):JBE(JNA)例:比較無符號數(shù)例:比較無符號數(shù)比較無符號數(shù)大小,將較大的數(shù)存放比較無符號數(shù)大小,將較大的數(shù)存放AX寄存器。寄存器。 cmp ax,bxcmp ax,bx;比較;比較axax和和bx,(AX)-(BX)bx,(AX)-(BX)jae nextjae next;若;若axaxbxbx,轉(zhuǎn)移,轉(zhuǎn)移xchg ax,bxxchg ax,bx;若;若axaxbxbx,交換,交換next:next:.結(jié)果:結(jié)果:AX保存較大的保存較大的無符號數(shù)無符號

20、數(shù)比較有符號數(shù)大小兩數(shù)的大小分成兩數(shù)的大小分成4種關(guān)系:種關(guān)系:大于大于(不小于等于):(不小于等于): JG ( JNLE )大于等于(不小于):大于等于(不小于): JGE (JNL)小于小于(不大于等于):(不大于等于):JL(JNGE)小于等于(不大于):小于等于(不大于):JLE(JNG)例:比較有符號數(shù)例:比較有符號數(shù)比較有符號數(shù)大小,將較大的數(shù)存放在比較有符號數(shù)大小,將較大的數(shù)存放在AX寄存器。寄存器。 cmp ax,bxcmp ax,bx;比較;比較axax和和bxbxjge nextjge next;若;若axaxbxbx,轉(zhuǎn)移,轉(zhuǎn)移xchg ax,bxxchg ax,bx;

21、若;若axaxbxbx,交換,交換next:next:.結(jié)果:結(jié)果:AX保存較大的保存較大的有符號數(shù)有符號數(shù)注意:根據(jù)數(shù)的不同選取不同的指令注意:根據(jù)數(shù)的不同選取不同的指令條件轉(zhuǎn)移指令中的條件cc 實際雖然指令只有實際雖然指令只有16條,但卻有條,但卻有30個助記符個助記符 采用多個助記符,只是為了方便記憶和使用采用多個助記符,只是為了方便記憶和使用SF三、分支程序設(shè)計分支程序根據(jù)條件是分支程序根據(jù)條件是真或假真或假決定執(zhí)行與否,判斷的決定執(zhí)行與否,判斷的條件是各種指令,條件是各種指令,單分支雙分支多分支如如CMP、TEST等執(zhí)行后形成的狀態(tài)等執(zhí)行后形成的狀態(tài)標(biāo)志與條件轉(zhuǎn)移指令標(biāo)志與條件轉(zhuǎn)移指

22、令Jcc聯(lián)合可以實現(xiàn)分支控制。聯(lián)合可以實現(xiàn)分支控制。用無條件轉(zhuǎn)移指令用無條件轉(zhuǎn)移指令JMP也可以實現(xiàn)分支控制。也可以實現(xiàn)分支控制。條件成立條件成立跳轉(zhuǎn)到標(biāo)號所在的指跳轉(zhuǎn)到標(biāo)號所在的指令執(zhí)行令執(zhí)行,否則,否則順序執(zhí)行分支語句順序執(zhí)行分支語句體體;注意:選擇注意:選擇正確的條件轉(zhuǎn)移指正確的條件轉(zhuǎn)移指令令和和轉(zhuǎn)移目標(biāo)地址轉(zhuǎn)移目標(biāo)地址1、 單重分支1、 單分支【例【例4.9 】編程求編程求XY,結(jié)果存于結(jié)果存于RESULT單元中,單元中,設(shè)設(shè)X和和Y都為都為16位數(shù)。位數(shù)。DATA SEGMENTX DW -10Y DW 20RESULT DW ?DATA ENDSSTACK SEGMENT STAC

23、KDB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV AX,X SUB AX,Y JNS NONNEG NEG AXNONNEG: MOV RESULT,AX MOV AH,4CH INT 21HCODE ENDS END START2、雙分支程序設(shè)計條件成立跳轉(zhuǎn)執(zhí)行第條件成立跳轉(zhuǎn)執(zhí)行第2個分支語句體,否則順個分支語句體,否則順序執(zhí)行第序執(zhí)行第1個分支語句體。個分支語句體。注意第注意第1個分支體后一定個分支體后一定要有一個要有一個JMP指令指令跳到跳到第第2個分支體后個分支體后2、雙分支程序設(shè)計【例4.10】 顯示BX的最高位,用DL作標(biāo)志第一種方法第一種方法 shl bx,1jnc onemov dl,1j

溫馨提示

  • 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

提交評論