在汇编中,如何处理返回值记录为小于本机寄存器宽度的 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://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160

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

相关内容

最新更新