《匯編語言》講稿_09 轉(zhuǎn)移指令的原理_第1頁
《匯編語言》講稿_09 轉(zhuǎn)移指令的原理_第2頁
《匯編語言》講稿_09 轉(zhuǎn)移指令的原理_第3頁
《匯編語言》講稿_09 轉(zhuǎn)移指令的原理_第4頁
《匯編語言》講稿_09 轉(zhuǎn)移指令的原理_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、本課件由匯編網(wǎng)()制作提供第9章 轉(zhuǎn)移指令的原理n9.1 操作符offsetn9.2 jmp指令n9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n9.4 轉(zhuǎn)移的目的地址在指令中的jmp指令n9.5 轉(zhuǎn)移地址在寄存器中的jmp指令n9.6 轉(zhuǎn)移地址在內(nèi)存中的jmp指令n9.7 jcxz指令n9.8 loop指令n9.9 根據(jù)位移進行轉(zhuǎn)移的意義n9.10 編譯器對轉(zhuǎn)移位移超界的檢測本課件由匯編網(wǎng)()制作提供引言n8086CPU的轉(zhuǎn)移指令分為以下幾類: 無條件轉(zhuǎn)移指令 (如:jmp) 條件轉(zhuǎn)移指令 循環(huán)指令(如:loop) 過程 中斷本課件由匯編網(wǎng)()制作提供9.1 操作符offsetn操作符offset在匯

2、編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址。 比如下面的程序: assume cs:codesg codeseg segment start:mov ax,offset start ; 相當于 mov ax,0 s:mov ax,offset s ; 相當于mov ax,3 codesg ends end start本課件由匯編網(wǎng)()制作提供9.1 操作符offsetn問題9.1 有如下程序段,添寫2條指令,使該程序在運行中將s處的一條指令復制到s0處。 思考后看分析。 assume cs:codesg codesg segment s: mov ax,bx ;(nop的機器碼

3、占一個字節(jié)) mov si,offset s mov di,offset s0 _ _ s0: nop ;(nop的機器碼占一個字節(jié)) nop codesg endsends本課件由匯編網(wǎng)()制作提供9.1 操作符offsetn問題9.1分析n(1)s和s0處的指令所在的內(nèi)存單元的地址是多少? cs:offset s 和cs:offset s0。n(2)將s處的指令復制到s0處,就是將cs:offeet s 處的數(shù)據(jù)復制到cs:offset s0處;本課件由匯編網(wǎng)()制作提供9.1 操作符offsetn問題9.1分析(續(xù))n(3)段地址已知在cs中,偏移地址offset s和offset s0

4、已經(jīng)送入si和di中;n(4)要復制的數(shù)據(jù)有多長? mov ax,bx指令的長度為兩個字節(jié),即1個字。n完整程序本課件由匯編網(wǎng)()制作提供9.1 操作符offset assume cs:codesg codesg segment s: mov ax,bx ;(mov ax,bx 的機器碼占兩個字節(jié)) mov si,offset s mov di,offset s0 mov ax,cs:si mov cs:di,ax s0: nop ;(nop的機器碼占一個字節(jié)) nop codesg ends endsn問題9.1完整程序:本課件由匯編網(wǎng)()制作提供9.2 jmp指令njmp為無條件轉(zhuǎn)移,可以

5、只修改IP,也可以同時修改CS和IP;njmp指令要給出兩種信息:n轉(zhuǎn)移的目的地址n轉(zhuǎn)移的距離(段間轉(zhuǎn)移、段內(nèi)短轉(zhuǎn)移,段內(nèi)近轉(zhuǎn)移)本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令njmp short 標號(轉(zhuǎn)到標號處執(zhí)行指令) 這種格式的 jmp 指令實現(xiàn)的是段內(nèi)短轉(zhuǎn)移,它對IP的修改范圍為 -128127,也就是說,它向前轉(zhuǎn)移時可以最多越過128個字節(jié),向后轉(zhuǎn)移可以最多越過127個字節(jié)。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令比如:程序9.1assume cs:codesgcodesg segment start:mov ax,0 jmp short s

