IRET/IRETD - 中斷返回

來源:互聯網
上載者:User

轉自:http://scc.qibebt.cas.cn/docs/optimization/VTune(TM)%20User's%20Guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/instruct32_hh/vc143.htm

http://szkn28szkn.iteye.com/blog/1362460 說明

將程式控制權從異常或中斷處理常式返回異常、外部中斷或軟體產生的中斷所中斷的程式或過程。這些指令也用於執行從嵌套任務的返回。(使用 CALL 指令啟動任務切換時,或是中斷、異常導致任務切換到中斷或異常程式時,都會建立嵌套任務)。請參閱“IA-32 英特爾(R) 體繫結構軟體開發人員手冊”第 1 卷第 6 章中標題為“任務連結”的部分。

IRET 與 IRETD 是相同作業碼的助記符。IRETD 助記符(中斷返回雙字)用於從使用 32 位運算元大小的中斷返回;不過大多數彙編器對這兩種運算元大小都互換使用 IRET 助記符。

在“真實位址模式”中,IRET 指令執行到中斷程式或過程的遠返回。在執行此操作的過程中,處理器從堆棧將返回指令指標、傳回碼段選取器以及 EFLAGS 映像分別彈入 EIP、CS 以及 EFLAGS 寄存器,然後恢複執行中斷的程式或過程。

在“保護模式”中,IRET 指令的操作取決於以下因素:EFLAGS 寄存器中 NT(嵌套任務)與 VM 標誌的設定,以及當前堆棧中儲存的 EFLAGS 映像中的 VM 標誌的設定。根據這些標誌的設定,處理器執行以下類型的中斷返回:

從虛 8086 模式返回。

返回到虛 8086 模式。

特權層級內返回。特權層級間返回。

從嵌套任務返回(任務切換)。

如果清除 NT 標誌(EFLAGS 寄存器),則 IRET 指令執行從中斷過程的遠返回,而不執行任務切換。返回到的程式碼片段的特權層級必須小於或等於中斷處理常式的特權層級(如堆棧彈出的程式碼片段選取器的 PRL 欄位所示)。對於真實位址模式中斷返回,IRET 指令從堆棧將返回指令指標、傳回碼段選取器以及 EFLAGS 映像分別彈入 EIP、CS 以及 EFLAGS 寄存器,然後恢複執行中斷的程式或過程。如果返回到另一個特權層級,則在恢複程式執行之前,IRET 指令還從堆棧彈出堆棧指標與 SS。如果返回到虛 8086 模式,處理器還從堆棧彈出資料區段寄存器。

如果設定 NT 標誌,則 IRET 指令從嵌套任務(使用 CALL 指令、中斷或異常調用的任務)執行任務切換(返回)到調用或中斷的任務。執行 IRET 指令的任務的更新狀態儲存在它的 TSS 中。如果稍後重新進入該任務,則執行 IRET 指令後面的代碼。 操作

