• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            focus on linux, c/c++, lua

            深層理解指令跳轉(zhuǎn)

            這段時(shí)間看王爽的匯編看的效率很高,看樣在學(xué)習(xí)高級(jí)語(yǔ)言后再學(xué)習(xí)asm是速度比較快。其中有講到指令跳轉(zhuǎn)的地方,我當(dāng)時(shí)想到的就是goto,用匯編來(lái)解釋再貼切不過(guò)了。我貼上一道習(xí)題與講解,加深印象。

            ---------------------------------

            分析下面的程序,在運(yùn)行前思考:這個(gè)程序可以正確返回嗎?

            運(yùn)行后再思考:為什么是這種結(jié)果?

            通過(guò)這個(gè)程序加深對(duì)相關(guān)內(nèi)容的理解。

            assume cs:codesg

            codesg segment

                    mov ax,4c00h

                    int 21h

            start:

                    mov ax,0

            s:

                    nop

                    nop       

                    mov di,offset s

                    mov si,offset s2

                    mov ax,cs:[si]

                    mov cs:[di],ax

            s0:

                    jmp short s

            s1:

                    mov ax,0

                    int 21h

                    mov ax,0

            s2:

                    jmp short s1

                    nop

            codesg ends

            end start

            -------------------------------------------------------------------------------------------------------------------------------------------------------

            程序可以正常返回。

             

            詳細(xì)分析:

            在此題中較為深入地考察了‘段內(nèi)直接短轉(zhuǎn)移’[形如:jmp short 標(biāo)號(hào)]的概念。

            我們知道程序中:

            mov di,offset s

            mov si,offset s2

            mov ax,cs:[si]

            mov cs:[di],ax

            四條指令的作用是將標(biāo)號(hào)s2處的一條指令復(fù)制到標(biāo)號(hào)s處。這時(shí)我們應(yīng)該關(guān)心所復(fù)制的語(yǔ)句"jmp short s1"對(duì)程序的影響:我們知道在段內(nèi)直接短轉(zhuǎn)移指令所對(duì)應(yīng)的機(jī)器碼中,并不包含轉(zhuǎn)移的目的地址,而包含的是轉(zhuǎn)移的位移量(如對(duì)此概念還不太熟悉,請(qǐng)查看書(shū)中第167頁(yè)的內(nèi)容)。也就是說(shuō),在源程序的編譯過(guò)程中,編譯器遇到段內(nèi)直接短轉(zhuǎn)移’[形如:jmp short 標(biāo)號(hào)]時(shí)就會(huì)自動(dòng)算出其要跳轉(zhuǎn)的位移量,以便程序在執(zhí)行段內(nèi)直接短轉(zhuǎn)移的指令時(shí)就根據(jù)位移量進(jìn)行(向前或向后)跳轉(zhuǎn)。通過(guò)調(diào)試中的U命令我們可以看到指令's2:jmp short s1'所對(duì)應(yīng)的機(jī)器碼是EBF6F6h(-10d的補(bǔ)碼)就是跳轉(zhuǎn)的位移量[此位移量也可由指令's2:jmp short s1'處的偏移地址18h減去指令's2:jmp short s1'后一個(gè)字節(jié)的偏移地址22h得出]。這時(shí)我們就知道了其實(shí)復(fù)制到標(biāo)號(hào)s處的指令所對(duì)應(yīng)的機(jī)器碼就是EBF6(剛好取代兩個(gè)nop所對(duì)應(yīng)的機(jī)器碼),它的作用就是將當(dāng)前IP向前移動(dòng)10個(gè)字節(jié)。當(dāng)程序執(zhí)行標(biāo)號(hào)s0處的指令后,程序便跳到標(biāo)號(hào)s處接著執(zhí)行標(biāo)號(hào)s處的指令。s處的指令的作用是向前跳10字節(jié),于是便跳到了代碼中的第一條指令,繼續(xù)執(zhí)行后便實(shí)現(xiàn)了程序的正常返回

            [注意:此程序不會(huì)也不可能執(zhí)行標(biāo)號(hào)s1處后的指令。]


            posted on 2010-10-20 10:15 zuhd 閱讀(318) 評(píng)論(0)  編輯 收藏 引用 所屬分類: my tips

            久久夜色精品国产噜噜亚洲AV| 99久久亚洲综合精品成人| 久久综合九色综合欧美就去吻| 久久久久97国产精华液好用吗| 日韩AV毛片精品久久久| 亚洲午夜久久久| 久久精品国产亚洲av高清漫画 | 66精品综合久久久久久久| 国产成人综合久久久久久 | 狠狠综合久久综合88亚洲| 久久精品国产亚洲av麻豆小说 | 亚洲国产成人久久一区WWW| 77777亚洲午夜久久多喷| 久久美女人爽女人爽| 久久久无码精品亚洲日韩软件| 亚洲成色WWW久久网站| 国产成人精品久久亚洲高清不卡 | 久久天天躁狠狠躁夜夜2020一| 国产精品岛国久久久久| 欧美激情一区二区久久久| 日本免费一区二区久久人人澡| 久久无码中文字幕东京热| 久久久精品国产亚洲成人满18免费网站 | 99国产欧美久久久精品蜜芽| 日韩精品无码久久一区二区三| 国产精品久久一区二区三区| 亚洲午夜久久久久久久久久| 久久亚洲av无码精品浪潮| 大美女久久久久久j久久| 精品国产一区二区三区久久久狼 | .精品久久久麻豆国产精品| 99久久无码一区人妻| 久久人人妻人人爽人人爽| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久99精品久久只有精品| 日韩亚洲欧美久久久www综合网| 久久久久久久久久久精品尤物| 久久国产成人午夜aⅴ影院| 精品午夜久久福利大片| 精品国际久久久久999波多野| 亚洲精品乱码久久久久久按摩|