6、add ax,1 s:inc axcodesg endsend startn左面的程序執(zhí)行后, ax中的值為 1 ,因為執(zhí)行 jmp short s 后 ,越過了add ax,1 ,IP 指向了標號 s處的 inc ax。也就是說,程序只進行了一次ax加1操作。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n匯編指令jmp short s 對應的機器指令應該是什么樣的呢?n我們先看一下別的匯編指令和其對應的機器指令,(示例)n現(xiàn)在我們在Debug中將程序9.1翻譯成為機器碼,看看結(jié)果本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n匯編指令與機器碼的對應示例 可以

7、看到,在一般的匯編指令中,匯編指令中的idata(立即數(shù)),不論它是表示一個數(shù)據(jù)還是內(nèi)存單元的偏移地址,都會在對應的機器指令中出現(xiàn),因為CPU執(zhí)行的是機器指令,它必須要處理這些數(shù)據(jù)或地址。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n對照匯編源程序,我們可以看到,Debug 將 jmp short s 中的 s 表示為inc ax 指令的偏移地址 8 ,并將jmp short s 表示為 jmp 0008 ,表示轉(zhuǎn)移到cs:0008處。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n這一切似乎合理,可是當我們查看jmp short s或jmp 0008所對應的

8、機器碼,去發(fā)現(xiàn)了問題。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令njmp 0008 ( Debug 中的表示)或jmp short s (匯編語言中的表示)所對應的機器碼為EB 03,注意,這個機器碼中竟不包含轉(zhuǎn)移的目的地址。n這意味著,CPU 在執(zhí)行EB 03的時候,并不知道轉(zhuǎn)移目的地址。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n那么,CPU根據(jù)什么進行轉(zhuǎn)移呢?n沒有了目的地址,CPU如何知道轉(zhuǎn)移到哪里呢?本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n令人奇怪的是,匯編指令jmp short s中,明明是帶有轉(zhuǎn)移的目的地址(由標號

9、s 表示)的,可翻譯成機器指令后,怎么目的地址就沒了呢?本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n沒有了目的地址,CPU如何知道轉(zhuǎn)移到哪里?n我們把程序9.1改寫一下,變成這樣: 程序9.2本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令程序9.2assume cs:codesgcodesg segment start:mov ax,0 mov bx,0 jmp short s add ax,1 s:inc axcodesg endsend start我們在Debug中將程序9.2翻譯為機器碼,看看結(jié)果本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jm

10、p指令n比較一下程序1和2用Debug查看的結(jié)果本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n注意,兩個程序中的 jmp指令都要使IP 指向 inc ax 指令,但是程序 1 的 inc ax 指令的偏移地址為 0008 ,而程序 2 的 inc ax 指令的偏移地址為000BH。n我們再來看兩個程序中的jmp指令所對應的機器碼,都是EB 03。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n這說明CPU在指令jmp指令的時候并不需要轉(zhuǎn)移的目的地址。 兩個程序中的jmp指令的轉(zhuǎn)移目的地址并不一樣,一個是cs:0008,另一個是cs:000B。 如果機器指令中包

11、含了轉(zhuǎn)移的目的地址的話,那么它們對應的機器碼應該是不同的。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n可是它們對應的機器碼都是 EB 03,這說明在機器指令中并不包含轉(zhuǎn)移 的目的地址。 如果機器指令中不包含目的地址的話,那么,也就是說 CPU不需要這個目的地址就可以實現(xiàn)對IP的修改。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n這種信息是什么呢? 我們一步步地分析。n我們先簡單回憶一下CPU執(zhí)行指令的過程(如果你需要更多地回憶,可以復習一下2.10節(jié)的內(nèi)容)。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令nCPU執(zhí)行指令的過程:n(1)從C

