jmp指令詳解[共40頁(yè)]_第1頁(yè)
jmp指令詳解[共40頁(yè)]_第2頁(yè)
jmp指令詳解[共40頁(yè)]_第3頁(yè)
jmp指令詳解[共40頁(yè)]_第4頁(yè)
jmp指令詳解[共40頁(yè)]_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、jmp指令,jmp為無(wú)條件轉(zhuǎn)移,可以只修改IP,也可以同時(shí)修改CS和IP; jmp指令要給出兩種信息: 轉(zhuǎn)移的目的地址 轉(zhuǎn)移的距離(段間轉(zhuǎn)移、段內(nèi)短轉(zhuǎn)移,段內(nèi)近轉(zhuǎn)移,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,jmp short 標(biāo)號(hào)(轉(zhuǎn)到標(biāo)號(hào)處執(zhí)行指令) 這種格式的 jmp 指令實(shí)現(xiàn)的是段內(nèi)短轉(zhuǎn)移,它對(duì)IP的修改范圍為 -128127,也就是說(shuō),它向前轉(zhuǎn)移時(shí)可以最多越過(guò)128個(gè)字節(jié),向后轉(zhuǎn)移可以最多越過(guò)127個(gè)字節(jié),比如:程序9.1 assume cs:codesg codesg segment start:mov ax,0 jmp short s add ax,1 s:inc ax codesg e

2、nds end start,左面的程序執(zhí)行后, ax中的值為 1 ,因?yàn)閳?zhí)行 jmp short s 后 ,越過(guò)了add ax,1 ,IP 指向了標(biāo)號(hào) s處的 inc ax。也就是說(shuō),程序只進(jìn)行了一次ax加1操作,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,匯編指令jmp short s 對(duì)應(yīng)的機(jī)器指令應(yīng)該是什么樣的呢? 我們先看一下別的匯編指令和其對(duì)應(yīng)的機(jī)器指令,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,匯編指令與機(jī)器碼的對(duì)應(yīng)示例 可以看到,在一般的匯編指令中,匯編指令中的idata(立即數(shù)),不論它是表示一個(gè)數(shù)據(jù)還是內(nèi)存單元的偏移地址,都會(huì)在對(duì)應(yīng)的機(jī)器指令中出現(xiàn),因?yàn)镃PU執(zhí)行的是機(jī)器指令,它必須要處理這些

3、數(shù)據(jù)或地址,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,對(duì)照匯編源程序,我們可以看到,Debug 將 jmp short s 中的 s 表示為inc ax 指令的偏移地址 8 ,并將jmp short s 表示為 jmp 0008 ,表示轉(zhuǎn)移到cs:0008處,下面現(xiàn)在我們?cè)贒ebug中將程序9.1翻譯成為機(jī)器碼, 看看結(jié)果,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,這一切似乎合理,可是當(dāng)我們查看jmp short s或jmp 0008所對(duì)應(yīng)的機(jī)器碼,卻發(fā)現(xiàn)了問(wèn)題,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,jmp 0008 ( Debug 中的表示)或jmp short s (匯編語(yǔ)言中的表示)所對(duì)應(yīng)的機(jī)器碼為EB 0

4、3,注意,這個(gè)機(jī)器碼中竟不包含轉(zhuǎn)移的目的地址。 這意味著,CPU 在執(zhí)行EB 03的時(shí)候,并不知道轉(zhuǎn)移目的地址,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,那么,CPU根據(jù)什么進(jìn)行轉(zhuǎn)移呢? 沒(méi)有了目的地址,CPU如何知道轉(zhuǎn)移到哪里呢,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,令人奇怪的是,匯編指令jmp short s中,明明是帶有轉(zhuǎn)移的目的地址(由標(biāo)號(hào) s 表示)的,可翻譯成機(jī)器指令后,怎么目的地址就沒(méi)了呢,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,沒(méi)有了目的地址,CPU如何知道轉(zhuǎn)移到哪里? 我們把程序9.1改寫(xiě)一下,變成這樣: 程序9.2,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,程序9.2 assume cs:codes

5、g codesg segment start:mov ax,0 mov bx,0 jmp short s add ax,1 s:inc ax codesg ends end start 我們?cè)贒ebug中將程序9.2翻譯為機(jī)器碼,看看結(jié)果,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,比較一下程序1和2用Debug查看的結(jié)果,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,注意,兩個(gè)程序中的 jmp指令都要使IP 指向 inc ax 指令,但是程序 1 的 inc ax 指令的偏移地址為 0008 ,而程序 2 的 inc ax 指令的偏移地址為000BH。 我們?cè)賮?lái)看兩個(gè)程序中的jmp指令所對(duì)應(yīng)的機(jī)器碼,都是EB 0

