彙編學習記錄之十

資料來源:彙編語言第二版-王爽

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位位移由編譯程序在編譯時計算出來。

 

 

有錯誤請指正,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章