call和ret都是轉移指令,修改Ip或同時修改cs ip。
1.ret和retf
ret指令用棧中的資料,修改ip的內容。從而實現近轉移
retf指令用棧中的資料,修改cs和ip的內容,從而實現遠轉移。
CPU執行ret指令時,進行下面兩步操作
(IP)=((SS)*16+(SP))
(SP)=(SP)+2
相當於POP IP
CPU執行retf指令時進行下面4步操作
(1) (IP)=((SS)16+(SP))
(2) (SP)=(sp)+2
(3) (CS)=((SS)16+(SP))
(4) (sp)=(SP)+2
相當於 POP IP
POP CS
2.CALL指令
(1)將當前的ip或cs和IP壓入棧中
(2)轉移
call指令不能實現短轉移
3.依據位移進行轉移的call指令
call 標號(將當前的IP壓棧後,轉到標號處執行指令)
進行的操作是:
(1)(SP)=(SP)-2
((SS)*16+(SP))=(IP)
(IP)=(IP)+16位位移
16位位移=標號處地址-call指令後的第一個位元組的地址
16位位移的表示範圍-32768-32767,用補碼錶示
16位位移由編譯程式在編譯時算出。
相當於:
push IP
jmp near ptr 標號
4.轉移的目的地址在指令中的call指令
(1)(SP)=(SP)-2
((SS16)+(SP))=(CS)
(SP)=(SP)-2
((SS)16+(SP))=(IP)
(2)(CS)=標號所在段的段地址
(IP)=標號在段中的偏移地址
相當於
push cs
push ip
jmp far ptr 標號