6、3,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,這說(shuō)明CPU在指令jmp指令的時(shí)候并不需要轉(zhuǎn)移的目的地址。 兩個(gè)程序中的jmp指令的轉(zhuǎn)移目的地址并不一樣,一個(gè)是cs:0008,另一個(gè)是cs:000B。 如果機(jī)器指令中包含了轉(zhuǎn)移的目的地址的話(huà),那么它們對(duì)應(yīng)的機(jī)器碼應(yīng)該是不同的,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,可是它們對(duì)應(yīng)的機(jī)器碼都是 EB 03,這說(shuō)明在機(jī)器指令中并不包含轉(zhuǎn)移 的目的地址。 如果機(jī)器指令中不包含目的地址的話(huà),那么,也就是說(shuō) CPU不需要這個(gè)目的地址就可以實(shí)現(xiàn)對(duì)IP的修改,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,這種信息是什么呢? 我們一步步地分析。 我們先簡(jiǎn)單回憶一下CPU執(zhí)行指令的過(guò)程,1、

7、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,CPU執(zhí)行指令的過(guò)程: (1)從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進(jìn)入指令緩沖區(qū); (2)(IP) = (IP)+所讀取指令的長(zhǎng)度,從而指向下一條指令; (3)執(zhí)行指令。轉(zhuǎn)到1,重復(fù)這個(gè)過(guò)程,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,按照這個(gè)步驟,我們參照程序9.2的圖看一下: jmp short s指令的讀取和執(zhí)行過(guò)程,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,jmp short s指令的讀取和執(zhí)行過(guò)程: (1)(CS)=0BBDH,(IP)=0006,CS:IP指向EB 03(jmp short s的機(jī)器碼); (2)讀取指令碼EB 03進(jìn)入指令緩沖器; (3)(IP

8、)=(IP)+所讀取指令的長(zhǎng)度=(IP)+2=0008,CS:IP指向add ax,1; (4)CPU指行指令緩沖器中的指令EB 03; (5)指令EB 03執(zhí)行后,(IP)=000BH,CS:IP指向inc ax,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,從上面的過(guò)程中我們看到,CPU 將指令EB 03 讀入后,IP 指向了下一條指令,即 CS:0008 處的add ax,1,接著執(zhí)行EB 03。 如果 EB 03 沒(méi)有對(duì) IP 進(jìn)行修改的話(huà),那么,接下來(lái) CPU將執(zhí)行 add ax,1,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,可是,CPU 執(zhí)行的 EB 03確是一條修改IP的轉(zhuǎn)移指令,執(zhí)行后 (IP)

9、= 000BH ,CS:IP指向inc ax,CS:0008處的add ax,1沒(méi)有被執(zhí)行。 CPU在執(zhí)行EB 03的時(shí)候是根據(jù)什么修改的 IP,使其指向目標(biāo)指令呢?就是根據(jù)指令碼中的03,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,注意,要轉(zhuǎn)移的目的地址是CS:000B,而CPU 執(zhí)行 EB 03時(shí),當(dāng)前的(IP)=0008,如果將當(dāng)前的IP值加3,使(IP)=000BH,CS:IP就可以指向目標(biāo)指令。 在轉(zhuǎn)移指令EB 03中并沒(méi)有告訴CPU要轉(zhuǎn)移的目的地址,卻告訴了 CPU 要轉(zhuǎn)移的位移,即將當(dāng)前的IP向后移動(dòng)3個(gè)字節(jié),1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,因?yàn)槌绦?、2中的jmp 指令轉(zhuǎn)移的位移相同,

10、都是向后 3 個(gè)字節(jié),所以它們的機(jī)器碼都是EB 03。 原來(lái)如此,在“jmp short 標(biāo)號(hào)”指令所對(duì)應(yīng)的機(jī)器碼中,并不包含轉(zhuǎn)移的目的地址,而包含的是轉(zhuǎn)移的位移。 這個(gè)位移,使編譯器根據(jù)匯編指令中的“標(biāo)號(hào)”計(jì)算出來(lái)的,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,轉(zhuǎn)移位移具體的計(jì)算方法如下圖,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,結(jié)論: CPU執(zhí)行 jmp short 標(biāo)號(hào) 指令時(shí)并不需要轉(zhuǎn)移的目的地址,只需要知道轉(zhuǎn)移的位移就行了,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,實(shí)際上,指令“jmp short 標(biāo)號(hào)”的功能為(IP)=(IP)+8位位移。 (1)8位位移=“標(biāo)號(hào)”處的地址-jmp指令后的第一個(gè)字節(jié)的地址

