Assembly 检查组件中的堆栈
我正在内联汇编中推送一些int值:Assembly 检查组件中的堆栈,assembly,stack,inspect,Assembly,Stack,Inspect,我正在内联汇编中推送一些int值: _asm { mov eax,i3 push eax mov eax,ii } 稍后,我通过执行以下操作检索此值: _asm { pop eax mov ii,eax pop eax mov i3,eax } 我想在不做pop的情况下输入堆栈。我需要重新排列或倒回一些值。完成后,我可以恢复堆栈 我对asm很生疏。是否有类似于: mov ii,esp+4 是否会移动下一个(不是当前)堆栈
_asm
{
mov eax,i3
push eax
mov eax,ii
}
稍后,我通过执行以下操作检索此值:
_asm
{
pop eax
mov ii,eax
pop eax
mov i3,eax
}
我想在不做pop的情况下输入堆栈。我需要重新排列或倒回一些值。完成后,我可以恢复堆栈
我对asm很生疏。是否有类似于:
mov ii,esp+4
是否会移动下一个(不是当前)堆栈元素?我只是在猜测。
我需要这段代码在32位win和64位win环境中运行
我想在不做pop的情况下输入堆栈。我需要重新排列或倒回一些值
这就是堆栈分配的变量在函数中的作用-因此函数序言后面通常跟着子esp,x
,其中x
是要分配的空间量
因此,C(和C++中)中的变量访问是检查堆栈。或者,如果您知道编译器是如何分配变量的,您可以从内联ASM中读取它们
实现您尝试的一种方法可能是将输入变量和输出变量列为内联asm的操作数。本文对此进行了很好的解释。这样,不管编译器如何在编码更改和优化标志之间重新排序堆栈,汇编程序仍然可以工作
或者,如果您自己编写整个函数,您可以在给定地址加载堆栈值,如下所示:
mov eax, DWORD PTR [ebp-8]
这将加载
eax
,内存地址的值位于ebp-8
使用调试器的内存视图窗口。但最重要的是,不要这样写代码。改用局部变量,它也在堆栈上。调试器可以显示值。当我在堆栈上推送某些内容时。在我的示例中,我使用“push eax”。一个4字节的值被添加到堆栈中。大多数系统上的大小都相同。例如,在使用win64时,“push eax”是否会在堆栈上添加8字节的值?