我正在进行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代码?
任何帮助都会非常感激,因为我长期坚持这个问题。
答案 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]
访问局部变量。