資料來源:彙編語言第二版-王爽
1.轉移指令的原理
可以修改ip,或者同時修改cs和ip的指令統稱爲轉移指令。
概括地講,轉移指令就是可以控制CPU執行內存中某處的代碼的指令。
8086CPU的轉移行爲有以下幾類:
(1.1)只修改ip時,稱爲段內轉移,比如:jmp ax
(1.2)同時修改cs和ip時,稱爲段間轉移,比如: jmp 1000:0
由於轉移指令對ip的修改範圍不同,段內轉移又分爲:短轉移和近轉移。
(1.3)短轉移ip的修改範圍爲-128~127
(1.4)近轉移ip的修改範圍爲-32768~32767
8086CPU的轉移指令分爲以下幾類:
(1.5)無條件轉移指令(如: jmp)
(1.6)條件轉移指令(如:jnz)
(1.7)循環指令(如:loop)
(1.8)過程
(1.9)中斷
這些轉移指令轉移的前提條件可能不同,但轉移的基本原理是相同的。在這裏主要通過深入學習無條件轉移指令jmp來理解CPU執行轉移指令的基本原理。
2.僞指令offset操作符
操作符offset在彙編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址。比如下面的程序:
assume cs:codesg
codesg segment
start: mov ax, offset start ;相當於mov ax, 0
s: mov ax, offset s ;相當於mov ax, 3
codesg ends
end start
在上面的程序中,offset操作符取得了標號start和s的偏移地址0和3,所以指令:
mov ax, offset start 相當於指令 mov ax, 0,因爲start是代碼段中的標號,它所標記的指令是代碼段中的第一條指令,偏移地址爲0;
mov ax, offset s 相當於指令mov ax, 3,因爲s是代碼段中的標號,它所標記的指令是代碼段中的第二條指令,第一條指令長度爲3字節,則s的偏移地址爲3。
3.jmp指令
jmp爲無條件轉移指令,可以只修改ip,也可以同時修改cs和ip。
jmp指令要給出兩種信息:
3.1 轉移的目的地址
3.2 轉移的距離(段間轉移、段內短轉移、段內近轉移)
不同的給出目的地址的方法,和不同的轉移位置,對應有不同格式的jmp指令。
4.依據位移進行轉移的jmp指令
jmp short 標號(轉移到標號處執行指令)
這種格式的jmp指令實現的是段內短轉移,它對ip的修改範圍爲-128~127,也就是說,它向前轉移時最多可以越過128個字節,身後轉移時最多可以越過127個字節。jmp指令中的'short'符號,說明指令進行的是短轉移。jmp指令中的'標號'是代碼段中的標號,指明瞭指令要轉移的目的地,轉移指令結束後,cs:ip應該指向標號處的指令。
例如:
assume cs:codesg
codesg segment
start: mov ax, 0
jmp short s
add ax, 1
s: inc ax
codesg ends
end start
上面的程序執行後,ax中的值爲1,因爲執行jmp short s 後,越過了add ax, 1,ip指向了標號s處的inc ax。也就是說,程序只進行了一次ax加1操作。
CPU在執行jmp指令的時候並不需要轉移的目的地址,只需要轉移的位移。
在'jmp short 標號' 指令所對應的機器碼中,並不包含轉移的目的地址,而包含的是轉移的位移。這個位移,是編譯器根據彙編指令中的'標號'計算出來的。
實際上,指令'jmp short 標號'的功能爲:(ip)=(ip)+8位位移。
(1)8位位移='標號'處的地址 - jmp指令後的第一個字節的地址;
(2)short指明此處的位移爲8位位移,進行的是段內短轉移;
(3)8位位移的範圍爲-128~127,用補碼錶示;
(4)8位位移由編譯程序在編譯時計算出來。
還有一種和指令'jmp short 標號'功能相近的指令格式:'jmp near ptr 標號',它實現的是段內近轉移。
指令'jmp near ptr 標號'的功能爲:(ip)=(ip)+16位位移。
(1)16位位移='標號'處的地址 - jmp指令後的第一個字節的地址;
(2)near ptr指明此處的位移爲16位位移,進行的是段內近轉移;
(3)16位位移的範圍爲-32768~32767,用補碼錶示;
(4)16位位移由編譯程序在編譯時計算出來。
有錯誤請指正,謝謝!