段內轉移和段間轉移
轉移指令:控制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會開啟乙個資料夾沒...