本博文是對原書8.3.10的內容的總結。
### 一、相對短轉移
指令格式是:
~~~
jmp short 標號
~~~
標號也可以替換成具體的數值(標號和數值是等價的),例如
~~~
jmp short 0x2000
~~~
說明:
(1)該指令屬于段內轉移指令,而且只允許轉移到距離當前指令-128~127字節的地方。
(2)指令的功能是:(IP) = (IP)+8位位移量(范圍是-127~128,用補碼表示)
(3)short指明此處的位移為8位
(4)8位位移=標號處的地址-jmp指令后的第一個字節的地址;8位位移由編譯器在編譯時算出;
### 二、16位相對近轉移
指令格式是:
~~~
jmp near 標號
~~~
同理,標號也可以是具體的數值,如
~~~
jmp near 0x3200
~~~
說明:
(1)該指令屬于段內轉移,轉移范圍是-32768~32767
(2)指令的功能是:(IP)= (IP)+16位位移量(范圍是-32768~32767,用補碼表示)
(3)near指明此處的位移為16位
(4)16位位移=標號處的地址-jmp指令后的第一個字節的地址;16位位移由編譯器在編譯時算出;
?
注意:如果沒有指定關鍵字是near或者short,那么NASM編譯器會根據目標位置距離當前指令的位移量自動選擇near(范圍在-127~128內)或者short(范圍在-127~128外,但是在-32768~32767內)。
?
### 三、16位間接絕對近轉移
指令格式為:
~~~
jmp (near) r16/m16
~~~
說明:
(1)這種轉移也是段內轉移,但是轉移的目標不是在指令中直接給出,而是由一個16位的通用寄存器或者內存地址間接給出
(2)near關鍵字可以省略
(3)執行時,處理器將用16位通用寄存器的值或內存中的那個字取代IP寄存器的內容。
### 四、16位直接絕對遠轉移
指令格式為:
~~~
jmp 段地址:偏移地址
~~~
說明:
(1)屬于段間轉移
(2)執行時,處理器用段地址的內容取代CS的值,用偏移地址(也可以是標號)取代IP的值
### 五、16位直接絕對遠轉移
指令格式為:
~~~
jmp far m32
~~~
說明:
(1)關鍵字far是必須的
(2)操作數是一個內存地址,內存地址處存放著2個字,低字是偏移地址,高字是段地址
(3)執行時,處理器根據內存地址找到偏移地址和段地址,分別用來代替IP和CS的內容
(完)