我是 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
节)。