12、S:IP指向內(nèi)存單元讀取指令,讀取的指令進入指令緩沖區(qū);n(2)(IP) = (IP)+所讀取指令的長度,從而指向下一條指令;n(3)執(zhí)行指令。轉(zhuǎn)到1,重復這個過程。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n按照這個步驟,我們參照程序9.2的圖看一下: jmp short s指令的讀取和執(zhí)行過程本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令njmp short s指令的讀取和執(zhí)行過程:n(1)(CS)=0BBDH,(IP)=0006,CS:IP指向EB 03(jmp short s的機器碼);n(2)讀取指令碼EB 03進入指令緩沖器;n(3)(IP)=(

13、IP)+所讀取指令的長度=(IP)+2=0008,CS:IP指向add ax,1;n(4)CPU指行指令緩沖器中的指令EB 03;n(5)指令EB 03執(zhí)行后,(IP)=000BH,CS:IP指向inc ax。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n從上面的過程中我們看到,CPU 將指令EB 03 讀入后,IP 指向了下一條指令,即 CS:0008 處的add ax,1,接著執(zhí)行EB 03。n如果 EB 03 沒有對 IP 進行修改的話,那么,接下來 CPU將執(zhí)行 add ax,1。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n可是,CPU 執(zhí)行的 E

14、B 03確是一條修改IP的轉(zhuǎn)移指令,執(zhí)行后 (IP) = 000BH ,CS:IP指向inc ax,CS:0008處的add ax,1沒有被執(zhí)行。nCPU在執(zhí)行EB 03的時候是根據(jù)什么修改的 IP,使其指向目標指令呢?就是根據(jù)指令碼中的03。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n注意,要轉(zhuǎn)移的目的地址是CS:000B,而CPU 執(zhí)行 EB 03時,當前的(IP)=0008,如果將當前的IP值加3,使(IP)=000BH,CS:IP就可以指向目標指令。n在轉(zhuǎn)移指令EB 03中并沒有告訴CPU要轉(zhuǎn)移的目的地址,卻告訴了 CPU 要轉(zhuǎn)移的位移,即將當前的IP向后移動3個字

15、節(jié)。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n因為程序1、2中的jmp 指令轉(zhuǎn)移的位移相同,都是向后 3 個字節(jié),所以它們的機器碼都是EB 03。n原來如此,在“jmp short 標號”指令所對應的機器碼中,并不包含轉(zhuǎn)移的目的地址,而包含的是轉(zhuǎn)移的位移。n這個位移,使編譯器根據(jù)匯編指令中的“標號”計算出來的,本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n轉(zhuǎn)移位移具體的計算方法如下圖:本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n結(jié)論: CPU執(zhí)行 jmp short 標號 指令時并不需要轉(zhuǎn)移的目的地址,只需要知道轉(zhuǎn)移的位移就行了。n具

16、體過程演示本課件由匯編網(wǎng)()制作提供本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n實際上,指令“jmp short 標號”的功能為(IP)=(IP)+8位位移。n(1)8位位移=“標號”處的地址-jmp指令后的第一個字節(jié)的地址;n(2)short指明此處的位移為8位位移;n(3)8位位移的范圍為-128127,用補碼表示 (如果你對補碼還不了解,請閱讀附注2)n(4)8位位移由編譯程序在編譯時算出。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n還有一種和指令“jmp short 標號”功能相近的指令格式: jmp near ptr 標號 它實現(xiàn)的時段內(nèi)近轉(zhuǎn)移

17、。n指令“jmp near ptr 標號”的功能為: (IP)=(IP)+16位位移。本課件由匯編網(wǎng)()制作提供9.3 依據(jù)位移進行轉(zhuǎn)移的jmp指令n指令“jmp near ptr 標號”的說明:n(1)16位位移=“標號”處的地址-jmp指令后的第一個字節(jié)的地址;n(2)near ptr指明此處的位移為16位位移,進行的是段內(nèi)近轉(zhuǎn)移;n(3)16位位移的范圍為 -3276932767,用補碼表示;n(4)16位位移由編譯程序在編譯時算出。本課件由匯編網(wǎng)()制作提供9.4 轉(zhuǎn)移的目的地址在指令中的jmp指令n前面講的jmp指令,其對應的機器碼中并沒有轉(zhuǎn)移的目的地址,而是相對于當前IP的轉(zhuǎn)移位移

