轉移指令是可以修改IP,或同時修改CS和IP的指令
offset 是用于提取标号偏移位址的操作符
jmp在第2章裡說到時用于修改IP或同時修改CS和IP的轉移指令,這章裡單獨的jmp指令是一個無條件的轉移指令
jmp short 标号 是實作段内短轉移
jmp near ptr 标号 是實作段内近轉移
這兩條指令的機器碼都沒有記錄要轉移的目的位址,而是記錄着執行jmp指令後第一個位元組的位址到目的位址的位移量
而 jmp short 标号 的位移量隻有8位(-128~127)
jmp near ptr 标号 的位移量就是16位(-32768~32767)
可以通過書本上的一段代碼可以觀察到:
這是書本上讓我們分析的一段奇怪的代碼
assume cs:code
code segment
mov ax,4c00h
int 21h
start: mov ax, 0
s: nop
nop
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
//這是把S2标号所對應位址的機器碼,
//複制給S标号所對應位址的記憶體單元裡
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short si
nop
code ends
end start
通過debug可以觀察到:·

由圖可以看到s2标号處的jmp指令所對應的機器碼是EBF6
那麼mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
這4條指令執行後,s标号處位址對應的記憶體單元存儲着EBF6這機器碼
而F6轉為有符号的十進制是-8,就是說當指令執行到 jmp short s時,就轉移到s标号處執行下一條指令,而這條指令的機器碼是EBF6,而這指令的解釋是(标号所對應的位址-8),
得到的位址就是1455:0000,那麼轉移到1455:0000處繼續執行指令,這位址記憶體單元存儲的指令是mov ax,4c00h
jmp far ptr 标号 是實作段間轉移,又稱為遠轉移,它的轉移時通過指明目标的CS:IP實作的。
jmp word ptr (記憶體單元位址)這是通過記憶體單元裡的資料來指明轉移位址
jmp dword ptr (記憶體單元位址) 這是通過記憶體單元裡的資料來指明轉移的IP和CS
jcxz 這是條件轉移指令(是以條件轉移指令都是短轉移),這條件是cx 為 0 才進行轉移
之前所學的loop指令是屬于轉移指令(所有的循環指令都是短指令)