多年來,ntohs(32 位版本)的回傳值為零擴展到高 16 位(字)。但是,在最近更新 Windows 10 之后,它有時會在高位字中回傳垃圾。
例如,將引數 0xF00D 傳遞給
call ntohs
回傳值是
- EAX = 00F00DF0(32 位代碼)
- RAX = 0000000000000DF0(64 位代碼)
MASM 代碼中的修復是使用movzx(與 MSVC 相同)對回傳暫存器進行零擴展
call ntohs
movzx eax, ax
題
任何回傳值記錄為小于本機暫存器寬度的 Windows API 是否正確,不能保證高位被清零,即 RAX = 0000000000000DF0(64 位)中的回傳值很可能是巧合?
uj5u.com熱心網友回復:
至少對于 x64,高位是未定義的,如果需要,呼叫者負責進行零或符號擴展。如果你的代碼依賴于高位為零,恐怕它一直都是錯誤的,直到現在你只是很幸運。
https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160
RAX 或 XMM0 中回傳值中未使用位的狀態未定義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/313724.html
上一篇:符號表中的值是什么?
