我有一个简单的函数,它只返回一个布尔值(现在设置为返回 true)。我正在尝试编写一个汇编函数来调用它,并根据返回值跳转。
可悲的是,我的函数返回 0xCCCCCC01 而不是预期的 0x01。这是stdcall的一些隐藏功能吗?
我有一个简单的函数,它只返回一个布尔值(现在设置为返回 true)。我正在尝试编写一个汇编函数来调用它,并根据返回值跳转。
可悲的是,我的函数返回 0xCCCCCC01 而不是预期的 0x01。这是stdcall的一些隐藏功能吗?
在_stdcall
中,返回值被传入EAX
。
但是,如果您从函数返回布尔值,而您的布尔值只有一个字节 [*],则不能用于CMP EAX,...
比较返回值!
幸运的是,您可以解决最低的EAX
through AL
(它不是单独的寄存器,而是 的一部分EAX
):
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
----------------EAX----------------
--------AX-------
---AH--- ---AL---
[*] 这是通常的约定,因为它是通过字节指针正确寻址布尔值所需的最小量。但是,如果您想出自己的语言,则可以自由要求布尔大小必须与机器寄存器大小匹配。
函数是用什么语言编写的?在该语言中,布尔值可能是一个字节长。值得注意的是,在 Apple 的 Objective C 方言中,BOOLtypedef
以char
.
如果是这种情况,您的返回值是 AL,而不是 EAX。
你真的应该用平台/编译器/操作系统/语言来标记这个问题。