首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查装配中的堆栈

检查装配中的堆栈
EN

Stack Overflow用户
提问于 2012-10-21 21:54:37
回答 1查看 139关注 0票数 0

我在inline-assembly中推入了一些int值:

代码语言:javascript
复制
_asm
  {
  mov eax,i3  
  push eax
  mov eax,ii  
  }  

稍后,我通过pops检索这个值:

代码语言:javascript
复制
_asm
  {
  pop eax
  mov ii,eax  
  pop eax
  mov i3,eax  
  }  

我希望在不做弹出的情况下对我的堆栈进行预测。我需要重新排列或重写一些值。然后,我可以在完成后恢复堆栈。

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

代码语言:javascript
复制
mov ii,esp+4 

它将移动下一个(而不是当前)堆栈元素?我只是在猜测。我需要这个代码来运行在32位win和64位win环境。

EN

回答 1

Stack Overflow用户

发布于 2012-10-21 22:21:43

我想要在不做弹出的情况下预测我的堆栈。我需要重新排列或重写一些值。

这就是堆栈分配的变量在函数中的行为方式-因此函数前言通常后面跟着一个sub esp, x,其中x是要分配的空间量。

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

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

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

代码语言:javascript
复制
mov eax, DWORD PTR [ebp-8]

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12998436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档