首页 > 解决方案 > 在汇编中,如何处理具有记录为小于本机寄存器宽度的返回值的 Windows API?

问题描述

多年来,ntohs(32 位版本)的返回值为零,扩展到高 16 位(字)。但是,在最近更新 Windows 10 后,它有时会在大写单词中返回垃圾。

例如,将参数 0xF00D 传递给

call        ntohs

返回值为

MASM 代码中的修复是使用movzx对返回寄存器进行零扩展(与 MSVC 相同)

call        ntohs
movzx       eax, ax

问题

任何具有记录为小于本机寄存器宽度的返回值的 Windows API 是否正确,不能保证高位被清零,即 RAX = 0000000000000DF0(64 位)中的返回值很可能是巧合?

标签: windowsassemblyx86x86-64calling-convention

解决方案


至少对于 x64,高位是未定义的,调用者负责在需要时进行零或符号扩展。如果您的代码依赖于高位为零,那么恐怕它一直都是错误的,而您直到现在才幸运。

https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160

RAX 或 XMM0 返回的值中未使用位的状态未定义。


推荐阅读