gpt4 book ai didi

c++ - 研究简单的代码反汇编输出和内存映射

转载 作者:太空狗 更新时间:2023-10-29 20:12:42 24 4
gpt4 key购买 nike

有人可以向我解释下面发生的事情吗?问题:

  • 为什么变量 i 不保留在寄存器中?
  • 为什么寄存器 rbp 包含内存缓存行的地址而不是 i 的地址(即 4 个字节)?
  • 这是什么意思? movl $0x5,-0x4(%rbp); %negative 0x4 是什么意思?

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编译的。

最佳答案

  • 为什么变量 i 不保留在寄存器中?

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

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

rbp 不包含内存缓存的地址rbpBase Pointer,指向栈底。 -0x4(%rbp) 是变量i 在内存中(在栈上)的位置。这意味着 rbp 的值减去 4。为什么是4?因为 i 占用 4 个字节。所以它 i 的地址。

参见 http://en.wikibooks.org/wiki/X86_Disassembly/The_Stack

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

有2种常见的汇编语法

  1. AT&T,一团乱七八糟的东西
  2. “常规”英特尔语法

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

参见 http://en.wikipedia.org/wiki/X86_assembly_language#Syntax

关于c++ - 研究简单的代码反汇编输出和内存映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26194365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com