修改IP(指令指針)或CS:IP的指令稱為轉移指令,功能是讓CPU執行特定代碼段。8086分類:
jmpjmp short labelEB xx,xx為有符號位移(目標IP - 當前IP - 2)。jmp far ptr labelEA cd ab seg_high seg_low,含完整目標CS:IP(段地址+偏移地址)。jmp segment:offset。jmp axIP = AX,段內近轉移。jmp word ptr [bx]:段內,IP = [BX](字單元)。jmp dword ptr [bx]:段間,IP = [BX], CS = [BX+2](低地址存IP,高地址存CS)。jcxz label (Jump if CX Zero)CX==0則短轉移到label,相當於if (CX==0) jmp short label。loop labelCX--; if (CX!=0) jmp short label。編譯器會檢測短轉移(jmp short、jcxz、loop)的目標位移是否在-128~+127範圍內。超界報錯「Relative jump out of range」。解決:改用近轉移jmp near ptr label或重構代碼縮短距離。
offset操作符偽指令,編譯時計算標號在段內的偏移地址。
mov ax, offset start 等價 mov ax, 0。
mov ax, offset s 等價 mov ax, 3(假設s在start後3字節)。
| 指令 | 類型 | 修改 | 機器碼含地址 | 位移範圍 |
|---|---|---|---|---|
| jmp short | 段內無條件 | IP | 否(相對位移) | ±127 |
| jmp near ptr | 段內無條件 | IP | 是(絕對偏移) | ±32767 |
| jmp far ptr | 段間無條件 | CS:IP | 是(完整地址) | 全空間 |
| jmp reg | 段內寄存器 | IP | 否(寄存器值) | 全段 |
| jmp word ptr mem | 段內內存 | IP | 否(內存值) | 全段 |
| jmp dword ptr mem | 段間內存 | CS:IP | 否(內存值) | 全空間 |
| jcxz | 條件 | IP | 否 | ±127 |
| loop | 循環 | IP | 否 | ±127 |