用C ++替换内联汇编代码

时间:2013-10-16 05:58:10

标签: visual-c++ inline-assembly

我正在进行C ++项目的32-64位迁移,其中包含一些64位平台不支持的汇编代码。我想提供一个关于我必须迁移的项目的基本信息。

  • 项目的输出是另一个C ++项目使用的lib文件

  • 以下是包含汇编代码的上下文:

    int* a = Begin_args;
    int* b = End_args; (where Begin_args and End_args are int*)
    while (b > a)
    {
       int test = *(--b);
       __asm push test
    }
    
  • 所以基本上我必须替换语句__asm push test

我面临的问题是:

  • 我无法找到相同推送语句的pop语句

  • 我无法调试项目,因为项目的输出是一个lib文件。

  • 我尝试使用堆栈,数组,队列,但没有成功。它不会抛出任何编译错误,但在启动应用程序时,它会崩溃。

所以我的问题是:

  • 我可以调试输出为lib文件的任何C ++项目吗?

  • 我也在其他论坛上问了这个问题,有人告诉我试试va_list但是我无法理解va_list将如何工作而不是__asm push test?< / p>

  • 最后,如何用C ++替换这个Asm代码/如何替换这个Asm代码?

任何帮助都会非常感激,因为我长期坚持这个问题。

1 个答案:

答案 0 :(得分:0)

请注意,可能是等效的pop语句,因为它取决于调用约定。

例如,如果x86调用约定之一,sp是在函数期间移动的堆栈指针,bp是前一个sp(来自下一个更高的堆栈帧)。

这意味着函数的epilog代码可以是:

mov  sp, bp  ; just set sp to previous sp
pop  bp      ; pop previous sp
ret          ; and return

并且你在函数中使用sp做了什么并不重要。例如:

func:              ; here, the stack has return address
      push bp      ; push current bp
      mov bp, sp   ; put sp into bp

      sub  sp, 50  ; do whatever you want with sp here

      mov  sp, bp  ; just set sp to previous sp
      pop  bp      ; pop previous sp
      ret          ; and return

上面代码中的sub指令通常用于为函数的局部变量分配空间。函数的参数在调用之前被推送,因此可以使用[bp+N]访问,并且可以使用[bp-N]访问局部变量。