Assembly _stdcall函数返回0xCC01
我有一个简单的函数,它只返回一个布尔值(现在设置为返回true)。我试图编写一个调用它的汇编函数,并根据返回值跳转Assembly _stdcall函数返回0xCC01,assembly,Assembly,我有一个简单的函数,它只返回一个布尔值(现在设置为返回true)。我试图编写一个调用它的汇编函数,并根据返回值跳转 遗憾的是,我的函数返回的是0xCC01,而不是预期的0x01。这是stdcall的某些隐藏功能吗?在\u stdcall中,返回值传递到EAX 但是,如果从函数返回布尔值,并且布尔值只有一个字节[*],则不能使用CMP EAX,…来比较返回值 幸运的是,您可以通过AL(它不是一个单独的寄存器,而是EAX的一部分)处理EAX中最低的一个: [*]这是通常的约定,因为这是通过字节指针
遗憾的是,我的函数返回的是0xCC01,而不是预期的0x01。这是stdcall的某些隐藏功能吗?在
\u stdcall
中,返回值传递到EAX
但是,如果从函数返回布尔值,并且布尔值只有一个字节[*],则不能使用CMP EAX,…
来比较返回值
幸运的是,您可以通过AL
(它不是一个单独的寄存器,而是EAX
的一部分)处理EAX
中最低的一个:
[*]这是通常的约定,因为这是通过字节指针正确处理布尔值所需的最小数量。但是,如果您使用自己的语言,您可以自由地要求布尔值大小必须与机器寄存器大小匹配。在
\u stdcall
中,返回值传递到EAX
但是,如果从函数返回布尔值,并且布尔值只有一个字节[*],则不能使用CMP EAX,…
来比较返回值
幸运的是,您可以通过AL
(它不是一个单独的寄存器,而是EAX
的一部分)处理EAX
中最低的一个:
[*]这是通常的约定,因为这是通过字节指针正确处理布尔值所需的最小数量。但是,如果您使用自己的语言,您可以自由要求布尔值大小必须与机器寄存器大小匹配。函数是用什么语言编写的?在那种语言中,布尔值可能只有一个字节长。在苹果的Objective C方言中,BOOL是
typedef
作为char
输入的
如果是这种情况,那么返回值是AL,而不是EAX
你真的应该用平台/编译器/操作系统/语言来标记这个问题。函数是用什么语言编写的?在那种语言中,布尔值可能只有一个字节长。在苹果的Objective C方言中,BOOL是
typedef
作为char
输入的
如果是这种情况,那么返回值是AL,而不是EAX
您应该用平台/编译器/操作系统/语言来标记问题。显示您的函数,以及如何读取其返回值。(我肯定你已经意识到0x01是你得到的值的LSB,CCCC…是VS设置未初始化内存的地方,据我所知,所以我很确定你只是看错了。)有时候最简单的方法是作弊:用C编写函数,或者让编译器生成汇编输出,或者反汇编结果。我实际上只是查看了为函数生成的代码。结果是布尔值存储在AL中,而不是EAX中。这解释了为什么低位设置正确。显示您的函数,以及如何读取其返回值。(我肯定你已经意识到0x01是你得到的值的LSB,CCCC…是VS设置未初始化内存的地方,据我所知,所以我很确定你只是看错了。)有时候最简单的方法是作弊:用C编写函数,或者让编译器生成汇编输出,或者反汇编结果。我实际上只是查看了为函数生成的代码。结果是布尔值存储在AL中,而不是EAX中。这就解释了为什么低位设置正确。
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
----------------EAX----------------
--------AX-------
---AH--- ---AL---