c - 使用 x86 处理器检查内存

标签 c gdb

<分区>

我是 GDB 的新手,遇到了一些问题。我有 x86 处理器,这意味着我的处理器中的寄存器 eip 应该包含 4 字节内存。我编译了一些 C 代码并将断点设置为 main()。输入 x/x $eip 返回“0xd02404c7”(十六进制),据我所知这是机器语言的一些指令。所以我的问题是:如果这条机器指令是 4 字节的大小。这个命令“x/4x $eip”应该显示 16 字节,它向我展示了这个:

0x8048426 <main+9>: 0xd02404c7  0xe8080484  0xfffffebe  0x9066c3c9

所以我很困惑。如果这是 16 字节,那么当 32 位处理器中的 1 个寄存器应该只包含 4 字节时,为什么它告诉我它位于同一内存中?谢谢。

最佳答案

Typing x/x $eip gives me back "0xd02404c7"(hexadecimal) which as i know is some instruction to machine language.

不,它会在您的代码中为您提供原始 字节。这些原始字节可以“覆盖”少于一条、一条或几条机器指令。一条最短的 x86 指令只占用一个字节。最长指令takes 15 bytes .

So my questions is: if This machine instruction is the size of 4 byte.

地址是 4 个字节,但指令本身可能包含 1 到 15 个字节。如果你执行 (gdb) disas/r main

,你可以看到字节和指令之间的关系

So every memory address can store 4 machine instructions?

完全没有。每个内存地址对应1个字节的内存。该字节可能包含一个完整的(单字节)指令,或者它可以是多字节指令的开始,或者它根本不包含任何指令(如果地址指向例如 .data节)。

关于c - 使用 x86 处理器检查内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29576958/

相关文章:

c - 在 C 中显示字符串数组的完整值

c - 如何使用 gdb 查看宏扩展的每一行的逐步执行

linux - "wrong ELF class: ELFCLASS32",但仅在使用 GDB 时

c++ - 如何在 gdb 中为 pretty-print 调用构造函数

visual-studio - QNX gdb 与 VS 或 VSCode 集成

c - 为什么我的列表只返回最近添加的元素?

c - 在 C 中遍历列表时,我是否看到了优化错误?

c - 优化会改变强制转换的行为吗?

c - C 货币面额

ios - Xcode:错误:无法使用重复的目标启动。原始目标在 Xcode/gdb 中运行良好