• <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>

            luqingfei@C++

            為中華之崛起而崛起!
            兼聽則明,偏聽則暗。

            匯編語言--轉移指令的原理

             

            轉移指令的原理

            可以修改IP,或同時修改CSIP的指令統稱為轉移指令

            概括以講,轉移指令就是可以控制CPU執行內存中某處的代碼的指令。

             

             

            8086CPU的轉移行為有以下幾類:

            l         只修改IP時,稱為段內轉移,比如:jmp ax

            l         同時修改CSIP時,稱為段間轉移,比如:jmp 1000:0

             

            由于轉移指令對IP的修改范圍不同,段內轉換又分為:短轉移和近轉移。

            l         短轉移IP的修改范圍為-128~127

            l         近轉移IP的修改范圍為-32768~32767

             

            8086CPU的轉移指令分為以下幾類:

            l         無條件轉移指令(如:jmp

            l         條件轉移指令

            l         循環指令(如:loop

            l         過程

            l         中斷

             

            這些轉移指令轉移的前提條件可能不同,但轉移的基本原理是相同的。

             

             

            操作符offset

            操作符offset在匯編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址。如:

            assume cs:codesg

            codesg segment

                   start: mov ax, offset start                    ;相當于mov ax,0

                          s:mov ax, offset s                 ;相當于mov ax,3

            codesg ends

            end start

             

             

            jmp指令

            jmp為無條件轉移指令,可以只修改IP,也可以同時修改CSIP

            jmp指令要給出兩種信息:

            l         轉移的目的地址

            l         轉移的距離(段間轉移、段內短轉移、段人近轉移)

             

             

            依據位移進行轉移的jmp指令

            jmp short 標號(轉到標號處執行指令)

            這種格式的jmp指令實現的是段內短轉移,它對IP的修改范圍為-128~127,也就是說,它向前轉移時可以最多越過128個字節,向后轉移可以最多越過127個字節。

            jmp指令中的“short”符號,說明指令進行的是短轉移。

            jmp指令中的“標號”是代碼段中的標號,指明了指令要轉移的目的地,轉移指令結束后,CSIP應該指向標號處的指令。

            比如:

            assume cs:codesg

            codesg segment

                   start: mov ax,0

                          mov bx,0

                          jmp short s

                          add ax,1

                    s: inc ax

            codesg ends

            end start

             

            CPU在執行jmp指令的時候并不需要轉移的目的地址。

            在“jmp short 標號”指令所對應的機器碼中,并不包含轉移的目的地址,而包含的是轉移的位移,這個位移,是編譯器根據匯編指令中的“標號”計算出來的。

             

             

            實際上,指令“jmp short 標號”的功能為:(IP)=(IP)+8位位移。

            (1)8位位移=“標號”處的地址-jmp指令后的第一個字節的地址;

            (2)short指明此處的位移為8位移;

            (3)8位位移的范圍為-128~127,用補碼表示;

            (4)8位位移由編譯器在編譯時算出。

             

            還有一種和指令“jmp short 標號”功能相近的指令格式:jmp near prt 標號,它實現的是段內近轉移。

             

            指令“jmp near ptr 標號”的功能為:(IP)=(IP)+16位位移。

            (1)16位位移=指令“標號”處的地址-jmp指令后的第一個字節的地址;

            (2)near ptr指明此處的位移為16位位移,進行的是段內近轉移;

            (3)16位位移的范圍為-32768~32767,用補碼表示。

            (4)16位位移由編譯器程序在編譯時算出。

             

             

            轉移的目的地址在指令中的jmp指令

            前面講的jmp指令,其對應的機器指令中并沒有轉移的目的地址,而是相對于當前IP的轉移地址。

             

            指令“jmp far ptr 標號”實現的是段間轉移,又稱為遠轉移。功能如下:

            (CS)=標號所在段的段地址;(IP=標號所在段中的偏移地址。

            far ptr指明了指令用標號的段地址和偏移地址修改CSIP

             

             

            轉移地址在寄存器中的jmp指令

            指令格式:jmp 16位寄存器

            功能:(IP)=(16位寄存器)

             

             

            轉移地址在內存中的jmp指令

            有兩種格式:

            (1)       jmp word ptr 內存單元地址(段內轉移)

            功能:從內存單元地址處開始存放著一個字,是轉移的目的偏移地址。

            內存單元寺睛可用尋址方式的任一格式給出。比如:

            mov ax,0123H

            mov ds:[0],ax

            jmp word ptr ds:[0]

            執行后,(IP=0123H

             

            又如:

            mov ax,0123H

            mov [bx],ax

            jmp word ptr [bx]

            執行后,(IP)=0123H

             

            (2)       jmp dword ptr 內存單元地址(段間轉移)

            功能:從內存單元地址處開始存放著兩個字,高地址處的字是轉移的目的段地址,低地址處是轉移的目的偏移地址。

            CS=(內存單元地址+2

            IP=(內存單元地址)

            內存單元地址可用尋址方式的任一格式給出。如:

            mov ax,0123H

            mov ds:[0],ax

            mov word ptr ds:[2],0

            jmp dword ptr ds:[0]

            執行后,(CS=0,(IP=0123HCSIP指向0000:0123

             

            又如,

            mov ax,0123H

            mov [bx],ax

            mov word ptr [bx+2],0

            jmp dword ptr [bx]

            執行后,(CS=0,(IP=0123HCS:IP指向0000:0123

             

             

             

            jcxz指令

            jcxz指令為有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改范圍都為:-128~127

            指令格式:jcxz 標號(如果(cx)=0, 轉移到標號處執行。)

            操作:當(cx=0時,(IP=IP+8位位移;

            8位位移=“標號”處的地址-jczx指令后的第一個字節的地址;

            8位位移的范圍為-128~127,用補碼表示;

            8位位移由編譯器在編譯時算出。

            當(cx不等于0時),什么也不做(程序向下執行)。

             

            指令“jcxz 標號”的功能相當于:

            if (cx)==0 jmp short 標號;

             

             

            loop指令

            loop指令為循環指令,所有的循環指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改范圍都為:-128~127

             

            指令格式:loop 標號((cx=cx-1,如果(cx)0,轉移到標號處執行。)

            操作:(1(cx)=(cx)-1

                    (2) 如果(cx)0(IP)=(IP)+8位位移。

            8位位移=“標號”處的地址-loop指令后的第一個字節的地址;

            8位位移的范圍為-128~127,用補碼表示;

            8位位移由編譯器在編譯時算出。

            如果(cx)=0,什么也不做(程序向下執行)。

             

            指令“loop 標號”的功能相當于:

            (cx)--;

            if ( (cx)0) jmp short 標號;

             

             

            根據位移進行轉移的意義

            jmp short 標號

            jmp near ptr 標號

            jcxz 標號

            loop 標號

             

            它們對IP的修改是根據轉移目的地址和轉移起始地址之間的位移來進行的。

            在它們對應的機器碼中不包含轉移的目的地址,而包含的是到目的地址的位移。

            這種設計,方便了程序段在內存中的浮動裝配

             

             

            編譯器對轉移位移超界的檢測

            根據位移進行轉移的指令,它們在轉移范圍受到轉移位移的限制,如果在源程序中出現了轉移范圍超界的問題,在編譯的時候,編譯器將報錯。

             

             

             

             

             

             

             

             

             

             

            posted on 2010-08-04 10:30 luqingfei 閱讀(813) 評論(0)  編輯 收藏 引用 所屬分類: 匯編語言基礎學習

            導航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            留言簿(6)

            隨筆分類(109)

            隨筆檔案(105)

            Blogers

            Game

            Life

            NodeJs

            Python

            Useful Webs

            大牛

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            伊人久久综合热线大杳蕉下载| 亚洲第一永久AV网站久久精品男人的天堂AV| 日韩亚洲国产综合久久久| 久久久久这里只有精品| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 精品久久久久久国产潘金莲| av国内精品久久久久影院| 久久久久九九精品影院| 亚洲成色WWW久久网站| 久久精品免费一区二区三区| 天天做夜夜做久久做狠狠| 天天躁日日躁狠狠久久| 99久久人人爽亚洲精品美女| 日韩欧美亚洲综合久久| 亚洲国产二区三区久久| 亚洲AV无码久久| 久久久久人妻精品一区三寸蜜桃| 亚洲av成人无码久久精品| 91精品无码久久久久久五月天| 精品一二三区久久aaa片| 狠狠色综合久久久久尤物| 亚洲国产另类久久久精品| 久久综合色之久久综合| 91精品日韩人妻无码久久不卡| 久久人与动人物a级毛片| 久久丝袜精品中文字幕| 久久国产精品-久久精品| 久久精品亚洲精品国产色婷| 思思久久99热只有频精品66| 久久国产美女免费观看精品| 无码伊人66久久大杳蕉网站谷歌 | 国产精品99久久久久久猫咪| 人人狠狠综合久久亚洲婷婷| 国产毛片欧美毛片久久久| 色婷婷综合久久久久中文字幕| 久久精品?ⅴ无码中文字幕| 久久99精品国产| 久久精品国产99国产精品澳门| 国产情侣久久久久aⅴ免费| 久久永久免费人妻精品下载| 亚洲∧v久久久无码精品|