-1

我需要将汇编代码转换为 C 代码,而这两行代码有问题:

 804842d:   c7 44 24 18 00 00 00    movl   $0x0,0x18(%esp)
 8048434:   00 
 8048435:   c7 44 24 1c 00 00 00    movl   $0x0,0x1c(%esp)
 804843c:   00 

这是给我的汇编代码。

所以在 CI 中创建了这部分的 main 函数:

 int main(){
   int x, y;
   x=0;
   y=0;
  }

但是当我将此代码转换为程序集时,我得到:

804842d:    c7 44 24 1c 08 00 00    movl   $0x0,0x1c(%esp)
8048434:    00 
8048435:    c7 44 24 18 07 00 00    movl   $0x0,0x18(%esp)
804843c:    00 

为什么我的程序集版本(0x1c(%esp) 和 0X18(%esp))中的两个地址被翻转了?有什么办法可以解决吗?

4

1 回答 1

4

我同意其他人的观点,这是一种令人怀疑的理智的努力。

但是,至少能够正确理解生成的汇编代码很有用。这里的主要问题是在 x86 上,堆栈向下增长。这意味着堆栈上更高的变量(假设没有优化并深入研究特定于实现的细节,稍后声明的变量)的地址低于之前声明的变量

考虑到这一点, y的地址是0x18(%esp)x的地址是有意义的0x1c(%esp)。为了让自己更清楚,请始终尝试用不同的值填充变量。

请注意,向下增长的堆栈似乎相当混乱,但在英特尔架构的早期,它是有道理的 - 代码和动态分配的数据被加载到尽可能低的地址,而堆栈基于地址空间的顶部. 这样,您不必在为堆栈保留多少内存以及为堆保留多少内存方面做出明确的妥协——只要两者的总和低于总地址空间大小,它们就可以很好地共享地址空间。

于 2012-09-30T12:01:20.433 回答