可以修改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 , 轉移到標號處執行)