18、。n指令 “jmp far ptr 標號” 實現(xiàn)的是段間轉(zhuǎn)移,又稱為遠轉(zhuǎn)移。本課件由匯編網(wǎng)()制作提供9.4 轉(zhuǎn)移的目的地址在指令中的jmp指令n指令 “jmp far ptr 標號” 功能如下:n(CS)=標號所在段的段地址;n(IP)=標號所在段中的偏移地址。nfar ptr指明了指令用標號的段地址和偏移地址修改CS和IP。n我們看下面的程序 本課件由匯編網(wǎng)()制作提供9.4 轉(zhuǎn)移的目的地址在指令中的jmp指令n程序9.3: assume cs:codesg codesg segment start:mov ax,0 mov bx,0 jmp far ptr s db 256 dup (0

19、) s: add ax,1 inc ax codesg ends end start本課件由匯編網(wǎng)()制作提供9.4 轉(zhuǎn)移的目的地址在指令中的jmp指令n我們在Debug中將程序9.3翻譯成為機器碼,看到的結(jié)果如圖:本課件由匯編網(wǎng)()制作提供n如圖中所示: 源程序中的db 256 dup (0),被Debug解釋為相應的若干條匯編指令 。這不是關(guān)鍵,關(guān)鍵是,我們要注意一下jmp far ptr s所對應的機器碼:EA 0B 01 BD 0B ,其中包含轉(zhuǎn)移的目的地址。9.4 轉(zhuǎn)移的目的地址在指令中的jmp指令本課件由匯編網(wǎng)()制作提供n“0B 01 BD 0B” 是目的地址在指令中的存儲順序,

20、高地址的“BD 0B”是轉(zhuǎn)移的段地址:0BBDH,低地址的“0B 01” 是偏移地址:010BH。n對于“jmp X 標號”格式的指令的深入分析請參看附注3。9.4 轉(zhuǎn)移的目的地址在指令中的jmp指令本課件由匯編網(wǎng)()制作提供9.5 轉(zhuǎn)移地址在寄存器中的jmp指令n指令格式:jmp 16位寄存器n功能:IP =(16位寄存器)n這種指令我們在前面的課程(參見2.11節(jié))中已經(jīng)講過,這里就不再詳述。本課件由匯編網(wǎng)()制作提供9.6 轉(zhuǎn)移地址在內(nèi)存中的jmp指令n轉(zhuǎn)移地址在內(nèi)存中的jmp指令有兩種格式:(1) jmp word ptr 內(nèi)存單元地址(段內(nèi)轉(zhuǎn)移) 功能:從內(nèi)存單元地址處開始存放著一個

21、字,是轉(zhuǎn)移的目的偏移地址。 內(nèi)存單元地址可用尋址方式的任一格式給出。 示例本課件由匯編網(wǎng)()制作提供9.6 轉(zhuǎn)移地址在內(nèi)存中的jmp指令n(1) jmp word ptr 內(nèi)存單元地址(段內(nèi)轉(zhuǎn)移) 示例: mov ax,0123Hmov bx,axjmp word ptr bx執(zhí)行后,(IP)=0123Hmov ax,0123Hmov ds:0,axjmp word ptr ds:0執(zhí)行后,(IP)=0123H本課件由匯編網(wǎng)()制作提供9.6 轉(zhuǎn)移地址在內(nèi)存中的jmp指令n轉(zhuǎn)移地址在內(nèi)存中的jmp指令的第二種格式:(2) jmp dword ptr 內(nèi)存單元地址(段間轉(zhuǎn)移) 功能:從內(nèi)存單元地