IF PE  0THEN GOTO REAL-ADDRESS-MODE:;ELSE GOTO PROTECTED-MODE;FI;REAL-ADDRESS-MODE;IF OperandSize  32THENIF top 12 bytes of stack not within stack limits THEN #SS; FI;IF instruction pointer not within code segment limits THEN #GP(0); FI;EIP  Pop();CS  Pop(); (* 32-bit pop, high-order 16 bits discarded *)tempEFLAGS  Pop();EFLAGS  (tempEFLAGS AND 257FD5H) OR (EFLAGS AND 1A0000H);ELSE (* OperandSize  16 *)IF top 6 bytes of stack are not within stack limits THEN #SS; FI;IF instruction pointer not within code segment limits THEN #GP(0); FI;EIP  Pop();EIP  EIP AND 0000FFFFH;CS  Pop(); (* 16-bit pop *)EFLAGS[15:0]  Pop();FI;END;PROTECTED-MODE:IF VM  1 (* Virtual-8086 mode: PE=1, VM=1 *)THEN GOTO RETURN-FROM-VIRTUAL-8086-MODE; (* PE=1, VM=1 *)FI;IF NT  1THEN GOTO TASK-RETURN;( *PE=1, VM=0, NT=1 *)FI;IF OperandSize=32THENIF top 12 bytes of stack not within stack limitsTHEN #SS(0)FI;tempEIP  Pop();tempCS  Pop();tempEFLAGS  Pop();ELSE (* OperandSize  16 *)IF top 6 bytes of stack are not within stack limitsTHEN #SS(0);FI;tempEIP  Pop();tempCS  Pop();tempEFLAGS  Pop();tempEIP  tempEIP AND FFFFH;tempEFLAGS  tempEFLAGS AND FFFFH;FI;IF tempEFLAGS(VM)  1 AND CPL=0THEN GOTO RETURN-TO-VIRTUAL-8086-MODE; (* PE=1, VM=1 in EFLAGS image *)ELSE GOTO PROTECTED-MODE-RETURN;(* PE=1, VM=0 in EFLAGS image *)FI;RETURN-FROM-VIRTUAL-8086-MODE: (* Processor is in virtual-8086 mode when IRET is executed and stays in virtual-8086 mode *)IF IOPL=3 (* Virtual mode: PE=1, VM=1, IOPL=3 *)THEN IF OperandSize  32THENIF top 12 bytes of stack not within stack limits THEN #SS(0); FI;IF instruction pointer not within code segment limits THEN #GP(0); FI;EIP  Pop();CS  Pop(); (* 32-bit pop, high-order 16 bits discarded *)EFLAGS  Pop();(*VM,IOPL,VIP,and VIF EFLAGS bits are not modified by pop *)ELSE (* OperandSize  16 *)IF top 6 bytes of stack are not within stack limits THEN #SS(0); FI;IF instruction pointer not within code segment limits THEN #GP(0); FI;EIP  Pop();EIP  EIP AND 0000FFFFH;CS  Pop(); (* 16-bit pop *)EFLAGS[15:0]  Pop(); (* IOPL in EFLAGS is not modified by pop *)FI;ELSE #GP(0); (* trap to virtual-8086 monitor: PE=1, VM=1, IOPL<3 *)FI;END;RETURN-TO-VIRTUAL-8086-MODE: (* Interrupted procedure was in virtual-8086 mode: PE=1, VM=1 in flags image *)IF top 24 bytes of stack are not within stack segment limitsTHEN #SS(0);FI;IF instruction pointer not within code segment limitsTHEN #GP(0);FI;CS  tempCS;EIP  tempEIP;EFLAGS  tempEFLAGSTempESP  Pop();TempSS  Pop();ES  Pop(); (* pop 2 words; throw away high-order word *)DS  Pop(); (* pop 2 words; throw away high-order word *)FS  Pop(); (* pop 2 words; throw away high-order word *)GS  Pop(); (* pop 2 words; throw away high-order word *)SS:ESP  TempSS:TempESP;(* Resume execution in Virtual-8086 mode *)END;TASK-RETURN: (* PE=1, VM=1, NT=1 *)Read segment selector in link field of current TSS;IF local/global bit is set to localOR index not within GDT limitsTHEN #GP(TSS selector); FI;Access TSS for task specified in link field of current TSS;IF TSS descriptor type is not TSS or if the TSS is marked not busyTHEN #GP(TSS selector); FI;IF TSS not present THEN #NP(TSS selector); FI;SWITCH-TASKS (without nesting) to TSS specified in link field of current TSS;Mark the task just abandoned as NOT BUSY;IF EIP is not within code segment limit THEN #GP(0);FI;END;PROTECTED-MODE-RETURN: (* PE=1, VM=0 in flags image *)IF return code segment selector is null THEN GP(0); FI;IF return code segment selector addrsses descriptor beyond descriptor table limit THEN GP(selector; FI;Read segment descriptor pointed to by the return code segment selectorIF return code segment descriptor is not a code segment THEN #GP(selector); FI;IF return code segment selector RPL < CPL THEN #GP(selector); FI;IF return code segment descriptor is conformingAND return code segment DPL > return code segment selector RPLTHEN #GP(selector); FI;IF return code segment descriptor is not present THEN #NP(selector); FI:IF return code segment selector RPL > CPL THEN GOTO RETURN-OUTER-PRIVILEGE-LEVEL;ELSE GOTO RETURN-TO-SAME-PRIVILEGE-LEVELFI;END;RETURN-TO-SAME-PRIVILEGE-LEVEL: (* PE=1, VM=0 in flags image, RPL=CPL *)IF EIP is not within code segment limits THEN #GP(0); FI;EIP  tempEIP;CS  tempCS; (* segment descriptor information also loaded *)EFLAGS (CF, PF, AF, ZF, SF, TF, DF, OF, NT)  tempEFLAGS;IF OperandSize=32THENEFLAGS(RF, AC, ID)  tempEFLAGS;FI;IF CPL  IOPLTHENEFLAGS(IF)  tempEFLAGS;FI;IF CPL  0THENEFLAGS(IOPL)  tempEFLAGS;IF OperandSize=32THEN EFLAGS(VM, VIF, VIP)  tempEFLAGS;FI;FI;END;RETURN-TO-OUTER-PRIVILGE-LEVEL:IF OperandSize=32THENIF top 8 bytes on stack are not within limits THEN #SS(0); FI;ELSE (* OperandSize=16 *)IF top 4 bytes on stack are not within limits THEN #SS(0); FI;FI;Read return segment selector;IF stack segment selector is null THEN #GP(0); FI;IF return stack segment selector index is not within its descriptor table limitsTHEN #GP(SSselector); FI;Read segment descriptor pointed to by return segment selector;IF stack segment selector RPL  RPL of the return code segment selectorIF stack segment selector RPL  RPL of the return code segment selectorOR the stack segment descriptor does not indicate a writable data segment;OR stack segment DPL  RPL of the return code segment selectorTHEN #GP(SS selector); FI;IF stack segment is not present THEN #SS(SS selector); FI;IF tempEIP is not within code segment limit THEN #GP(0); FI;EIP  tempEIP;CS  tempCS;EFLAGS (CF, PF, AF, ZF, SF, TF, DF, OF, NT)  tempEFLAGS;IF OperandSize=32THENEFLAGS(RF, AC, ID)  tempEFLAGS;FI;IF CPL  IOPLTHENEFLAGS(IF)  tempEFLAGS;FI;IF CPL  0THENEFLAGS(IOPL)  tempEFLAGS;IF OperandSize=32THEN EFLAGS(VM, VIF, VIP)  tempEFLAGS;FI;FI;CPL  RPL of the return code segment selector;FOR each of segment register (ES, FS, GS, and DS)DO;IF segment register points to data or non-conforming code segmentAND CPL > segment descriptor DPL (* stored in hidden part of segment register *)THEN (* segment register invalid *)SegmentSelector  0; (* null segment selector *)FI;OD;END:


  影響的標誌

