調試程序瞭解兩種不同的表達式形式: MASM 運算式 和 C++運算式。
Microsoft巨集組合器 (MASM) 表達式會用於本說明檔中的範例中,除非另有註明。 在MASM運算式中,所有符號都會視為位址。
C++運算式與實際C++程序代碼中使用的運算式相同。 在這些表達式中,符號會理解為適當的數據類型。
每種語法的使用時機
您可以使用下列其中一種方式選取預設運算式評估工具:
在調試程序啟動之前,請使用_NT_EXPR_EVAL 環境變數 。
啟動調試程式時,請使用 -ee {masm|c++} 命令行選項 。
使用 .expr (選擇表示式評估工具) 命令,在執行調試程式之後顯示或變更表達式評估工具。
如果您未使用上述其中一種方法,調試程式會使用MASM表達式評估工具。
如果您要評估表示式而不變更除錯程式狀態,您可以使用 ?(評估表達式) 命令。
所有命令和偵錯資訊視窗都會透過預設表達式評估工具解譯其自變數,但有下列例外狀況:
??(評估C++表達式)命令一律使用C++運算式評估工具。
[監看式] 視窗一律會使用 C++ 運算式評估器。
[局部變數視窗] 總是使用 C++ 運算式評估器。
某些延伸模組命令一律使用MASM表達式評估工具(而其他擴充命令只接受數值自變數,而不是完整表達式)。
如果表達式的任何部分都以括弧括住,而且您會在表達式之前插入兩個符號 (@@) ,則表示式會由通常不會用於此案例的表達式評估工具進行評估。
兩個符號 (@@) 可讓您針對單一命令的不同參數使用兩個不同的評估工具。 它也可讓您使用不同的方法評估長表達式的不同片段。 您可以在符號上巢狀兩者。 每次出現兩個 @ 符號時,都會切換至另一個評估器。
警告 C++表達式語法適用於作結構和變數,但不適合作為調試程式命令參數的剖析器。 當您針對一般用途使用調試程式命令,或使用調試程式擴充功能時,您應該將MASM運算式語法設定為預設表達式評估工具。 如果您必須要用到特定參數,請使用 C++ 表示式語法中的兩個 at 符號 (@@) 表示法。
如需兩種不同表達式類型的詳細資訊,請參閱 數值表達式語法。
表達式中的數位
MASM 運算式中的數字會根據目前的基數來解釋。 n (設定數位基底) 命令可用來將預設基數設定為 16、10 或 8。 所有未前置數字都會在此基底中解譯。 您可以透過指定 0x 前置詞(十六進位)、0n 前置詞(十進位)、0t 前置詞(八進位),或 0y 前置詞(二進位)來覆寫預設的基數。
除非您以不同的方式指定,否則C++運算式中的數位會解譯為十進位數。 若要指定十六進位整數,請在數位前面加上 0x 。 若要指定八進位整數,請在數位前面加上 0 (零)。 (不過,在調試程序的 輸出中,有時會使用 0n 小數點前置詞。
如果您想要同時在數個基底中顯示數位,請使用 .formats (Show Number Formats) 命令。
表達式中的符號
這兩種類型的表達式會以不同的方式解譯符號:
在MASM運算式中,每個符號都會解譯為位址。 根據符號所參考的內容,此位址是全域變數、局部變數、函式、區段、模組或任何其他已辨識卷標的位址。
在C++表達式中,每個符號都會根據其類型來解譯。 視符號所參考的內容而定,它可能會解譯為整數、數據結構、函式指標或任何其他數據類型。 未對應至C++數據類型的符號(例如未修改的模組名稱)會建立語法錯誤。
如果符號可能模棱兩可,請在它前面加上模組名稱和驚歎號 (! )。 如果符號名稱可以解譯為十六進位數位,請在其前面加上模組名稱和驚歎號 ( ! ) 或只有驚歎號。 若要指定符號是本機符號,請省略模塊名稱,並在符號名稱前面包含貨幣符號和驚嘆號 ( $! )。 如需解譯符號的詳細資訊,請參閱 符號語法和符號比對。
表達式中的運算子
每個表達式類型都會使用不同的運算元集合。
如需您可以在MASM表達式及其優先順序規則中使用的運算符詳細資訊,請參閱 MASM數位和運算元。
如需您可以在C++表達式及其優先順序規則中使用的運算符詳細資訊,請參閱 C++數位和運算符。
請記住,MASM 作業一律是以位元組為基礎,C++作業遵循C++類型規則(包括指標算術的縮放)。
如需不同語法的一些範例,請參閱 混合表達式範例。