轉移指令
可以修改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,轉移到标号處執行。)
操作:
- 當(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,轉移到标号處執行。)
- (cx)=(cx)-1;
- 如果(cx)≠0,(IP)=(IP)+8位位移。
- 8位位移=标号處的位址 - loop指令後的第一個位元組的位址;
當 (cx)=0 時,什麼也不做(程式向下執行)。
我們從loop的功能中可以看出,loop 标号的功能相當于:
(cx)--;
if((cx)≠0)jmp short 标号;