首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

匯編語言學習第九章:轉移指令詳解——jmp、jcxz、loop

     編輯:關於C

轉移指令分類

修改IP(指令指針)或CS:IP的指令稱為轉移指令,功能是讓CPU執行特定代碼段。8086分類:

  • 段內轉移:僅修改IP。分短轉移(IP±127/128)和近轉移(IP±32767/32768)。
  • 段間轉移:同時修改CS和IP(遠轉移)。

無條件轉移:jmp

1. 相對短轉移 jmp short label

  • 機器碼:EB xx,xx為有符號位移(目標IP - 當前IP - 2)。
  • 位移範圍:-128~+127字節。
  • 不包含目標地址,僅含相對位移,故代碼可移植。

2. 遠轉移 jmp far ptr label

  • 機器碼:EA cd ab seg_high seg_low,含完整目標CS:IP(段地址+偏移地址)。
  • 汇编器生成jmp segment:offset。

3. 寄存器間接轉移 jmp ax

  • IP = AX,段內近轉移。

4. 內存間接轉移

  • 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 label

  • CX--; if (CX!=0) jmp short label。
  • 自動遞減CX並判斷,實現計數循環。
  • 均為短轉移,位移範圍受限。

位移超界檢測

編譯器會檢測短轉移(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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved