彙編語言08——轉移指令的原理

整理自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的修改是根據轉移目的地址和轉移起始地址之間的位移來進行的。
在它們對應的機器碼中不包含轉移的目的地址,而包含的是到目的地址的位移距離

這樣做是爲了程序段在內存中的浮動裝配(在大部分內存處都能運行)
發佈了34 篇原創文章 · 獲贊 27 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章