0

我有一个简单的函数,它只返回一个布尔值(现在设置为返回 true)。我正在尝试编写一个汇编函数来调用它,并根据返回值跳转。

可悲的是,我的函数返回 0xCCCCCC01 而不是预期的 0x01。这是stdcall的一些隐藏功能吗?

4

2 回答 2

5

_stdcall中,返回值被传入EAX

但是,如果您从函数返回布尔值,而您的布尔值只有一个字节 [*],则不能用于CMP EAX,...比较返回值!

幸运的是,您可以解决最低的EAXthrough AL(它不是单独的寄存器,而是 的一部分EAX):

xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
----------------EAX----------------
                  --------AX-------
                  ---AH--- ---AL---

[*] 这是通常的约定,因为它是通过字节指针正确寻址布尔值所需的最小量。但是,如果您想出自己的语言,则可以自由要求布尔大小必须与机器寄存器大小匹配。

于 2013-09-30T19:40:02.480 回答
1

函数是用什么语言编写的?在该语言中,布尔值可能是一个字节长。值得注意的是,在 Apple 的 Objective C 方言中,BOOLtypedefchar.

如果是这种情况,您的返回值是 AL,而不是 EAX。

你真的应该用平台/编译器/操作系统/语言来标记这个问题。

于 2013-09-30T19:48:39.417 回答