Assembly 检查组件中的堆栈

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 是否会移动下一个(不是当前)堆栈

我正在内联汇编中推送一些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 
是否会移动下一个(不是当前)堆栈元素?我只是在猜测。 我需要这段代码在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字节的值?