匯編語言 第九章 轉移指令的原理


轉移指令:

可以修改IP,或者同時修改CS和IP的指令 稱為轉移指令

只修改IP時,稱為段內轉移,段內轉移根據IP的修改范圍又分為短轉移(short)近轉移(near);短轉移IP的修改范圍為8位補碼表示的范圍:-128~127.近轉移IP的修改范圍為16位補碼表示的范圍:-32768~32767(向前為負,向后為正)

同時修改IP和CS時,稱為段間轉移,又稱遠轉移(far)。

轉移指令分類:

  1. 無條件轉移指令,jmp,其他轉移指令大多可以基於jmp寫出
  2. 有條件轉移指令,jcxz
  3. 循環轉移指令,loop
  4. 過程
  5. 中斷

操作符offset:

offset的功能是獲取標號的偏移地址EA,標號指的是s、start、data一類的名稱。

無條件轉移指令jmp:

jmp給出的兩種信息:

  • 轉移的目的地址,由標號給出
  • 轉移的距離(段間轉移,段內短轉移short,段內近轉移near)
  1. 短轉移、近轉移jmp指令

jmp short 標號  (該指令本身占兩個字節)翻譯成機器碼為 EBXX,XX為轉移位移量的補碼表示,向前為負向后為正。沒有表達出絕對的目的地址,只給出了相對的位移。

位移量XX = 標號處的地址 - jmp指令后一個字節的地址,short指明位移量為8位。(IP)=(IP)+ XX()8位位移

類似的還有 jmp near ptr 標號  (也可寫成jmp s 省略near ptr)(該指令本身占三個字節)翻譯成機器碼為 E9XXXX  其位移量用兩個字節表示,ptr可以看作是長度聲明。(IP)=(IP) +  XXXX   16位位移

      2.遠轉移jmp指令

jmp far ptr 標號 (該指令本身占五個字節)翻譯成機器碼為 EAXXXX YYYY,XXXX為偏移地址,前兩個X為低位,后兩個X為高位;YYYY為段地址,前兩個Y為低位,后兩個Y為高位。

向前轉移:

編譯器中有一個地址計數器AC,編譯器讀到標號s時記下AC的值as,讀到jmp時記下AC的值aj,再用aj - ac算出位移量disp

  • -128 < disp < 127 時,近轉移、遠轉移統統轉化成短轉移,機器碼為EB disp(占兩個字節)
  • disp超出上述范圍,得用16位補碼表示時,短轉移將產生編譯錯誤,近轉移和遠轉移正常執行

向后轉移:

向后轉移時,編譯器先讀到jmp指令,記下aj,但沒有as,一時無法計算位移量disp,這時會對jmp指令進行一個預處理,預處理不管轉移類型,統一當作短轉移,但預留的空間不同

  • 對於短轉移,編譯器生成EB和1個nop指令,相當於預留一字節,用於存放8位disp
  • 對於近轉移,編譯器生成EB和2個nop指令,相當於預留兩字節,用於存放16位disp
  • 對於遠轉移,編譯器生成EB和4個nop指令,相當於預留四字節,用於存放段地址和偏移地址

當編譯器往后讀到as時,計算disp = as - aj

  • -128 < disp < 127 時,近轉移、遠轉移統統轉化成短轉移,機器碼為EB disp,多余的預留空間閑置
  • disp超出上述范圍,得用16位補碼表示時,短轉移將產生編譯錯誤,近轉移和遠轉移正常執行,在預留的位置添上相應代碼即可

   3.轉移信息在寄存器或者內存中的jmp指令

   jmp 16位寄存器(只能是16位寄存器,因為相當於mov ip ,res,寄存器位數要對應)。在Debug中還可以使用 jmp XXXX:YYYY格式直接修改CS和IP,但編譯器無法識別。

  jmp word ptr 內存單元地址    執行后,(IP) = (內存單元地址),指的是內存單元地址中的內容賦給IP,(兩個字節)例如對應內容為0123H,那么IP = 0123H。只改變IP,是段內轉移

  jmp dword ptr 內存單元地址   執行后,(IP)= (內存單元地址)(CS)= (內存單元地址+2),都是賦給其中的內容,(四個字節)低地址賦給IP,高地址賦給CS。改變IP和CS,是段間轉移

  jcxz條件轉移指令:

  jcxz  標號 (如果(cx)=0,執行跳轉指令,(cx)不為0時,跳過該指令)所有的條件轉移指令都是短轉移類型,機器碼中包含的是8位位移。用C語言等價描述為 if ((cx) == 0)  jmp short 標號

  loop循環指令:

  loop 標號 (先執行(cx)= (cx) - 1 ,再判斷如果(cx) ≠0,修改IP轉移到標號處執行,(CX)= 0時跳過指令往下執行)所有的循環指令都是短轉移類型。用C語言等價描述為 (cx)--; if ((cx) != 0) jmp short 標號

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM