jmp用法以及原理分析

2021-08-07 05:26:43 字數 4078 閱讀 7197

段內轉移和段間轉移

轉移指令:控制cpu執行記憶體中的某行**,可以通過修改ip或者同時修改cs:ip

只修改ip的稱為段內轉移:jmp ax  相當於 mov ax,ip   jmp ax

同時修改cs:ip的叫段間轉移:jmp 1000:0(這是debug語法,只能在debug中使用)

段內轉移分為短轉移和近轉移

短轉移ip修改範圍:-128-127(乙個有符號的位元組範圍)

近轉移ip修改範圍:-32768-32767(兩個有符號位元組範圍)

8086轉移指令分幾類:

無條件轉移指令:如jmp

條件轉移指令:如jcxz

迴圈指令:如loop

過程 中斷

操作符offset:

操作符offset在組合語言中是由編譯器處理的符號,它的功能是獲取標號的偏移位址ip,如下程式

assume cs:code

code segment

start:mov ax offset start ;相當於mov ax 0(start)

s: mov ax offset s ;相當於mov ax 3(s)

mov ax, 4c00h

int 21h

code endsend start

jmp的轉移指令原理

一般在彙編指令中,彙編指令中的idata,不論它是表示乙個數,還是記憶體單元位址都會在對應的機器碼中出現,因為cpu執行的是機器指令,它必須處理這些資料和或位址,如下程式

assume cs:code

code segment

start:mov ax,0

mov bx,0123

mov ax,ds:[0123h]

push ds:[0123h]

mov ax, 4c00h

int 21h;

code ends

end start

程式如下圖:

看下例程式和上面的程式的不同點

程式一:

程式二:

這兩個程式中用jmp short命令編譯後的目的位址(idata)沒有出現在機器碼中,這說明cpu在執行jmp轉移指令的時候不需要目的位址

那cpu是靠什麼進行轉移到目的位址的呢?

回想cpu執行指令的過程:

1從cs:ip處向記憶體單元讀取指令,指令進入緩衝區

2ip=ip+指令的長度,cpu指向下一條指令

3執行指令,重複步驟1繼續迴圈

用cpu執行指令過程分析程式1的jmp指令:

1cs=0b41 ip=0003,cpu指向eb03機器碼

2從記憶體單元0b41:0003處讀取指令eb03,  eb03進入緩衝區

3ip=0003+2=0005,cpu指向add ax,1

4cpu執行指令緩衝區的eb03

5eb03執行後ip=0008,cs:ip指向inc ax

在這個過程中可以分析得出,cpu執行指令前ip=0005指向add ax,1,但是執行eb03後,ip=0008cpu指向inc ax,cpu是根據eb03而判斷執行下一條指令的,

eb03是根據是什麼修改ip(偏移位址)的,讓cpu轉移到目標位址的呢?是根據eb03中的03修改ip,要轉移的目標指令cs:0008,當前ip=0005,ip=ip+3=0008

這時cpu就指向目標位址了,在轉移指令eb03並沒有告訴cpu轉移的目的位址卻告訴的cpu要轉移的位移,即將當前的ip向後移動3個位元組,程式1和2中jmp指令的位移都相同所以它們的機器碼都是eb 03

從上面可以知道機器碼中包含的資訊是轉移的位移,而位移是在由編譯器在編譯的時候根據標號算出位移的

如圖表示位移計算:

jmp short 標號 功能為:段內短轉移   (ip)=(ip)+8位位移

1 8位位移=標號處的位址-jmp指令後的第乙個位元組位址

2 short指明的此處是8位位移

3 8位位移的範圍為-128-127,用補碼表示

4 8位位移是編譯程式時在編譯時算出的

jmp near ptr 標號 功能為:段內近轉移 (ip)=(ip)+16位位移

1 8位位移=標號處的位址-jmp指令後的第乙個位元組位址

2 short指明的此處是8位位移

3 8位位移的範圍為-32768-32767,用補碼表示

4 8位位移是編譯程式時在編譯時算出的

下面用jmp指令舉乙個有意思的程式如下:

assume cs:code

code segment

mov ax,4c00h

int 21h

start: mov ax,0

s: nop ;jmp short s1 (ebf6)

nopmov di,offset s ;offset獲取s標號的偏移位址

mov si,offset s2

mov ax,cs:[si] ;cs:[si]是s2的偏移位址的記憶體空間,裡面的值是jmp short s1

mov cs:[di],ax ;把jmp short s1放到cs:[di]=cs:[s]的位址記憶體空間

s0: jmp short s

;看**釋如下:

;這時轉移到s偏移位址執行,s處是jmp short s1,在編譯的時候偏移位址

;就已經算好了是-10(f6),所以執行時候從s處執行jmp short s1(ebf6)時

;目的位址=當前ip(000a)+偏移位址(-10),jmp就轉移的目的位址是cs:00處

;執行cs:00處mov ax,4cooh程式執行結束

s1: mov ax,0

int 21h

mov ax,0

s2: jmp short s1 ;執行時偏移位址為-10 補碼=f6

nopcode ends

end start

程式實驗如下圖:

其他jmp轉移指令

jcxz 標號(條件轉移)功能為:當(cx)=0時,(ip)=(ip)+8位位移,當(cx)!=(不等於)0時候,什麼也不做,程式向下執行,

jcxz 標號相當於 if(cx==0)  

loop和jcxz相反,當cx!=0時,(ip)=(ip)+8位位移

彙編轉移指令jmp原理

在計算機中儲存的都是二進位制數,計算機將記憶體中的某些數當做 某些數當做資料。在根本上,將cs,ip暫存器所指向的記憶體當做 指令轉移就是修改cs,ip暫存器的指向,彙編中提供了一種修改它們的指令 jmp。jmp指令可以修改ip或cs和ip的值來實現指令轉移,指令格式為 jmp 標號 將指令轉移到標...

va list 原理以及用法

va list 是在c語言中解決變參問題的一組巨集 他有這麼幾個成員 1 va list型變數 ifdef m alpha typedef struct va list else typedef char va list endif2 intsizeof 巨集,獲取型別占用的空間長度,最小占用長度為...

Cookie解釋以及原理分析

我們知道web 在客戶端儲存資料有三種形式 1.cookie 2.hidden 隱藏域 3.querystring 其中viewstate什麼的都是通過第二種方式隱藏域儲存滴。好了今天的主角是cookie 小甜餅 先看下cookie存在哪吧!首先,開啟執行對話方塊輸入cookies會開啟乙個資料夾沒...