在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 匯編入門學(xué)習(xí)筆記 (八)—— 轉(zhuǎn)移指令

            匯編入門學(xué)習(xí)筆記 (八)—— 轉(zhuǎn)移指令

            作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
            瘋狂的暑假學(xué)習(xí)之 匯編入門學(xué)習(xí)筆記 (八)—— 轉(zhuǎn)移指令

            本文引用地址:http://www.biyoush.com/article/201611/317782.htm

            參考: 《匯編語言》 王爽 第9章

            可以修改ip或者同時修改cs和ip的指令統(tǒng)稱為轉(zhuǎn)移指令。

            8086CPU轉(zhuǎn)移行為分為:

            段內(nèi)轉(zhuǎn)移:只修改ip

            段間轉(zhuǎn)移:同時修改cs和ip

            段內(nèi)轉(zhuǎn)移按ip修改的范圍可分為:

            短轉(zhuǎn)移:ip修改范圍 -128~127

            近轉(zhuǎn)移:ip修改范圍 -32768~32767

            轉(zhuǎn)移指令分為:

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

            條件轉(zhuǎn)移指令

            循環(huán)指令。如 loop

            過程。

            中斷。

            1. offset,nop指令

            offset 獲取標(biāo)號的偏移地址

            nop 占用1一個字節(jié)

            例子:

            1. assumecs:code
            2. codesegment
            3. start:movax,bx
            4. movsi,offsetstart
            5. movdi,offsets
            6. movax,cs:[si]
            7. movcs:[di],ax
            8. s:nop
            9. nop
            10. codeends
            11. endstart


            2. 依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令

            (1)jmp short 標(biāo)號

            是段內(nèi)短轉(zhuǎn)移。

            表示轉(zhuǎn)移到指定的標(biāo)號處,且轉(zhuǎn)移的距離范圍為-128~127

            用debug查看此指令時,會看見機(jī)器碼,不會保存標(biāo)號的地址,自會保存轉(zhuǎn)移的距離

            (2)jmp near ptr標(biāo)號

            是段內(nèi)近轉(zhuǎn)移,轉(zhuǎn)移的距離范圍為-32768~32767,其他與jmp short 標(biāo)號相同

            2. 轉(zhuǎn)移地址在寄存器中的jmp指令

            jmp 16位 reg

            表示 (IP)=(16位 reg)

            3.轉(zhuǎn)移地址在內(nèi)存中的jmp指令

            (1)jmp word ptr 內(nèi)存單元地址

            是段內(nèi)近轉(zhuǎn)移。

            例子:轉(zhuǎn)移到偏移地址為0123H的指令去,即使(IP)= 0123H

            1. movax,0123H
            2. movds:[0],ax
            3. jmpwordptrds:[0]

            (2)jmp dword ptr 內(nèi)存單元地址

            是段間轉(zhuǎn)移

            高地址表示轉(zhuǎn)移的段地址

            低地址表示偏移地址

            用debug查看機(jī)器碼,可以發(fā)現(xiàn),它是保存了段地址與偏移地址,而不是像段內(nèi)轉(zhuǎn)移的指令時保存轉(zhuǎn)移的距離

            例子:轉(zhuǎn)移到段地址為0,偏移地址為0123H的指令去,即使得(CS)= 0,(IP)= 0123H

            1. movax,0123H
            2. movds:[0],ax
            3. movwordptrds:[2],0
            4. jmpdwordptrds:[0]

            4. jcxz 指令

            jcxz 指令為條件轉(zhuǎn)移指令。當(dāng)cx為0時,轉(zhuǎn)移(與loop剛剛相反)。所有條件轉(zhuǎn)移指令都是短轉(zhuǎn)移。

            例子:在內(nèi)存2000H段中查找第一個值位0 的字節(jié),并把它的偏移指定存儲在dx中。

            1. assumecs:code
            2. codesegment
            3. start:movax,2000H
            4. movds,ax
            5. movbx,0
            6. s:movch,0
            7. movcl,[bx]
            8. jcxzok
            9. incbx
            10. jmpshorts
            11. ok:movdx,bx
            12. movax,4c00H
            13. int21H
            14. codeends
            15. endstart


            5. jmp指令詳細(xì)分析

            jmp s

            jmp short s

            jmp near ptr s

            jmp far ptr s

            向前轉(zhuǎn)移:

            在像前轉(zhuǎn)移時,編譯器可以在讀到標(biāo)號s后記下AC(地址計算器)的值as,在讀到j(luò)mp ...s (上面5種)后記下AC的值aj。編譯器可以用as-aj計算出disp

            (1)如果disp 在-128~127 內(nèi)

            上面的每一種指令都將轉(zhuǎn)化為jmp short s

            (2)如果disp 在-32768~32767內(nèi)

            對于jmp short s會編譯錯誤

            對于jmp s,jmp near ptr s會產(chǎn)生jmp near ptr s所對應(yīng)的機(jī)器碼。

            對于jmp far ptr s,所對應(yīng)的機(jī)器碼為:EA 偏移地址 段地址。

            先后轉(zhuǎn)移:

            由于不能確定s位置,編譯器先將上面的指令都當(dāng)做 jmp short s來讀取。記下jmp ..s 指令的位置和AC的值aj。

            對于jmp short s 編譯器生成一個EB和一個nop指令

            對于jmp near ptr s編譯器生成一個EB和兩個nop指令

            對于jmp far ptr s編譯器生成一個EB和四個nop指令

            當(dāng)讀到s時,記下AC的值as,計算disp = as - aj

            (1)如果disp 在-128~127 內(nèi)

            指令都為 EB disp ,它們后面的一個nop變成8位的disp 。jmp s(1個)、jmp near ptr s (1個)跟jmp far ptr s (3個) nop指令不變

            (2)如果disp 在-32768~32767內(nèi)

            對于jmp short s會編譯錯誤

            jmp s、jmp near ptr s 后面 兩個nop變成轉(zhuǎn)移的16位disp。

            jmp far ptr s 這填上相應(yīng)的段地址,偏移地址。

            6. 分析一個奇怪的程序

            1. assumecs:code
            2. codesegment
            3. movax,4c00h
            4. int21h
            5. start:movax,0
            6. s:nop
            7. nop
            8. movdi,offsets
            9. movsi,offsets2
            10. movax,cs:[si]
            11. movcs:[di],ax
            12. s0:jmpshorts
            13. s1:movax,0
            14. int21h
            15. movax,0
            16. s2:jmpshorts1
            17. nop
            18. codeends
            19. endstart

            追后程序會運行s處的

            mov ax,4c00h

            int 21h

            而正常終止。

            為什么?

            debug可以發(fā)現(xiàn),jmp short s1 復(fù)制到s處后,由原來的jmp 0018H變成 jmp 0000H。

            但是本質(zhì)的機(jī)器碼是EBF6沒變就是ip = ip - 10。



            關(guān)鍵詞: 匯編入門轉(zhuǎn)移指

            評論


            技術(shù)專區(qū)

            關(guān)閉