天天看點

彙編語言-轉移指令

轉移指令

可以修改IP,或同時修改CS和IP的指令統稱為轉移指令。概括地講,轉移指令就是可以控制CPU執行記憶體中某處代碼的指令。

8086CPU的轉移行為有以下幾類。

  • 隻修改IP時,稱為段内轉移,比如:jmp ax
  • 同時修改CS和IP時,稱為段間轉移,比如:jmp 1000:0。

由于轉移指令對IP的修改範圍不同,段内轉移又分為:短轉移和近轉移。

  • 短轉移IP的修改範圍為 -128~127。
  • 近轉移IP的修改範圍為 -32768~32767。

8086CPU的轉移指令分為以下幾類。

  • 無條件轉移指令(如:jmp)
  • 條件轉移指令(如:jcxz)
  • 循環指令(如:loop)
  • 過程
  • 中斷

操作符 offset

操作符offset在彙編語言中是由編譯器處理的符号,它的功能是取得标号的偏移位址。

mov ax,offset start		;相當于指令 movax,0	因為start是代碼段中的标号,它所标記的指令是代碼段中的第一條指令,編譯位址為0。
           

jmp 指令

jmp為無條件轉移指令,可以隻修改IP,也可以同時修改CS和IP。

jmp指令要給出兩種資訊:

  • 轉移的目的位址。
  • 轉移的距離(段間轉移,段内短轉移,段内近轉移)

jmp short 标号(轉到标号處執行指令)段内短轉移

jmp short 标号 的功能為:(ip)=(ip)+8位位移。

  • 8位位移=标号處的位址 - jmp 指令後的第一個位元組的位址;
  • short 指明此處的位移為 8位位移;
  • 8位位移的範圍為 -128~127,用補碼表示;
  • 8位位移由編譯程式在編譯時算出。

jmp near ptr 标号,和 jmp short 标号類似,是段内近轉移。

jmp near 标号 的功能為:(ip)=(ip)+16位位移。

  • 16位位移=标号處的位址 - jmp 指令後的第一個位元組的位址;
  • near ptr 指明此處的位移為16位位移;
  • 16位位移的範圍為 -32768~32767,用補碼表示;
  • 16位位移由編譯程式在編譯時算出。

jmp far ptr 标号,實作的是段間轉移,又稱為遠轉移。

  • (CS)=标号所在段的段位址:(IP)=标号在段中的偏移位址。
  • far ptr 指明了指令用标号的段位址和偏移位址修改CS和IP。
  • 高位址是轉移的段位址,低位址是偏移位址。

jmp 某一合法寄存器

  • 用寄存器中的值修改IP
  • jmp ax,在含以上好似:mov ip,ax。

jmp word ptr 記憶體單元位址(段内轉移)

功能:從記憶體單元位址處開始存放着一個字,是轉移的目的偏移位址。

mov ax,0123h
mov ds:[0],ax
jmp word ptr ds:[0]		;執行後,(IP)=0123h。
           

jmp dword ptr 記憶體單元位址(段間轉移)

功能:從記憶體單元位址處開始存放着兩個字,高位址處的字是轉移的目的段位址,低位址處是轉移的目的偏移位址。

  • (CS)=(記憶體單元位址+2)
  • (IP)=(記憶體單元位址)
mov ax,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
word dword ptr ds:[0]	;執行後,(CS)=0,(IP)=0123h,CS:IP 指向 0000:0123
           

jcxz 指令

jcxz 指令為有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的位址。對IP的修改範圍都為:-128~127。

指令格式:

  • jcxz 标号(如果(cx)=0,轉移到标号處執行。)

操作:

  1. 當(cx)=0時,(IP)=(IP)+8位位移;
  • 8位位移=标号處的位址 - jcxz指令後的第一個位元組的位址;
  • 8位位移的範圍為-128~127,用補碼表示。

當 (cx)≠0 時,什麼也不做(程式向下執行)。

我們從jcxz的功能中可以看出,jcxz 标号的功能相當于:

if((cx)==0)jmp short 标号;
           

loop 指令

loop指令為循環指令,所有的循環指令都是段轉移,在對應的機器碼中包含轉移的位移,而不是目的位址。對IP的修改範圍都為:-128~127。

  • loop 标号 ((cx)=(cx)-1,如果(cx)≠0,轉移到标号處執行。)
  1. (cx)=(cx)-1;
  2. 如果(cx)≠0,(IP)=(IP)+8位位移。
  • 8位位移=标号處的位址 - loop指令後的第一個位元組的位址;

當 (cx)=0 時,什麼也不做(程式向下執行)。

我們從loop的功能中可以看出,loop 标号的功能相當于:

(cx)--;
if((cx)≠0)jmp short 标号;
           

繼續閱讀