整理自fishcc論壇
轉移指令的原理
8086CPU的轉移指令的分類:
無條件轉移指令(如jmp)
條件轉移指令
循環指令(如loop)
過程(類似C語言中函數)
中斷
操作符offset
取得標號的偏移地址
例:
start: mov ax,offset start ;相當於mov ax,0
s: mov ax,offset s ;相當於mov ax,3 (上一條語句佔用3個字節)
jmp指令
無條件轉移指令,可以只修改IP,也可以同時修改CS和IP
使用jmp指令需要給出兩種信息
1,轉移的目的地址
2,轉移的距離(段間轉移,段內短轉移,段內近轉移)
jmp short 標號
這種格式是jmp指令實現段內短轉移,它對IP的修改範圍爲-128-127(8位位移)
例:
start: mov ax,0
jmp short s
add ax,1
s: inc ax
上面程序中的add指令將被跳過,不去執行
jmp near ptr 標號
這種格式是jmp指令實現段內近轉移,它對IP的修改範圍爲-32769-32767(16位位移)
jmp far ptr 標號
段間轉移,又稱爲遠轉移
遠轉移對應的機器碼中包含了要轉移目的地的段地址和偏移地址
上面的jmp指令都是使用jmp跳到一個指定標號處,當目標地址在內存中存儲時,使用下面的兩種形式
1,jmp word ptr 內存單元地址(段內轉移)
例如: mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
2,jmp dword ptr 內存單元地址(段間轉移)
dword的內存單元地址中,高地址處的字是轉移的目的段地址,低地址處是轉移的目的偏移
有條件轉移指令:jcxz指令
所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。
對IP的修改範圍都爲-128~127。
指令格式:jcxz 標號
當(cx)=0時,(IP)=(IP)+8位位移)
8位位移=“標號”處的地址-jcxz指令後的第一個字節的地址;
8位位移的範圍爲-128~127,用補碼錶示;
8位位移由編譯程序在編譯時算出。
當(cx)!=0時,什麼也不做(程序向下執行)。
總結:
跳轉的幾種形式:
jmp short 標號
jmp near ptr 標號
jcxz 標號
loop 標號
它們對 IP的修改是根據轉移目的地址和轉移起始地址之間的位移來進行的。
在它們對應的機器碼中不包含轉移的目的地址,而包含的是到目的地址的位移距離
這樣做是爲了程序段在內存中的浮動裝配(在大部分內存處都能運行)