【问题标题】:C/C++ return from x86 code从 x86 代码返回的 C/C++
【发布时间】:2012-11-06 21:21:57
【问题描述】:

我目前正在研究在 C/C++ 中使用一些 ASM

我有以下

__declspec(naked) unsigned long 
someFunction( unsigned long inputDWord )
{
    __asm
    {
    }
}

如何在 asm 中返回 unsigned long?

我需要将一些东西压入堆栈然后调用 ret 吗? 很久没用过Asm了,以前也没有接触过C++。

谢谢!

【问题讨论】:

  • 这个问题的答案实际上取决于您正在开发的架构。
  • 您是否有理由要自己处理函数调用?你不能在函数内部有本地程序集吗?或者更好的是,使用编译器内在函数而不是汇编?
  • 获得适当架构和 ABI 答案的最简单方法是编译一个常规函数,然后查看生成的 asm。

标签: c++ assembly return


【解决方案1】:

编辑:感谢@Matteo Italia,我更正了ret 的用法。

将 retval 放入eax 寄存器,这是根据__cdecl__stdcall 的约定。

然后,根据调用约定,您应该使用ret 指令的适当变体:

  • __cdecl 约定(或类似约定)的情况下 - 使用ret。在机器级别,这意味着pop-ing 从堆栈返回地址和jmp 到它。调用者负责从堆栈中移除所有函数参数。
  • __stdcall 约定(或类似约定)的情况下 - 使用ret X,而X 是所有函数参数的大小。

【讨论】:

  • "而 X 是所有参数的大小" - 仅当它是 __stdcall 时,在 __cdecl(通常是默认值)中,清理由调用者决定,所以很简单 ret (除非我忘记了关于 naked 的一些事情)。
  • @Matteo Italia:哦,你是 100% 正确的。抱歉,我刚刚忘记了这个。我会修复我的帖子。
猜你喜欢
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 2015-02-03
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
相关资源
最近更新 更多