控制轉(zhuǎn)移指令,串操作指令 80386控制轉(zhuǎn)移指令包括:轉(zhuǎn)移指令,循環(huán)指令,過程調(diào)用和返回指令。 A.轉(zhuǎn)移指令包括無條件轉(zhuǎn)移指令JMP和條件轉(zhuǎn)移指令,無條件轉(zhuǎn)移指令分為段內(nèi)直接轉(zhuǎn)移,段內(nèi)間接轉(zhuǎn)移,段間直接轉(zhuǎn)移,段間間接轉(zhuǎn)移。由于80386有保護模式和實模式,在實模式下,段內(nèi)轉(zhuǎn)移的范圍在-128~127,段間轉(zhuǎn)移最大范圍為64K。在保護模式需要用48位指針,即CS:EIP(16位+32位)。條件轉(zhuǎn)移指令有很多包括JCXZ,JECXZ,JBE,JAE,JA,JB等,其用法和8086相似。 B.循環(huán)指令LOOP,LOOPZ,LOO0PE,LOOPNZ,LOOPNE,TASM支持助記符LOOP,LOOPWE,LOOPWZ,LOOPWNZ,LOOPWNE,LOOPD,LOOPWD,LOOPDE,LOOPDNE,LOOPDNZ。以CX作為計數(shù)器時,就可用LOOP,LOOPWE,LOOPWZ,LOOPWNZ,LOOPWNE;在以ECX作為計數(shù)器時,以LOOPD,LOOPDE,LOOPDZ,LOOPDNZ,LOOPDNE,下面的一段例子可以說明問題: ABC PROC MOV CX,100H AA: ;ADD YOUR CODES HERE LOOP AA ABC END
C.過程調(diào)用和返回調(diào)用CALL,RET 這兩個指令與8086的用法相同,但由于80386下有實模式和保護模式下。在實模式下,無論是段內(nèi)調(diào)用還是段間調(diào)用均采用32位指針,即CS:IP,它們的用法與8086下相同。在保護模式下,段間調(diào)用和段內(nèi)調(diào)用均用48位指針,即ECS:IP。RET用于返回,具體實現(xiàn)過程會比較復雜,在介紹完80386的地址的管理機制后會作介紹,先介紹一下以下CALL指令在8086中的用法: a.段內(nèi)直接轉(zhuǎn)移,具體格式:CALL 過程名。此時CS不入棧,IP的內(nèi)棧入棧,入棧后再將加上目的地址與CALL指令的下一條指令的偏移地址之差值就可以轉(zhuǎn)移到目的地址,詳細過程: SP-2=>SP;將堆棧指針SP減2 (SP)<=IP;將IP進棧 IP+偏移地址之差;轉(zhuǎn)到目的地址 b.段內(nèi)間接轉(zhuǎn)移,具體格式:CALL OPRD,那么在這里OPRD可以寄存器或內(nèi)存單元,它的具體實現(xiàn)過程: SP-2=>SP;將堆棧指針SP減2 (SP)<=IP;將IP進棧 IP<=(OPRD);轉(zhuǎn)到目的地址 同a一樣,CS不入棧 c.段間直接轉(zhuǎn)移,具體格式:CALL 過程名 [FAR],此時CS,IP均要入棧,詳細的實現(xiàn)過程: SP-2=>SP;將堆棧指針減2 (SP)<=CS;將CS入棧 SP-2=>SP;將堆棧指針再減2 (SP)<=IP;將IP入棧 ;裝入新的CS,IP IP<=過程入口的偏移地址 CS<=過程入口的段地址 d.段間間接轉(zhuǎn)移,具體格式:CALL OPRD [FAR],此時CS,IP均要入棧,OPRD是32位,你知道在8086中沒有32位寄存器。因此,這里的OPRD一定是存儲單元,高16位是CS的值,低16位是IP值,詳細的實現(xiàn)過程: SP-2=>SP;將堆棧指針減2 (SP)<=CS;將CS入棧 SP-2=>SP;將堆棧指針再減2 (SP)<=IP;將IP入棧 ;裝入新的CS,IP IP<=(OPRD+2,OPRD+3) CS<=(OPRD,OPRD1) e.段內(nèi)返回 格式:RET。實際上它的實現(xiàn)過程: (SP)=>IP;從當前棧頂彈出一個字,將它送給IP指令計數(shù)器 SP+2=>SP;SP f.段間返回 格式:RET,實際上它的實現(xiàn)過程: (SP)=>IP;IP出棧 SP+2=>SP; (SP)=>CS;CS出棧 SP+2=>SP; D.中斷返回指令IRET 功能和用法與8086相同,這里順便介紹一下8086的中斷返回指令 IRET,具體的實現(xiàn)過程: IP<=(SP);IP出棧 SP+2=>SP; CS<=(SP);CS出棧 SP+2=>SP; FLAGS<=(SP);標志寄存器出棧 SP+2=>SP; E.串操作指令 80386在串操作指令方面增加了雙字操作,在8086五條指令的基礎上增加了INS,OUTS。 a.LOADSD,和8086的用法和功能相同,不過是對32位操作數(shù)操作。 b.STOSD,和8086的用法和功能相同,不過是對32位操作數(shù)操作。 c.CMPSD,和8086的用法和功能相同,不過是對32位操作數(shù)操作。 d.SCANSD,和8086的用法和功能相同,不過是對32位操作數(shù)操作。 e.MOVSD,和8086的用法和功能相同,不過是對32位操作數(shù)操作。 f.重復前綴REP,和8086的功能與用法相同,仍以CX為計數(shù)器,看下面的一小程序: ROR ECX,2 REP MOVSD;以CX為計數(shù)器,每次傳送雙字 ROL ECX,1 REP MOVSW;以CX為計數(shù)器,每次傳送一字 ROL ECX,1 REP MOVSB;以CX為計數(shù)器,每個傳送一個字節(jié) g.INSB,INSW,INSD,OUTSB,OUTSW,OUTSD g1.INSB,串輸入指令,以字節(jié)單位,該指令的功能是從DX指定的端口讀入一個字節(jié)到ES:DI指定的內(nèi)存單元中。 g2.INSW,串輸入指令,以字單位,該指令的功能是從DX指定的端口讀入一個字節(jié)到ES:DI指定的內(nèi)存單元中。 g3.INSD,串輸入指令,以雙字單位,該指令的功能是從DX指定的端口讀入一個字節(jié)到ES:DI指定的內(nèi)存單元中。 g4.OUTSB, 串輸出指令,以字節(jié)為單位,將DS:SI內(nèi)存單元的內(nèi)容送往DX指定的端口。 g5.OUTSW, 串輸出指令,以字為單位,將DS:SI內(nèi)存單元的內(nèi)容送往DX指定的端口。 g6.OUTSD, 串輸出指令,以雙字為單位,將DS:SI內(nèi)存單元的內(nèi)容送往DX指定的端口。 g7.串輸入和串輸出指令不影響標志寄存器中的各標志位,串操作指令可以與REP一起使用
|