windows - 在汇编中,如何处理具有记录为小于本机寄存器宽度的返回值的 Windows API?
问题描述
多年来,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 位)中的返回值很可能是巧合?
解决方案
至少对于 x64,高位是未定义的,调用者负责在需要时进行零或符号扩展。如果您的代码依赖于高位为零,那么恐怕它一直都是错误的,而您直到现在才幸运。
https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160
RAX 或 XMM0 返回的值中未使用位的状态未定义。
推荐阅读
- github - 意外的 github 动作触发器
- progressive-web-apps - 渐进式网络应用程序会在 Amazon Fire 7 上运行吗?
- ansible - Ansible 将保管库密码文件传递给 playbook
- python - (熊猫)当我同时使用 loc 和列名时,我无法赋值
- python - 我的背景在pygame中消失后如何保持相同的背景颜色?
- dictionary - 在 Cython 中返回字典的函数的声明
- r - 有条件地用 NA 替换列
- python - 如何使用 selenium 3 和 firefox 创建 lambda 层?
- vue.js - 如何将我的表单中的照片上传到我的 Vuex 商店?
- mysql - 在 laravel 中将多个表与一张表连接起来