王爽彙編語言__轉移指令原理

可以修改IP,或者可以同時修改CS和IP的指令統稱爲轉移指令。

8086CPU的轉移行爲有以下幾類:

* 只修改IP時,稱爲段內轉移,比如:jmp ax

* 同時修改CS和IP時,稱爲段間轉移,比如:jmp 1000:0

由於轉移指令對IP的修改範圍不同,段內轉移又分爲:短轉移和近轉移

* 短轉移IP的修改範圍爲:-128~127

* 近轉移IP的修改範圍爲:-32768~32767

 

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

* 無條件轉移

* 條件轉移

* 循環指令

* 過程

* 中斷

 

 

1.操作符:offset

操作符offset在彙編語言中是由編譯器處理的符號,它的功能是取得標號的便宜地址,例如:

assume cs:codesg
codesg segment

    start: mov ax,offset start
        s: mov ax,offset s

codesg ends
end start 

 

2.jmp指令

jmp爲無條件轉移指令,可以只修改IP,也可以同時修改CS和IP


 3.依據位移進行轉移的jmp指令

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

這種格式的jmp指令實現的是段內短轉移,他對IP的修改範圍爲:-128~127。

比如以下程序:

assume cs:codesg

codesg segment

start: mov ax , 0
       jmp  short s
       add ax , 1

codesg ends
end start

上面程序執行後,ax中的值爲1,跳過了add ax , 1這條指令。

jmp short s這條指令被Debug翻譯成:jmp 0008,這個0008並不是目的地址,而是轉移的地址長度。


4.轉移目的的地址在指令中的jmp指令

jmp far ptr 實現的是段間的轉移,又稱爲遠轉移,例如程序:

assume cs:codesg

codesg segment

    start: mov ax , 0
           mov bx , 0
           jmp far ptr s
           db 256 dup (0)
        s: add ax , 1
           inc ax

codesg ends
end start
這段代碼中的 jmp far ptr s 被Debug翻譯成 :jmp 0BBD:0000


5.轉移地址在寄存器中的jmp指令

指令格式:jmp 16位reg


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

功能:從內存單元地址出開始存放着第一個字,是轉移的目的的偏移地址。

有兩種格式:

(1)jmp word ptr 內存單元地址(段內轉移)

比如如下指令:

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

(2)jmp dword ptr

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

比如下面指令:

mov ax , 0123H
mov ds:[0] , ax
mov word ptr ds:[2] , 0
jmp dword ptr ds:[0]

執行後CS = 0 ,IP = 0123H


7.jcxz指令

jcxz指令爲條件轉移指令,所有的條件轉移指令都是短轉移。

指令格式:jcxz標號(如果(cx) = 0,轉移到標號處執行)


8.loop指令

loop指令爲循環指令,所有的循環指令都是短轉移。

指令格式:loop 標號((cx) = (cx) - 1,如果(cx) != 0 , 轉移到標號處執行)

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