新聞中心

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

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

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

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

        參考: 《匯編語(yǔ)言》 王爽 第9章

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

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

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

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

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

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

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

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

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

        條件轉(zhuǎn)移指令

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

        過(guò)程。

        中斷。

        1. offset,nop指令

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

        nop 占用1一個(gè)字節(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)號(hào)

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

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

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

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

        是段內(nèi)近轉(zhuǎn)移,轉(zhuǎn)移的距離范圍為-32768~32767,其他與jmp short 標(biāo)號(hà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)移的指令時(shí)保存轉(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時(shí),轉(zhuǎn)移(與loop剛剛相反)。所有條件轉(zhuǎn)移指令都是短轉(zhuǎn)移。

        例子:在內(nèi)存2000H段中查找第一個(gè)值位0 的字節(jié),并把它的偏移指定存儲(chǔ)在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)移時(shí),編譯器可以在讀到標(biāo)號(hào)s后記下AC(地址計(jì)算器)的值as,在讀到j(luò)mp ...s (上面5種)后記下AC的值aj。編譯器可以用as-aj計(jì)算出disp

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

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

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

        對(duì)于jmp short s會(huì)編譯錯(cuò)誤

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

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

        先后轉(zhuǎn)移:

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

        對(duì)于jmp short s 編譯器生成一個(gè)EB和一個(gè)nop指令

        對(duì)于jmp near ptr s編譯器生成一個(gè)EB和兩個(gè)nop指令

        對(duì)于jmp far ptr s編譯器生成一個(gè)EB和四個(gè)nop指令

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

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

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

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

        對(duì)于jmp short s會(huì)編譯錯(cuò)誤

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

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

        6. 分析一個(gè)奇怪的程序

        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

        追后程序會(huì)運(yùn)行s處的

        mov ax,4c00h

        int 21h

        而正常終止。

        為什么?

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

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



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

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 祁连县| 阳信县| 弥渡县| 通城县| 来凤县| 房产| 平果县| 长海县| 江口县| 和平区| 通化县| 浦东新区| 宾阳县| 揭东县| 兴仁县| 栾川县| 余江县| 上犹县| 奈曼旗| 三江| 民权县| 永泰县| 武强县| 隆林| 潢川县| 称多县| 双辽市| 拉孜县| 仪征市| 华池县| 新昌县| 白玉县| 西乌珠穆沁旗| 鱼台县| 中超| 兰坪| 阿巴嘎旗| 乐山市| 南溪县| 高碑店市| 张家口市|