call指令
阿新 • • 發佈:2018-11-07
CPU執行call指令時,進行兩步操作:
- 將當前的IP或CS和IP壓入棧中;
- 轉移。
call指令不能實現短轉移,除此之外,call指令實現轉移的方法和jmp指令的原理相同。
1)依據位移進行轉移的call指令
call 標號(將當前的IP壓棧後,轉到標號處執行指令)
CPU執行此種格式的call指令時,進行如下的操作:
- (sp)=(sp)-2
((ss)*16+(sp))=(IP)
- (IP)=(IP)+16位位移
16位位移=標號處的地址-call指令後的第一條位元組的地址
16位位移的範圍為-32768~32767,用補碼錶示
16位位移由編譯程式在編譯時算出。
2)轉移目的地址在指令中的call指令
"call far ptr 標號"實現的是段間轉移。
CPU執行此種格式的call指令時,進行如下的操作。
- (sp)=(sp)-2
((ss)*16+(sp))=(cs)
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
- (CS)=標號所在段的段地址
(IP)=標號在段中的偏移地址
3)轉移地址在暫存器中的call指令
指令格式: call 16位暫存器
功能:
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(IP)=(16位暫存器)
4)轉移地址在記憶體中的call指令
a)call word ptr 記憶體單元地址
功能:
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(IP)=(記憶體單元地址)
b)call dword ptr 記憶體單元地址
功能:
- (sp)=(sp)-2
((ss)*16+(sp))=(cs)
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
- (IP)=(記憶體單元地址)