1. 程式人生 > >call指令

call指令

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)=(記憶體單元地址)