|
指令 |
說明 |
|
MWAIT EAX, ECX |
這是一個提示,允許處理器停止指令執行,並進入取決於具體版本的優化狀態,直到發生某類事件。 |
MWAIT 指令設計用於配合 MONITOR 指令使用,以便允許處理器發出以下訊號:等待的地址 (MONITOR) 與導致等待操作開始的指令 (MWAIT)。MWAIT 指令也是一個提示,在處理器等待事件,或等待對地址範圍(由程式流中的前一條 MONITOR 指令設定)的儲存期間,它提示處理器可以選擇進入取決於具體版本的狀態。
具體版本可能會選擇忽略此提示,繼續執行下一條指令。將來具體的處理器版本可能會實現多個優化的等待狀態,並根據提示參數選擇這些狀態。
在將來的處理器設計中,EAX 與 ECX 將用於同 MWAIT 指令就其它資訊進行通訊,如處理器應該進入的優化狀態種類。ECX 指定 MWAIT 指令可選的擴充套件。EAX 可能包含一些提示,如處理器應該進入的首選優化狀態。對於含 SSE3 的英特爾(R) 奔騰(R) 4 處理器,EAX 與 ECX 的所有非零值都是保留值。如果在 ECX 等於保留值的情況下執行 MWAIT 指令,處理器將產生一般保護性錯誤。處理器忽略 EDX 中保留位的設定。
對 MONITOR 指令設定的地址範圍的儲存、中斷、NMI、SMI、除錯異常、機器檢查異常、BINIT# 訊號、INIT# 訊號或 RESET# 訊號都將退出優化狀態。請注意,僅當優化狀態是在啟用中斷的情況下進入的,中斷才會導致處理器退出優化的狀態。如果對地址範圍的儲存導致處理器退出,則會從跟在 MWAIT 指令後面的指令處恢復執行。如果中斷(包括 NMI)導致處理器退出優化狀態,則處理器將退出優化狀態並處理該中斷。如果 SMI 導致處理器退出優化狀態,則在處理完 SMI 之後,從跟在 MWAIT 後面的指令處恢復執行。與 HALT 指令不同,MWAIT 指令不支援在 MWAIT 指令處重新啟動。可能還有其它一些取決於具體版本的事件或超時會導致處理器退出優化狀態,並從跟在 MWAIT 後面的指令處恢復執行。
如果前一條 MONITOR 指令未成功設定地址範圍,或是執行 MWAIT 之前,未執行 MONITOR 指令,則處理器將不會進入優化狀態。此時將從跟在 MWAIT 後面的指令處恢復執行。
MWAIT 指令可以在任何特權級別執行。MONITOR CPUID 功能標誌(在 EAX=1 的情況下執行 CPUID 時,是 ECX 的位 3)指示處理器是否支援此指令。操作系統或系統 BIOS 可以通過 IA32_MISC_ENABLES MSR 禁用此指令;禁用此指令會清除 CPUID 功能標誌,並導致執行 MWAIT 指令時產生非法操作碼異常
// MWAIT takes the argument inEAX as a hint extension and is
// architected to take the argument in ECX as an instruction extension
// MWAIT EAX, ECX
{ WHILE (! ("monitor_event_pending_flag" OR "monitor_not_active")) {
implementation_dependent_optimized_state(EAX, ECX);
}
Clear monitor_event_pending_flag;
}
Trigger = 0;
If ( !trigger) {
EAX = &trigger
ECX = 0
EDX = 0
MONITOR EAX, ECX, EDX
If ( !trigger ) {
EAX = 0
ECX = 0
MWAIT EAX, ECX
}
}
上述程式碼序列確保在第一次檢查觸發器與執行監視器指令之間,不會進行觸發儲存。如果沒有第二次檢查,觸發儲存將暗中進行。MONITOR 與 MWAIT 的典型用法是上述循環中的程式碼序列。