我有一个简单的函数,只返回一个布尔值(现在设置为返回true)。我试图编写一个将调用它的汇编函数,并根据返回值跳转。
遗憾的是,我的函数返回0xCCCCCC01而不是预期的0x01。这是stdcall的隐藏功能吗?
答案 0 :(得分:5)
在_stdcall
中,返回值在EAX
中传递。
但是,如果你从一个函数返回一个布尔值,并且你的布尔值只有一个字节[*],你就不能用CMP EAX,...
来比较返回值!
幸运的是,您可以解决EAX
到AL
中的最低位置(它不是一个单独的寄存器,而是EAX
的一部分):
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
----------------EAX----------------
--------AX-------
---AH--- ---AL---
[*]这是通常的惯例,因为它是您通过字节指针正确处理布尔值所需的最小量。如果你想出了自己的语言,你可以自由地要求布尔大小必须与机器寄存器大小匹配。
答案 1 :(得分:1)
写入的函数是什么语言?也许boolean在那种语言中是一个字节长。在Apple的Objective C方言中,值得注意的是,BOOL typedef
以char
的形式投放。
如果是这种情况,则返回值为AL,而不是EAX。
您应该使用平台/编译器/ OS /语言标记问题。