gpt4 book ai didi

c++ - 用gdb调试的时候,汇编代码前面的调试信息是什么意思?

转载 作者:行者123 更新时间:2023-12-03 10:04:34 25 4
gpt4 key购买 nike

用gdb调试c代码时,显示的汇编代码是

0x000000000040116c main+0 push %rbp
0x000000000040116d main+1 mov %rsp,%rbp
!0x0000000000401170 main+4 movl $0x0,-0x4(%rbp)
0x0000000000401177 main+11 jmp 0x40118d <main+33>
0x0000000000401179 main+13 mov -0x4(%rbp),%eax
0x000000000040117c main+16 mov %eax,%edx
0x000000000040117e main+18 mov -0x4(%rbp),%eax
第一条汇编指令前面的0x000000000040116d是这个函数的虚拟地址吗? main+1 是这个程序集与 main 函数的偏移量吗?下一个程序集是 main+4。是否意味着第一个 mov %rsp,%rbp字节?如果是,为什么是 movl $0x0,-0x4(%rbp) 7 字节?
我正在使用服务器。版本为: Linux version 4.15.0-122-generic (buildd@lcy01-amd64-010) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)) #124~16.04.1-Ubuntu SMP.

最佳答案

几乎是的。很明显,例如,将 4 添加到第一个地址会为您提供显示为 main+4 的地址。 ,并在其上再添加 7 为您提供 main+11 的相应地址。 .
就两个移动指令而言:它们非常不同,并且做完全不同的事情。它们是两种截然不同的移动,这就是 x86 机器语言中每个移动需要多少字节,因此一个移动比另一个占用更多字节也就不足为奇了。至于确切原因为什么嗯,总的来说,这开启了一场关于 x86 机器语言指令集的根本原因和最初设计目标的非常长、广泛和激烈的讨论。其中大部分实际上不再适用(实际上您可能会觉得很无聊),因为现代 x86 CPU 与其原始一代完全不同。但它必须保持二进制兼容。因此,很少有这样的怪事。
只是为了让您有一个基本的了解:第一步是在两个 CPU 寄存器之间移动。不需要长篇小说来指定从哪里到哪里。第二个 Action 必须指定一个 32 位值(准确地说是 0)、一个 CPU 寄存器和一个内存偏移量。这必须在某处指定。你必须在某处找到字节来指定所有的小细节。

关于c++ - 用gdb调试的时候,汇编代码前面的调试信息是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65136653/

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