C.過程調(diào)用和返回調(diào)用CALL,RET
這兩個(gè)指令與8086的用法相同,但由于80386下有實(shí)模式和保護(hù)模式下。在實(shí)模式下,無論是段內(nèi)調(diào)用還是段間調(diào)用均采用32位指針,即CS:IP,它們的用法與8086下相同。在保護(hù)模式下,段間調(diào)用和段內(nèi)調(diào)用均用48位指針,即ECS:IP。RET用于返回,具體實(shí)現(xiàn)過程會(huì)比較復(fù)雜,在介紹完80386的地址的管理機(jī)制后會(huì)作介紹,先介紹一下以下CALL指令在8086中的用法:
a.段內(nèi)直接轉(zhuǎn)移,具體格式:CALL 過程名。此時(shí)CS不入棧,IP的內(nèi)棧入棧,入棧后再將加上目的地址與CALL指令的下一條指令的偏移地址之差值就可以轉(zhuǎn)移到目的地址,詳細(xì)過程:
SP-2=>SP;將堆棧指針SP減2
(SP)<=IP;將IP進(jìn)棧
IP+偏移地址之差;轉(zhuǎn)到目的地址
b.段內(nèi)間接轉(zhuǎn)移,具體格式:CALL OPRD,那么在這里OPRD可以寄存器或內(nèi)存單元,它的具體實(shí)現(xiàn)過程:
SP-2=>SP;將堆棧指針SP減2
(SP)<=IP;將IP進(jìn)棧
IP<=(OPRD);轉(zhuǎn)到目的地址
同a一樣,CS不入棧
c.段間直接轉(zhuǎn)移,具體格式:CALL 過程名 [FAR],此時(shí)CS,IP均要入棧,詳細(xì)的實(shí)現(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],此時(shí)CS,IP均要入棧,OPRD是32位,你知道在8086中沒有32位寄存器。因此,這里的OPRD一定是存儲(chǔ)單元,高16位是CS的值,低16位是IP值,詳細(xì)的實(shí)現(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。實(shí)際上它的實(shí)現(xiàn)過程:
(SP)=>IP;從當(dāng)前棧頂彈出一個(gè)字,將它送給IP指令計(jì)數(shù)器
SP+2=>SP;SP
f.段間返回
格式:RET,實(shí)際上它的實(shí)現(xiàn)過程:
(SP)=>IP;IP出棧
SP+2=>SP;
(SP)=>CS;CS出棧
SP+2=>SP;
D.中斷返回指令I(lǐng)RET
功能和用法與8086相同,這里順便介紹一下8086的中斷返回指令
IRET,具體的實(shí)現(xiàn)過程:
IP<=(SP);IP出棧
SP+2=>SP;
CS<=(SP);CS出棧
SP+2=>SP;
FLAGS<=(SP);標(biāo)志寄存器出棧
SP+2=>SP;
E.串操作指令
80386在串操作指令方面增加了雙字操作,在8086五條指令的基礎(chǔ)上增加了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.重復(fù)前綴REP,和8086的功能與用法相同,仍以CX為計(jì)數(shù)器,看下面的一小程序:
ROR ECX,2
REP MOVSD;以CX為計(jì)數(shù)器,每次傳送雙字
ROL ECX,1
REP MOVSW;以CX為計(jì)數(shù)器,每次傳送一字
ROL ECX,1
REP MOVSB;以CX為計(jì)數(shù)器,每個(gè)傳送一個(gè)字節(jié)
g.INSB,INSW,INSD,OUTSB,OUTSW,OUTSD
g1.INSB,串輸入指令,以字節(jié)單位,該指令的功能是從DX指定的端口讀入一個(gè)字節(jié)到ES:DI指定的內(nèi)存單元中。
g2.INSW,串輸入指令,以字單位,該指令的功能是從DX指定的端口讀入一個(gè)字節(jié)到ES:DI指定的內(nèi)存單元中。
g3.INSD,串輸入指令,以雙字單位,該指令的功能是從DX指定的端口讀入一個(gè)字節(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.串輸入和串輸出指令不影響標(biāo)志寄存器中的各標(biāo)志位,串操作指令可以與REP一起使用
聯(lián)系客服