首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >研究一种简单的代码反汇编输出和内存映射

研究一种简单的代码反汇编输出和内存映射
EN

Stack Overflow用户
提问于 2014-10-04 15:39:52
回答 4查看 182关注 0票数 3

有人能向我解释一下下面发生了什么吗?问题:

  • 为什么不变量我留在一个登记簿里?
  • 为什么寄存器rbp包含内存缓存行的地址,而不包含I的地址(即4个字节)?
  • 这是什么意思?movl $0x5,-0x4(%rbp)%negative 0x4是什么意思?

代码语言:javascript
运行
复制
int main(int argc, char* argv[])
{
    int i = 5;  // line 25
    i ++;       // line 26
}
-----------------------------------------------------

Disassembly:
25                  int i = 5;
00000000004014f4:   movl $0x5,-0x4(%rbp)
26                  i ++;
00000000004014fb:   addl $0x1,-0x4(%rbp)
-----------------------------------------------------

Register Values:
rbp: 0x23fe60
-----------------------------------------------------

Memory map at line 25:
Address  |   0-3  |   4-7  |   8-B  |   C-F  |
0x23fe60 |00000000|00000000|00000000|05000000|

Memory map at line 26:
Address  |   0-3  |   4-7  |   8-B  |   C-F  |
0x23fe60 |00000000|00000000|00000000|06000000|

注意:上面的内容是由Eclipse生成的,我正在使用64位机器上的mingw进行编译。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-04 15:52:06

  • 为什么不变量我留在一个登记簿里?

因为你的编译器不喜欢。它决定将变量i放在堆栈上。

  • 为什么寄存器rbp包含内存缓存行的地址,而不包含I的地址(即4个字节)?

rbp不包含内存缓存的地址。rbp是指向堆栈底部的基本指针-0x4(%rbp)是变量i在内存中的位置(在堆栈上)。意思是rbp减去4,为什么是4?因为i需要4个字节。这就是i的地址。

请参阅Stack

  • 这是什么意思?movl $0x5,-0x4(%rbp)__;%negative 0x4是什么意思?

有两个公共程序集语法。

  1. AT&T,这是一个不可读的混乱
  2. “常规”Intel语法

不幸的是,您的代码在AT&T中。%是AT&T语法中引用变量的方式。-0x4是数字-4的十六进制表示(见上面的答案)。

请参阅language#Syntax

票数 3
EN

Stack Overflow用户

发布于 2014-10-04 15:48:10

  • 没有所谓的“缓存地址”--缓存是从程序中抽象出来的,只有CPU和OS知道缓存以及如何将内存地址转换为“缓存地址”。
  • 变量i被分配到堆栈上。rbp是框架的“基本指针”,它指向正在堆栈上执行的当前函数的框架。因此,-0x4(%rbp)意味着在偏移量4(向后返回到那个点)到寄存器rbp中,变量i位于。在这里了解更多关于堆栈工作方式及其框架的内容:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html
  • movl $0x5,-0x4(%rbp)是有效的,而且您是正确的,从Intel语法世界来看,这似乎很奇怪。但实际上,这是AT&T语法代码的一个例子。请阅读此处以获得更多解释:language#Syntax

我真的认为你会从阅读这篇文章中获益:http://lwn.net/Articles/250967,当我思考关于记忆的“大图”时,它真的帮了我很多忙。

票数 2
EN

Stack Overflow用户

发布于 2014-10-04 15:48:34

  • 你是说“不在登记簿上”吗?因为您的程序不是用高优化设置编译的(但是如果您使用高优化值编译,则整个过程将是空的,因为它不会“做任何事情”(没有副作用)。当CPU执行这些指令时,包含变量的地址肯定会被带到内存缓存中。

代码语言:javascript
运行
复制
- register rbp contains the base of the stack frame of the function, it's where local automatic variables are allocated from, this is specified by the calling convention of your language.
- in this case the mov instruction is a move of an immediate value to the memory location.  The % prefaces a register name.  Since stacks grow downwards traditionally the offset of the local automatic variable is a negative offset from the base of the frame/stack.

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

https://stackoverflow.com/questions/26194365

复制
相关文章

相似问题

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