轉移指令
在8086CPU中,轉移指令可分為如下幾類
- 無條件轉移指令,如jmp
- 條件轉移指令,如jcxz
- 循環指令,如loop
- 過程
- 中斷
在此,只先討論無條件轉移中的jmp,其他東西以后再更
jmp為無條件轉移指令,可以只修改IP,也可以同時修改CS和IP
依據位移進行轉移的jmp指令
所謂依據位移呢,就是根據轉移指令到要轉移的目的地址之間相差的字節數來進行轉移的,相差的字節數由編譯器進行計算給出,在生成的機器指令中只包含相差的字節數,不包含目的地址,這樣會是的程序更加的靈活
jmp short 標號
這種格式的jmp指令實現的是段內短轉移,他對IP的修改范圍為-128~127,超過這個范圍會報錯
使用如下面的例子
codesg segment
start: mov ax,0
jmp short s
add ax,1
s: inc ax
codesg ends
end start
參照書上的總結就是:jmp short 標號 的功能為:(IP)=(IP)+8位位移
- 8位位移=標號處的地址-jmp指令后的第一個字節的地址(為什么是指令后第一個字節的地址,是因為和cpu執行指令的方式有關)
- short指明此處的位移為8位位移
- 8位位移的范圍為-128~127,用補碼表示
- 8位位移由編譯程序在編譯時算出
jmp near ptr 標號
它和jmp short 標號的功能相似,不過是實現的段內近轉移
它實現的功能為:(IP)=(IP)+ 16為位移,類似上面
- 16位位移=標號處的地址-jmp指令后的第一個字節的地址
- near ptr 指明此處的位移為16位位移,進行的是段內近轉移
- 16位位移的范圍為-32768~32767,用補碼表示
- 16為位移由編譯程序在編譯時給出
轉移的目的地址在指令中的jmp指令
前面的jmp指令只能進行段間的轉移,但是我們有時候需要轉移的“更遠”,這時候就需要這種類型的指令了
jmp far ptr 標號
此指令實現的是段間轉移,又稱為遠轉移功能如下
- (CS)=標號所在段的段地址,(IP)=標號在段中的偏移地址
- far ptr 指明了用標號的段地址和偏移地址修改CS和IP
例如:
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指令
jmp 16位reg
功能:(IP)=(16位reg)
轉移地址在內存中的jmp指令
轉移地址在內存中的jmp指令有兩種格式:段內轉移和段間轉移
jmp word ptr 內存單元地址(段內轉移)
功能:
- 從內存單元地址處開始存放一個字,是轉移的目的偏移地址
- 內存單元地址可用尋址方式的任一格式給出
例如:
mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
jmp dword ptr 內存單元地址(段間轉移)
功能:
- 從內存單元地址處開始存放者兩個字,高地址的字為轉移的目的段地址,低地址處為轉移的目的偏移地址
- (CS)=(內存單元地址+2),(IP)= (內存單元地址)
- 內存單元地址可以用尋址方式的任何一種格式給出
例如:
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
本文總結自王爽的《匯編語言》,如有錯誤歡迎指正