1.操作符offset
操作符offset在彙編語言中是由編譯器處理的符号,他的功能是取得标号的偏移位址
比如下面程式:
assume cs:codesg
codesg segment
start:mov ax,offset start
相當于mov ax,0
s:mov ax,offset s
相當于mov ax,3
codesg ends
end start
在上面的程式中,offset操作符取得了标号start和s的偏移位址0和3,是以指令mov ax,offset start相當于指令mov ax,0,因為start是代碼段中的标号,它所标記的指令是代碼段中的第一條指令,偏移位址為0。
mov ax,offset s相當于指令mov ax,3,因為s是代碼段中的标号,它所标記的指令是代碼段中的第二條指令,第一條指令長度是3,則s的偏移位址為3。
2.jmp指令
jmp為無條件轉移指令,可以值修改ip,也可以同時修改cs和ip
jmp指令要給出倆種資訊:
1)轉移的目的位址
2)轉移的距離(段間轉移、段内轉移)
不同的給出母的位址的方法和不同的轉移位置,對應有不同格式的jmp指令。下面我們給出母的位址的不同方法為主線,講解jmp指令的主要應用格式和cpu執行轉移指令的基本原理。
3.根據位移進行轉移的jmp指令
jmp short 标号(轉到标号處執行指令)
這種格式的jmp指令實作的是段内段轉移,它對ip的修改範圍為-128~127,也就是說,它向前轉移時可以最多越過128個位元組,向後轉移可以最多越過127位元組。jmp指令中的short符号,說明指令進行的是短轉移。轉移指令結束後,cs:ip應該指向标号處的指令。
我們通過觀察jmp指令的機器代碼,發現cpu在執行jmp指令的時候并不需要轉移的目的位址。如果倆個程式中的jmp指令的轉移目的位址不一樣,一個是cs:0008,另外一個是cs:000b,如果機器指令中包含了轉移的目的位址的話,那麼他們對應的機器代碼應該不同的,可是他們對應的機器碼都是eb 03,這說明在機器指令中并不包含轉移的目的位址。如果機器指令中不包含目的位址的話,那麼也就是說,cpu不需要這個目的位址就可以實作對ip的修改。
cpu不是神仙,它隻能處理人們提供給它的東西,jmp指令的機器碼中不包含轉移的目的位址,那麼cpu如何知道将ip改為多少呢?是以,在jmp指令的機器碼中,一定包含了某種資訊,使得cpu可以将它當做修改ip的資料,這種資訊試是什麼呢?我們一步步地分析。
我們先簡單回憶一下cpu執行指令的過程
(1)從cs:ip指向的記憶體單元中讀取指令,讀取指令進入指令緩沖器
(2)(ip)=(ip)+讀取指令的長度,進而指向下條指令
(3)執行指令,轉移1重複執行
按照這個步驟,我們參照圖9.2看一下,jmp short s指令的讀取和執行過程:
(1)(cs)=0bbdh,(ip)=0006,cs:ip指向eb 03(jmp short s的機器碼)
(2)讀取指令eb 03進入指令緩沖器
(3)(ip)=(ip)+指令長度=(ip)+2=0008,cs:ip指向add ax,1
(4)cpu執行指令緩沖器中的指令eb 03
(5)指令eb 03執行後,(ip)=000bh,cs:ip指向inc ax
從上面的過程我們看到,cpu将指令eb 03讀入後,ip指向了下一條指令,即cs:0008處的add ax,1,接着執行eb 03。如果eb 03沒有對ip進行修改的話,那麼接下來cpu将執行add ax,1,可是cpu執行eb 03确實是一條修改ip的轉移指令,執行後(ip)=000bh,cs:ip指向inc ax,cs:0008處的add ax,1沒有執行。
cpu在執行eb 03的時候根據什麼修改ip,使其指向目标指令呢?就是根據指令碼中的03。注意,要轉移的目的位址是cs:000b,而cpu執行eb 03時,目前的(ip)=0008,如果将目前ip值加3,使(ip)=000bh,cs:ip就可指向目标指令。在轉移指令eb 03中并沒有告訴cpu要轉移的目的位址,卻告訴了cpu要轉移的位移,即将目前ip向後移動3個位元組。
原來如此,在jmp short 标号指令所對應的機器碼中,并不包含轉移的目的位址,而包含的是轉移的位移。這個位移,是編譯器根據彙編指令中的标号計算出來的。
實際上,指令jmp short 标号的功能是:(ip)=(ip)+8位位移。
指令jmp near ptr 标号的功能:(ip)=(ip)+16位位移。實作段内近轉移。
4.轉移的目的位址在指令中的jmp指令
前面講的jmp指令,其對應的機器指令中并沒有轉移的目的位址,而是相對于目前ip的轉移位移。
指令jmp far ptr 标号實作的段間轉移,又稱遠轉移,功能如下:
(cs)=标号所在的段位址,(ip)=标号在段中的偏移位址。
far ptr指明了指令用标号的段位址和偏移位址修改cs和ip。
5.轉移位址在寄存器中的jmp指令
指令格式:jmp 16位寄存器
功能:(ip)=(16位寄存器)
這種指令我們在前面已經介紹過
6.轉移位址在記憶體中的jmp指令
轉移位址在記憶體中的jmp指令有倆種格式:
(1)jmp word ptr 記憶體位址(段内轉移)
功能:從記憶體單元位址處開始存放一個字,是轉移的目的偏移位址。
記憶體單元位址可用尋址方式的任一格式給出。
比如:
mov ax,0123h
mov ds:[0],ax
jmp word ptr ds:[0]
執行後(ip)=0123h
(2)jmp dword ptr 記憶體單元(段間轉移)
功能:從記憶體單元位址處存放着倆個字,高位址處的字是轉移的目的段位址,低位址處事轉移的目的偏移位址。
(cs)=(記憶體位址+2)
(ip)=(記憶體位址)
7.jcxz指令
jcxz指令是有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的位址。對ip的修改範圍:-128~127。
指令格式:jcxz 标号 (如果(cx)=0,轉移到标号處執行)
操作:當(cx)=0時,(ip)=(ip)+8位位移
如果(cx)!=0,什麼也不做,繼續向下執行。它的功能相當于:if((cx)==0) jmp short 标号