匯編語言——轉移指令(offset,jmp,jcxz)


操作符offset

操作符offset在匯編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址([bx,bp,si,di])。
示例:使該程序在運行中將s處的一條指令復制到s0處。

 1  assume cs:codesg
 2  codesg segment
 3    s: mov ax,bx           ;(mov ax,bx 的機器碼占兩個字節)
 4       mov si,offset s
 5       mov di,offset s0
 6       mov ax,cs:[si]  7       mov cs:[di],ax  8  s0: nop                     ;(nop的機器碼占一個字節)
 9       nop
10  codesg ends
11  ends

jmp指令

jmp為無條件轉移,可以只修改IP,也可以同時修改CS和IP;
jmp指令要給出兩種信息:

  • 轉移的目的地址
  • 轉移的距離(段間轉移、段內短轉移,段內近轉移)

1、段內短轉移

格式:jmp short 標號(轉到標號處執行指令)

這種格式的 jmp 指令實現的是段內短轉移,它對IP的修改范圍為 -128~127,也就是說,它向前轉移時可以最多越過128個字節,向后轉移可以最多越過127個字節。

執行 jmp short 標號 指令的過程:
(1)從CS:IP指向內存單元讀取指令,讀取的指令進入指令緩沖區;
(2)(IP) = (IP)+所讀取指令的長度(8位地址,因為范圍是-128~127),從而指向下一條指令;
(3)執行指令。轉到1,重復這個過程。

所以 CPU在執行 jmp short 標號 指令時並不需要轉移的目的地址,只需要知道轉移的位移就行了。

2、段內近轉移

格式:jmp near ptr 標號

指令“jmp near ptr 標號”的功能為:(IP)=(IP)+16位位移(一個段最大有2^16B)。

3、段間轉移

格式:jmp far ptr 標號

(CS)=標號所在段的段地址;
(IP)=標號所在段中的偏移地址。
far ptr指明了指令用標號的段地址和偏移地址修改CS和IP。

轉移地址在內存中的jmp指令

轉移地址在內存中的jmp指令有兩種格式:
(1) jmp word ptr 內存單元地址(段內轉移)
  功能:從內存單元地址處開始存放着一個字,是轉移的目的偏移地址。內存單元地址可用尋址方式的任一格式給出。
(2) jmp dword ptr 內存單元地址(段間轉移)

jcxz指令

jcxz指令為有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改范圍都為-128~127
指令格式:jcxz 標號(如果(cx)=0,則轉移到標號處執行。)

jcxz 標號 指令操作:
1、當(cx)=0時,(IP)=(IP)+8位位移)

  • 8位位移=“標號”處的地址-jcxz指令后的第一個字節的地址;
  • 8位位移的范圍為-128~127,用補碼表示;
  • 8位位移由編譯程序在編譯時算出。

2、當(cx)!=0時,什么也不做(程序向下執行)。

loop指令

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

指令格式:loop 標號

((cx))=(cx)-1,如果(cx)≠0,轉移到標號處執行。

loop 標號 指令操作:

(1)(cx)=(cx)-1;

(2)如果(cx)≠0,(IP)=(IP)+8位位移。

  • 8位位移=“標號”處的地址-loop指令后的第一個字節的地址;
  • 8位位移的范圍為-128~127,用補碼表示;
  • 8位位移由編譯程序在編譯時算出。

當(cx)=0,什么也不做(程序向下執行)。

 


免責聲明!

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



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