CPU執行call指令時,進行兩步操做:內存
call指令不能實現短轉移,除此以外,call指令實現轉移的方法和jmp指令的原理相同。編譯
1)依據位移進行轉移的call指令原理
call 標號(將當前的IP壓棧後,轉到標號處執行指令)程序
CPU執行此種格式的call指令時,進行以下的操做:方法
((ss)*16+(sp))=(IP)call
16位位移=標號處的地址-call指令後的第一條字節的地址word
16位位移的範圍爲-32768~32767,用補碼錶示
16位位移由編譯程序在編譯時算出。
2)轉移目的地址在指令中的call指令
"call far ptr 標號"實現的是段間轉移。
CPU執行此種格式的call指令時,進行以下的操做。
((ss)*16+(sp))=(cs)
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(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 內存單元地址
功能:
((ss)*16+(sp))=(cs)
(sp)=(sp)-2
((ss)*16+(sp))=(IP)