我是GDB的新手并且遇到了一些问题。我有x86 proccesor,这意味着我的proccesor中的寄存器eip应包含4字节内存。我编译了一些c代码并将断点设置为main()。键入x / x $ eip给我回“0xd02404c7”(十六进制),据我所知,这是一些机器语言的指令。所以我的问题是:如果这台机器指令的大小为4字节。这个命令“x / 4x $ eip”应该显示16个字节,它显示了这个:
0x8048426 <main+9>: 0xd02404c7 0xe8080484 0xfffffebe 0x9066c3c9
所以我很困惑。如果这是16字节,那为什么当32位proccesor中的1个寄存器应该只包含4个字节时,它会显示它位于同一个存储器中?谢谢。
答案 0 :(得分:2)
键入x / x $ eip会给我回复&#34; 0xd02404c7&#34;(十六进制),据我所知,它是一些机器语言指令。
不,它会在代码中为您提供原始字节。这些原始字节可以覆盖&#34;少于一个,一个或几个机器指令。最短的x86指令只占用一个字节。最长的指令takes 15 bytes。
所以我的问题是:如果这台机器指令的大小为4字节。
地址是4个字节,但指令本身可能包含1到15个字节。如果执行(gdb) disas/r main
所以每个内存地址都可以存储4个机器指令吗?
完全没有。每个存储器地址对应1个字节的存储器。该字节可能包含整个(单字节)指令,或者它可以是多字节指令的开始,或者它根本不包含任何指令(如果地址指向例如.data
部分)。 / p>