我在inline-assembly中推入了一些int值:
_asm
{
mov eax,i3
push eax
mov eax,ii
} 稍后,我通过pops检索这个值:
_asm
{
pop eax
mov ii,eax
pop eax
mov i3,eax
} 我希望在不做弹出的情况下对我的堆栈进行预测。我需要重新排列或重写一些值。然后,我可以在完成后恢复堆栈。
我对asm很生疏。有没有类似这样的东西:
mov ii,esp+4 它将移动下一个(而不是当前)堆栈元素?我只是在猜测。我需要这个代码来运行在32位win和64位win环境。
发布于 2012-10-21 22:21:43
我想要在不做弹出的情况下预测我的堆栈。我需要重新排列或重写一些值。
这就是堆栈分配的变量在函数中的行为方式-因此函数前言通常后面跟着一个sub esp, x,其中x是要分配的空间量。
因此,在C中(以及在C++中)变量访问就是检查堆栈。或者,如果您知道编译器是如何分配变量的,则可以从内联ASM中读取它们。
要实现您想要做的事情,一种方法可能是将您的输入变量和输出变量都作为操作数列出到内联asm。这篇osdev文章很好地解释了这一点。这样,无论编译器如何重新排序代码更改和优化标志之间的堆栈,您的汇编器仍然可以工作。
或者,如果您自己编写整个函数,则可以在给定地址加载堆栈的值,如下所示:
mov eax, DWORD PTR [ebp-8]这将使用位于ebp-8的内存地址值加载eax。
https://stackoverflow.com/questions/12998436
复制相似问题