根據處理器的操作模式,可能會修改 EFLAGS 寄存器中的所有標誌與欄位。如果執行從嵌套任務到前一項任務的返回,則根據前一項任務的 TSS 儲存的 EFLAGS 映像修改 EFLAGS 寄存器。 保護模式異常

#GP(0) - 如果傳回碼或堆棧段選取器為空白。如果返回指令指標超出傳回碼段限制。

#GP(選取器) - 如果段選取器索引超出描述符表格限制。如果傳回碼段選取器 RPL 大於 CPL。如果相容程式碼片段的 DPL 大於傳回碼段選取器的 RPL。如果非相容程式碼片段的 DPL 不等於程式碼片段選取器的 RPL。如果堆棧段描述符的 DPL 不等於傳回碼段選取器的 RPL。如果堆棧段不是可寫的資料區段。如果堆棧段選取器 RPL 不等於傳回碼段選取器的 RPL。如果程式碼片段的段描述符未指明它是程式碼片段。如果 TSS 的段選取器將自己的局部/全域位設定為局部。如果 TSS 段描述符指出 TSS 忙或不可用。

#SS(0) - 如果堆棧的棧頂位元組超出堆棧限制。

#NP(選取器) - 如果傳回碼或堆棧段不存在。

#PF(錯誤碼) - 如果發生頁錯誤。

#AC(0) - 如果在 CPL 是 3 且啟用對齊檢查的情況下發生未對齊的記憶體引用。 真實位址模式異常

#GP - 如果返回指令指標超出傳回碼段限制。

#SS - 如果堆棧的棧頂位元組超出堆棧限制。 虛 8086 模式異常

#GP(0) - 如果返回指令指標超出傳回碼段限制。如果 IOPL 不等於 3。

#PF(錯誤碼) - 如果發生頁錯誤。

#SS(0) - 如果堆棧的棧頂位元組超出堆棧限制。

#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.