匯編調用指令的執行過程


 0x00 調用call指令

   執行該指令轉向目的地的地址所指示的過程,並且這個過程執行完畢后,仍然返回到CALL指令的下一條指令地址,取指令繼續執行原來的程序,因而也叫做過程調用指令。當然,該指令執行時,CPU首先將斷點(IP或者CSIP壓入棧),然后以新的目的地址(即過程指令的首地址)裝入IP或者CS:IP,於是控制轉移到被調用的過程,與JMP指令一樣,CALL指令也有段內和段間的直接調用和間接調用。調用過程也稱作調用子程序。

  1. 段內直接調用

格式:

CALL   NEAR  PTR  DST

功能:(SP<——(SP-2;       SP-2

     SP+1,(SP<——IP;    IP入棧

      IP<——(IP+16位位移量: 轉向子程序入口

說明:第一步操作是把子程序返回地址(即CALL指令的下一條指令地址)壓入堆棧,以便過程返回時使用;第二步操作是轉移到被調用過程的入口地址去執行指令。指令中的DST為過程名,16位位移量是被調用過程入口地址與CALL指令的下一條指令地址之間的差值。

  1. 段內間接調用

  格式:

CALL   NEAR  PTR  DST

功能:(SP<——(SP-2       ;SP-2

     SP+1,(SP<——IP    ;IP入棧

      IP<——(EA);             轉向子程序入口

說明:該指令與段內直接調用類似,區別在於IP的值不是由CALL指令的下一條指令地址加上16位位移量形成的。如果DST16位通用寄存器操作數,則把寄存器內容送到IP:如果DST是字存儲操作數則把存儲單元的內容送IP

例如:

CALL  BX                 ; BX內容送IP

CALL  WORD PTR [BX]      ; (DS:BX)中讀出一個字數據送IP

  1. 段間直接調用

 格式:

CALL   FAR  PTR  DST

功能:(SP<——(SP-2       ;SP-2

     SP+1,(SP<——CS    ;CS壓棧

      SP<--(SP)-2                ;SP-2

     SP+1,(SP<——IP    ;IP入棧

      IP<-偏移地址             ;IP由指令中指定的偏移地址取代

      CS<-段地址               ;CS由指令中指定的段地址取代

說明:該指令的操作與段內直接調用類似,不同的是:其一,調用時不僅要保護偏移地址,還要保護段地址,順序是先CS壓棧,再把IP壓棧;其二,CSIP的值不適用CALL指令的下一條指令地址位移量加上偏移量取代,而是直接將DST的段地址和偏移地址送入CS:IP

例如:

CALL  1000H0100H                 ; 1000H直接送CS0100HIP

CALL  FRA PTR   SUB-PROC            ; 過程SUB-PROC的段地址送CS,偏移送IP

  1. 段間間接調用

 格式:

CALL   FAR  PTR  DST

功能:(SP<——(SP-2       ;SP-2

     SP+1,(SP<——CS    ;CS壓棧

      SP<--(SP)-2                ;SP-2

     SP+1,(SP<——IP     ;IP入棧

      IP<-EA)                ;EA取代IP中原地址

      CS<-EA+2)              ;EA+2取代CS中原段地址

說明:該指令把段地址和偏移地址壓棧保護,根據尋址方式求出EA后,把存儲單元的字內容送到IP寄存器,並把下一個字的內容送到CS寄存器。

0x01 返回指令RET

 格式:

   

     RET

功能:

  1. 段內返回。

IP<-(SP)+1,SP

SP<-SP+2

  1. 段間返回

IP<-(SP)+1,SP

SP<-SP+2

CS<-(SP)+1,SP

SP<-SP+2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM