匯編中的跳轉(zhuǎn)指令從大體上分為無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令。下面就圍繞著這兩個大的方面來探究下匯編語言的跳轉(zhuǎn)指令。
一、無條件轉(zhuǎn)移指令
無條件轉(zhuǎn)移指令JMP將無條件地轉(zhuǎn)移到指令的目的地址去執(zhí)行指令,因此JMP指令必須指定轉(zhuǎn)移的目標地址
無條件轉(zhuǎn)移指令可以分為兩類:段內(nèi)跳轉(zhuǎn)和段間跳轉(zhuǎn),段內(nèi)轉(zhuǎn)移是指在同一段的范圍內(nèi)運行轉(zhuǎn)移。此時轉(zhuǎn)移指令將改變IP寄存器的值,即用新的轉(zhuǎn)移目標地址代替原有的IP寄存器的值來實現(xiàn)轉(zhuǎn)移,因此,此時的目標地址給出偏移量即可,段間轉(zhuǎn)移是要轉(zhuǎn)移到另一個邏輯段去執(zhí)行程序,此時不僅要修改IP寄存器的值,而且還需要修改CS寄存器的值才能達到轉(zhuǎn)移的目的,因此,此時的目標地址應(yīng)由段基值和偏移量兩部分組成。
1、段內(nèi)轉(zhuǎn)移
段內(nèi)轉(zhuǎn)移時,指令和要轉(zhuǎn)移的目標指令同屬于一個段,因此只需修改寄存器IP的值,而代碼段寄存器CS的值保持不變,所以指令中給出目標指令的偏移量即可。根據(jù)給出目標指令偏移量的方式,JMP指令的尋址方式分為段內(nèi)直接尋址和段內(nèi)間接尋址。
【a】、段內(nèi)轉(zhuǎn)移直接尋址
指令的操作數(shù)部分直接給出目標指令的偏移量。在這種情況之下,一般使用標號來作為JMP指令的操作數(shù),指令格式如下。
段內(nèi)轉(zhuǎn)移直接尋址:
JMP NEAR PTR TARGET
執(zhí)行的操作IP<--(IP)+TARGET與JMP指令的下一條指令的16位位移量距離。
【b】、段內(nèi)轉(zhuǎn)移間接尋址
JMP指令轉(zhuǎn)移到目標地址在某一個通用寄存器中或者某一個字存儲單元中。段內(nèi)轉(zhuǎn)移間接尋址的指令格式為:
JMP REG
JMP WORD PTR ADDR
在JMP REG中,REG為通用寄存器,執(zhí)行的操作為:
IP<---通用寄存器REG的內(nèi)存
在JMP WORD PTR ADDR中,ADDR為各種尋址方式確定的存儲單元地址,并且在無歧義的情況下WORD PTR可以省略不寫,執(zhí)行的操作為:
IP<---字存儲單元ADDR的內(nèi)存
2、段間轉(zhuǎn)移
由于這種轉(zhuǎn)移是從一個邏輯段轉(zhuǎn)移到另一個邏輯段,所以執(zhí)行短劍轉(zhuǎn)移指令時,代碼段寄存器CS和指令指針I(yè)P的值都要修改。同樣,根據(jù)目標指令給出地址的方式,可分為短劍轉(zhuǎn)移直接尋址和段間轉(zhuǎn)移間接尋址。
【a】、段間轉(zhuǎn)移直接尋址
指令的操作數(shù)部分通過標號直接給出目標指令的段基值和偏移量,指令格式如下:
JMP FAR PTR TARGET
執(zhí)行的操作為:
IP<---TARGET的偏移量
CS<---TARGET的段基值
【b】、段間轉(zhuǎn)移間接尋址
JMP指令轉(zhuǎn)移的目標地址在某一個雙字存儲單元中,段間轉(zhuǎn)移間接尋址的指令格式為:
JMP DWORD PTR ADDR
執(zhí)行操作為:
IP<---ADDR的第一個字存儲單元中的內(nèi)容
CS<---ADDR的第二個字存儲單元中的內(nèi)容
二、條件轉(zhuǎn)移指令
條件轉(zhuǎn)移指令是根據(jù)CPU中標志寄存器的個狀態(tài)位,入符號位SF,零值位ZF,進位位CF,奇偶位PF與溢出位OF等決定程序的執(zhí)行流程,條件轉(zhuǎn)移指令是以標志寄存器各狀態(tài)為為條件,如果條件成立,則控制轉(zhuǎn)移到指令中國所給出的轉(zhuǎn)移目標。條件不成立,程序?qū)㈨樞驁?zhí)行,關(guān)于標志寄存器的內(nèi)容請看我的另一篇博文,(http://yiluohuanghun.blog.51cto.com/3407300/938213)。
條件轉(zhuǎn)移指令一般在算術(shù)運算、邏輯運算或移位運算等對標志寄存器有影響的指令之后,根據(jù)這些指令操作后影響的狀態(tài)標志決定是否發(fā)生轉(zhuǎn)移。
關(guān)于條件轉(zhuǎn)移指令的細分,我在網(wǎng)上看到一篇不錯的文章,大家有興趣的可以參考下http://hi.baidu.com/jan008yy/blog/item/5b5b07d915a678ef38012f31.html,我在這里就不再一一解釋。
到此為止,我們已經(jīng)掌握了最基本的跳轉(zhuǎn)指令。這部分知識對于我們在后續(xù)篇章中講到的匯編,言分支程序設(shè)計是必要的。