0x00 調用call指令
執行該指令轉向目的地的地址所指示的過程,並且這個過程執行完畢后,仍然返回到CALL指令的下一條指令地址,取指令繼續執行原來的程序,因而也叫做過程調用指令。當然,該指令執行時,CPU首先將斷點(IP或者CS:IP壓入棧),然后以新的目的地址(即過程指令的首地址)裝入IP或者CS:IP,於是控制轉移到被調用的過程,與JMP指令一樣,CALL指令也有段內和段間的直接調用和間接調用。調用過程也稱作調用子程序。
- 段內直接調用
格式:
CALL NEAR PTR DST
功能:(SP)<——(SP)-2; SP-2
(SP)+1,(SP)<——IP; IP入棧
IP<——(IP)+16位位移量: 轉向子程序入口
說明:第一步操作是把子程序返回地址(即CALL指令的下一條指令地址)壓入堆棧,以便過程返回時使用;第二步操作是轉移到被調用過程的入口地址去執行指令。指令中的DST為過程名,16位位移量是被調用過程入口地址與CALL指令的下一條指令地址之間的差值。
- 段內間接調用
格式:
CALL NEAR PTR DST
功能:(SP)<——(SP)-2 ;SP-2
(SP)+1,(SP)<——IP ;IP入棧
IP<——(EA); 轉向子程序入口
說明:該指令與段內直接調用類似,區別在於IP的值不是由CALL指令的下一條指令地址加上16位位移量形成的。如果DST是16位通用寄存器操作數,則把寄存器內容送到IP:如果DST是字存儲操作數則把存儲單元的內容送IP。
例如:
CALL BX ; BX內容送IP
CALL WORD PTR [BX] ; (DS:BX)中讀出一個字數據送IP
- 段間直接調用
格式:
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壓棧;其二,CS和IP的值不適用CALL指令的下一條指令地址位移量加上偏移量取代,而是直接將DST的段地址和偏移地址送入CS:IP
例如:
CALL 1000H:0100H ; 1000H直接送CS,0100H送IP
CALL FRA PTR SUB-PROC ; 過程SUB-PROC的段地址送CS,偏移送IP
- 段間間接調用
格式:
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
功能:
- 段內返回。
IP<-(SP)+1,SP
SP<-SP+2
- 段間返回
IP<-(SP)+1,SP
SP<-SP+2
CS<-(SP)+1,SP
SP<-SP+2