0

我正在对一个 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

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

任何帮助将不胜感激,因为我长期以来一直被困在这个问题上。

4

1 回答 1

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]

于 2013-10-16T06:05:53.253 回答