符號延伸模組
當 32 位帶正負號的整數為負數時,其最高位等於一。 當這個 32 位帶正負號的整數轉換成 64 位數位時,高位可以設定為零, (保留數位的不帶正負號整數和十六進位值) 或高位可以設定為一個 (保留數位的帶正負號值) 。 後者的情況稱為 符號延伸模組。
偵錯工具會遵循 MASM 運算式、C++ 運算式中以及顯示數位時之登入延伸模組的不同規則。
MASM 運算式中的登入延伸模組
在某些情況下,MASM 運算式評估工具會自動 簽署 數位。 符號延伸只能影響從0x80000000到0xFFFFFFFF的數位。 也就是說,符號延伸只會影響以 32 位寫入且高位等於 1 的數位。
當偵錯工具將其視為 64 位數位時,0x12345678一律會保持0x00000000 12345678。 另一方面,當0x890ABCDE視為 64 位值時,它可能會維持0x00000000'890ABCDE,或 MASM 運算式評估工具可能會將其簽署為 0xFFFFFFFF'890ABCDE。
從 0x80000000 到 0xFFFFFFFF 的數位會根據下列準則來擴充:
數值常數永遠不會在使用者模式中簽署擴充。 在核心模式中,除非數值常數包含低位元組之前的 ( ) ` 音符號,否則會延伸數位常數。 例如,在核心模式中, EEAA1122 和 00000000EEAA1122 的十六進位數位會擴充,但 000000000'EEAA1122 和 0'EEAA1122 則不是。
32 位暫存器會在這兩種模式中擴充。
虛擬暫存器一律會儲存為 64 位值。 在評估時,它們不會進行擴充。 指派虛擬暫存器值時,會根據標準 C++ 準則來評估所使用的運算式。
運算式中的個別數位和暫存器可以進行符號擴充,但在運算式評估期間沒有其他計算是符號延伸。 因此,您可以使用下列語法來遮罩數位的高位或暫存器。
( 0x0`FFFFFFFF & expression )
C++ 運算式中的登入延伸模組
當偵錯工具評估 C++ 運算式時,適用下列規則:
暫存器和虛擬暫存器永遠不會延伸簽署。
所有其他值會被視為與 C++ 會處理其類型的值完全相同。
顯示 Sign-Extended 和 64 位數位
除了 32 位和 16 位暫存器之外,所有數位都會以 64 位值的形式儲存在偵錯工具內部。 不過,當數位符合特定準則時,偵錯工具會在命令輸出中將其顯示為 32 位數位。
偵錯工具會使用下列準則來決定如何顯示數位:
如果數位的高 32 位都是零 (,則如果數位是從 0x00000000'00000000 到 0x00000000'FFFFFFFF) ,偵錯工具就會將數字顯示為 32 位數位。
如果數位的高 32 位都是數位,而且低 32 位的最高位也是一個 (,也就是說,如果數位是從 0xFFFFFFFF'80000000 到 0xFFFFFFFF'FFFFFFFF) ,偵錯工具會假設數位是帶正負號的 32 位數位,並將其顯示為 32 位數位。
如果上述兩個條件不適用於 (,則如果數位是從 0x00000001'00000000 到 0xFFFFFFFF'7FFFFFFF) 偵錯工具會將數字顯示為 64 位數位。
由於這些顯示規則,當數字顯示為從 0x80000000 到 0xFFFFFFFF 的 32 位數位時,您無法確認高 32 位都是一個或全部零。 若要區分這兩種情況,您必須對數位執行額外的計算 (,例如遮罩一或多個高位,並顯示結果) 。