天天看點

【彙編語言/底層開發】9、轉移指令的原理1、操作符Offset;2、jmp指令:3、條件轉移指令和循環指令

可以修改IP或者同時修改CS和IP的指令統稱為轉移指令。轉移指令控制CPU執行記憶體中某處的代碼,其作用相當于C語言中的GOTO。在C語言中并不鼓勵使用goto語句,但是在彙編語言中由于沒有複雜的流程控制運算符,使用轉移指令稱為必然。在8086中,轉移指令可分為以下幾類:(1)無條件轉移指令;(2)條件轉移指令;(3)循環指令;(4)過程;(5)中斷。

操作符offset是由編譯器處理的符号,功能是取得标号所在的偏移位址。

jmp為無條件跳轉指令,可以修改IP或同時修改CS和IP。使用jmp指令需要給出的資訊有:轉移的目的位址;轉移的距離(段間轉移、段内短轉移、段内近轉移);

jmp指令有四種使用方式:

以下指令:

該指令實作段内短轉移,ip的變化範圍為-128~127。轉移指令結束後,CS:IP指向mark處所辨別的指令位置。

同mov、push等指令不同的是,jmp指令的機器碼中并不包含将要跳轉的目标位址,而前兩者的機器碼都明确包含了将要操作的立即數值。這是因為CPU執行jmp指令時并不需要轉移的目的位址,而采用的是标号所在地的位址同jmp指令的偏移。也就是說,jmp中其實也是包含了目标位址的,隻是采用的是以目前位址為基準的相對位址。

與上述指令相似的還有:

該指令實作是段内近轉移,其轉移的位移為16為,範圍為-32768~32767。near同short的主要差別在于jmp的範圍更大些。

與(1)描述的段内短轉移和近轉移不同,以下指令:

實作的是段間轉移或遠轉移。這個指令中的far ptr表示将使用mark所在的段位址和偏移位址分别修改cs和ip,處理的場合是目前指令位置同目标指令位置距離較遠,超過短轉移和近轉移,或者二者在不同的段中的情況。

目标的ip位址存放在ax中。功能同近轉移指令類似。

通過記憶體單元擷取轉移位址有字和雙字兩種方式。通過字擷取的格式為:jmp word ptr 記憶體位址;通過雙字擷取的格式為:jmp dword ptr 記憶體位址。前者隻改變ip,新的ip值來自于給定的記憶體位址;後者同時改變cs和ip,雙字的高位表示段位址,低位表示偏移位址。

其作用為修改ip為0123h。

其作用為将cs修改為0,ip修改為0123h。

實作二者的指令分别為jcxz和loop指令,二者都是短轉移指令。

(1)jcxz指令:

該指令的構成為:j(jmp)cx(寄存器cx)z(zero),即當cx中的值為0時跳轉,非零時繼續向下執行;使用格式為:

(2)loop指令:

使用格式為:

每次運作後,cx會自減1,當cx為0時,不進行跳轉,向下執行。該指令的最大作用是實作一個循環的功能,使用cx計算循環的次數。

繼續閱讀