在計算機中儲存的都是二進位制數,計算機將記憶體中的某些數當做**,某些數當做資料。在根本上,將cs,ip暫存器所指向的記憶體當做**,指令轉移就是修改cs,ip暫存器的指向,彙編中提供了一種修改它們的指令——jmp。
jmp指令可以修改ip或cs和ip的值來實現指令轉移,指令格式為:」jmp 標號「將指令轉移到標號處,例如:
codes segment
assume cs:codes
start:
mov ax,0
jmp s
codes endsinc ax
s: mov ax,3
mov ah,4ch
int 21h
end start
通過單步除錯可以看出在執行jmp後直接執行s標號後面的**,此時ax為3,。jmp s所對應的機器碼為」eb01」,在「inc ax」後面再加其他的指令(加兩個 nop指令)此時jmp所對應的機器碼為」eb03」,每乙個nop指令佔乙個位元組,在新增或刪除它們之間的**可以看到jmp指令所對應的機器碼佔兩個位元組,第乙個位元組的機器碼並不發生改變,改變的是第二個位元組的內容,並且第二個位元組的內容儲存的是跳轉目標指令所在記憶體與jmp指令所在記憶體之間的位移。
其實cup在執行jmp指令時並不會記錄標號所在的記憶體位址,而是通過標號與jmp指令之間的位移,假設jmp指令的下一條指令的位址為org,位移為idata,則目標的記憶體位址為dec = org + idata。(idata有正負之分)
在cpu中有指令累加器稱之為ca暫存器, 程式每執行一條,ca的值加1,jmp指令後可以有4中形式「jmp short s、jmp、 s jmp near ptr s、jmp far ptr s」編譯器在翻譯時,位移所對應的內粗大小為1、2、2、4(分別是cs和ip所對應的位移)。都是帶符號的整型。jmp指令的跳轉分為兩種情況:向前跳轉和向後跳轉。
向後跳**jmp (…..)s
…… ……
s:……
這種情況下,編譯器將jmp指令讀完後,讀下一條指令,並將ca加1,一直讀到相應的標號處,此時ca的值就是位移,根據具體的偽指令來分配記憶體的大小(此時的數應該為正數)
向前跳轉 :
s:…….
……..
jmp (……) s
編譯器在遇到標號時會在標號後新增幾個nop指令(」jmp short s、jmp、 s jmp near ptr s、jmp far ptr s」分別新增1,2,2,4個),讀下一條指令時將ca暫存器的值加1,得到對應的位移,生成機器碼(此時為負數).
這兩種方式分別得到位移後,在執行過程中,利用上述公式計算出對應的位址,實現指令的轉移
下面的一段**充分說明了jmp的這種實現跳轉的機制:
通過以上的分析可以得出,幾個jmp指令所佔的空間為2個位元組,乙個儲存jmp本省的機器碼,eb,另乙個儲存位移。因此兩個nop指令後面的四句是將s2處的「jmp short s1」所對應的機器碼拷貝到s處,利用debug下的-u命令可以看出該處的機器碼為「eb f6」 f6轉化為十進位制是-10.assume cs:code
code segment
mov ax,4c00h
int 21h
start:
mov ax,0
s:nop
nopmov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0:jmp short s
s1:mov ax,0
int 21h
mov ax,0
s2:jmp short s1
nopcode ends
end start
執行到s0處時,jmp指令使cpu下一次執行s處的**,「eb f6」對應的操作利用公式可以得出ip = a - a = 0,下一步執行的**是「mov ax,4c00h」,也就是說該程式在此處結束。
8086 彙編 jmp 指令
功能 修改cs ip的指令 可以通過改變cs ip中的內容,來控制cpu要執行的目標指令。背景 一般情況下指令是順序地逐條執行的,而在實際中,常需要改變程式的執行流程。轉移指令,短轉移 jmp short 標號 功能 ip ip 8位位移 原理 1 8位位移 標號 處的位址 jmp指令後的第乙個位元...
轉移指令jmp和跳轉指令call
以下內容文字描述來自於 王爽老師的 組合語言 教材,建議大家都買一本,哈哈。不是我打廣告,確實人家寫的好,應該支援。我只是附上了自己的和理解而已。只修改ip,稱為段內轉移,如jmp ax 修改cs和ip,稱為段間轉移,如 jmp 1000 0 轉移指令分為 無條件轉移,如jmp 條件轉移 迴圈指令,...
八 彙編 轉移指令的原理
可以修改ip,或者同時修改cs和ip的指令統稱為轉移指令。或者說轉移指令就是可以控制cpu執行記憶體中某處 的指令。8086cpu 轉移行為可以有以下幾類 8086cpu的轉移指令分為 a.取得標號的偏移位址。a.jmp 無條件轉移指令,可以只修改ip,也可以同時修改 cs 和ip。a.jmp sh...