22、址處開始存放著兩個字,高地址處的字是轉(zhuǎn)移的目的段地址,低地址處是轉(zhuǎn)移的目的偏移地址。(CS)=(內(nèi)存單元地址+2)(IP)=(內(nèi)存單元地址) 內(nèi)存單元地址可用尋址方式的任一格式給出。 示例本課件由匯編網(wǎng)()制作提供9.6 轉(zhuǎn)移地址在內(nèi)存中的jmp指令n(2) jmp dword ptr 內(nèi)存單元地址(段間轉(zhuǎn)移) 示例: mov ax,0123Hmov bx,axmov word ptr bx+2,0jmp dword ptr bx執(zhí)行后,(CS)=0(IP)=0123HCS:IP指向0000:0123。mov ax,0123Hmov ds:0,axmov word ptr ds:2,0jmp

23、dword ptr ds:0執(zhí)行后,(CS)=0(IP)=0123HCS:IP指向0000:0123。本課件由匯編網(wǎng)()制作提供特別提示n檢測點9.1(p170)n沒有完成此檢測點,請不要向下進行。本課件由匯編網(wǎng)()制作提供9.7 jcxz指令n jcxz指令為有條件轉(zhuǎn)移指令,所有的有條件轉(zhuǎn)移指令都是短轉(zhuǎn)移,在對應的機器碼中包含轉(zhuǎn)移的位移,而不是目的地址。對IP的修改范圍都為-128127。n指令格式:jcxz 標號 (如果(cx)=0,則轉(zhuǎn)移到標號處執(zhí)行。)n操作本課件由匯編網(wǎng)()制作提供9.7 jcxz指令njcxz 標號 指令操作:n當(cx)=0時,(IP)=(IP)+8位位移)n8位

24、位移=“標號”處的地址-jcxz指令后的第一個字節(jié)的地址;n8位位移的范圍為-128127,用補碼表示;n8位位移由編譯程序在編譯時算出。n當(cx)=0時,什么也不做(程序向下執(zhí)行)。本課件由匯編網(wǎng)()制作提供9.7 jcxz指令n我們從 jcxz的功能中可以看出,指令“jcxz 標號”的功能相當于: if(cx)=0)jmp short 標號; (這種用C語言和匯編語言進行的綜合描述,或許能使你對有條件指令理解得更加清楚。)本課件由匯編網(wǎng)()制作提供特別提示n檢測點9.2(p171)n沒有完成此檢測點,請不要向下進行。本課件由匯編網(wǎng)()制作提供9.8 loop指令nloop指令為循環(huán)指令,

25、所有的循環(huán)指令都是短轉(zhuǎn)移,在對應的機器碼中包含轉(zhuǎn)移的位移,而不是目的地址。對IP的修改范圍都為-128127。n指令格式:loop 標號 (cx)=(cx)-1,如果(cx)0,轉(zhuǎn)移到標號處執(zhí)行。n操作本課件由匯編網(wǎng)()制作提供9.8 loop指令nloop 標號 指令操作:n(1)(cx)=(cx)-1;n(2)如果(cx)0,(IP)=(IP)+8位位移。n8位位移=“標號”處的地址-loop指令后的第一個字節(jié)的地址;n8位位移的范圍為-128127,用補碼表示;n8位位移由編譯程序在編譯時算出。n當(cx)=0,什么也不做(程序向下執(zhí)行)。本課件由匯編網(wǎng)()制作提供9.8 loop指令n我們從loop的功能中可以看出,指令“l(fā)oop 標號”的功能相當于: (cx)-; if(cx)0)jmpshort 標號本課件由匯編網(wǎng)()制作提供特別提示n檢測點9.3(p172)n沒有完成此檢測點,請不要向下進行。本課件由匯編網(wǎng)()制作提供9.9 根據(jù)位移進行轉(zhuǎn)移的意義n前面我們講到: jmp short 標號 jmp near ptr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論