11、; (2)short指明此處的位移為8位位移; (3)8位位移的范圍為-128127,用補(bǔ)碼表示 (如果你對(duì)補(bǔ)碼還不了解,請(qǐng)閱讀附注2) (4)8位位移由編譯程序在編譯時(shí)算出,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,還有一種和指令“jmp short 標(biāo)號(hào)”功能相近的指令格式: jmp near ptr 標(biāo)號(hào) 它實(shí)現(xiàn)的時(shí)段內(nèi)近轉(zhuǎn)移。 指令“jmp near ptr 標(biāo)號(hào)”的功能為: (IP)=(IP)+16位位移,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,指令“jmp near ptr 標(biāo)號(hào)”的說(shuō)明: (1)16位位移=“標(biāo)號(hào)”處的地址-jmp指令后的第一個(gè)字節(jié)的地址; (2)near ptr指明此處的位移

12、為16位位移,進(jìn)行的是段內(nèi)近轉(zhuǎn)移; (3)16位位移的范圍為 -3276932767,用補(bǔ)碼表示; (4)16位位移由編譯程序在編譯時(shí)算出,1、依據(jù)位移進(jìn)行轉(zhuǎn)移的jmp指令,2、轉(zhuǎn)移的目的地址在指令中的jmp指令,前面講的jmp指令,其對(duì)應(yīng)的機(jī)器碼中并沒(méi)有轉(zhuǎn)移的目的地址,而是相對(duì)于當(dāng)前IP的轉(zhuǎn)移位移。 指令 “jmp far ptr 標(biāo)號(hào)” 實(shí)現(xiàn)的是段間轉(zhuǎn)移,又稱(chēng)為遠(yuǎn)轉(zhuǎn)移,指令 “jmp far ptr 標(biāo)號(hào)” 功能如下: (CS)=標(biāo)號(hào)所在段的段地址; (IP)=標(biāo)號(hào)所在段中的偏移地址。 far ptr指明了指令用標(biāo)號(hào)的段地址和偏移地址修改CS和IP。 我們看下面的程序,2、轉(zhuǎn)移的目的地址在

13、指令中的jmp指令,程序9.3: assume cs:codesg codesg segment start:mov ax,0 mov bx,0 jmp far ptr s db 256 dup (0) s: add ax,1 inc ax codesg ends end start,2、轉(zhuǎn)移的目的地址在指令中的jmp指令,我們?cè)贒ebug中將程序9.3翻譯成為機(jī)器碼,看到的結(jié)果如圖,2、轉(zhuǎn)移的目的地址在指令中的jmp指令,如圖中所示: 源程序中的db 256 dup (0),被Debug解釋為相應(yīng)的若干條匯編指令 。這不是關(guān)鍵,關(guān)鍵是,我們要注意一下jmp far ptr s所對(duì)應(yīng)的機(jī)器碼:

14、EA 0B 01 BD 0B ,其中包含轉(zhuǎn)移的目的地址,2、轉(zhuǎn)移的目的地址在指令中的jmp指令,0B 01 BD 0B” 是目的地址在指令中的存儲(chǔ)順序,高地址的“BD 0B”是轉(zhuǎn)移的段地址:0BBDH,低地址的“0B 01” 是偏移地址:010BH,2、轉(zhuǎn)移的目的地址在指令中的jmp指令,3、轉(zhuǎn)移地址在寄存器中的jmp指令,指令格式:jmp 16位寄存器 功能:IP =(16位寄存器) 這種指令我們?cè)谇懊娴恼n程(參見(jiàn)2.11節(jié))中已經(jīng)講過(guò),這里就不再詳述,轉(zhuǎn)移地址在內(nèi)存中的jmp指令有兩種格式: (1) jmp word ptr 內(nèi)存單元地址(段內(nèi)轉(zhuǎn)移) 功能:從內(nèi)存單元地址處開(kāi)始存放著一個(gè)字

15、,是轉(zhuǎn)移的目的偏移地址。 內(nèi)存單元地址可用尋址方式的任一格式給出。 示例,4、轉(zhuǎn)移地址在內(nèi)存中的jmp指令,1) jmp word ptr 內(nèi)存單元地址(段內(nèi)轉(zhuǎn)移) 示例,mov ax,0123H mov bx,ax jmp word ptr bx 執(zhí)行后,(IP)=0123H,mov ax,0123H mov ds:0,ax jmp word ptr ds:0 執(zhí)行后,(IP)=0123H,4、轉(zhuǎn)移地址在內(nèi)存中的jmp指令,轉(zhuǎn)移地址在內(nèi)存中的jmp指令的第二種格式: (2) jmp dword ptr 內(nèi)存單元地址(段間轉(zhuǎn)移) 功能:從內(nèi)存單元地址處開(kāi)始存放著兩個(gè)字,高地址處的字是轉(zhuǎn)移的目的段地址,低地址處是轉(zhuǎn)移的目的偏移地址。 (CS)=(內(nèi)存單元地址+2) (IP)=(內(nèi)存單元地址) 內(nèi)存單元地址可用尋址方式的任一格式給出。 示例,4、轉(zhuǎn)移地址在內(nèi)存中的jmp指令,2) jmp dwor

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論