0

我正在内联汇编中推送一些 int 值:

_asm
  {
  mov eax,i3  
  push eax
  mov eax,ii  
  }  

后来我检索这个值做弹出:

_asm
  {
  pop eax
  mov ii,eax  
  pop eax
  mov i3,eax  
  }  

我想在不弹出的情况下检查我的堆栈。我需要重新排列或重新审视一些值。完成后我可以恢复堆栈。

我对asm很生疏。有没有类似的东西:

mov ii,esp+4 

那会移动下一个(不是当前的)堆栈元素吗?我只是猜测。我需要这段代码在 32 位 win 和 64 win 环境中运行。

4

1 回答 1

0

我想在不弹出的情况下检查我的堆栈。我需要重新排列或重新审视一些值。

这就是堆栈分配的变量在函数中的作用方式——因此函数序言通常后面跟着一个sub esp, xwherex是要分配的空间量。

因此,C(和 C++)中的变量访问是检查堆栈。或者,如果您知道编译器如何分配变量,您可以从您的内联 ASM 中读取它们。

实现您想要做的事情的一种方法可能是将输入变量和输出变量都列为内联汇编的操作数。这篇osdev文章很好地解释了它。这样,无论编译器如何在编码更改和优化标志之间重新排序堆栈,您的汇编器仍然可以工作。

或者,如果您自己编写整个函数,您可以将堆栈的值加载到给定地址,如下所示:

mov eax, DWORD PTR [ebp-8]

这将加载eax位于 的内存地址的值ebp-8

于 2012-10-21T14:21:43.463 回答