我在内联汇编中推送一些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环境中运行。
答案 0 :(得分:0)
我想在没有弹出的情况下看到我的筹码。我需要重新排列或重新编写一些值。
这就是堆栈分配变量在函数中的作用 - 因此函数序言通常后跟sub esp, x
,其中x
是要分配的空间量。
因此,C(和C ++)中的变量访问检查堆栈。或者,如果您知道编译器如何分配变量,则可以从内联ASM中读取它们。
实现您要做的事情的一种方法可能是将输入变量和输出变量列为内联asm的操作数。这篇osdev文章很好地解释了这一点。这样,无论编译器如何在编码更改和优化标志之间重新排序堆栈,您的汇编器仍然可以工作。
或者,如果你自己编写整个函数,你可以在给定的地址加载堆栈的值,如下所示:
mov eax, DWORD PTR [ebp-8]
这将加载eax
,其内存地址的值位于ebp-8
。