使用 GDB 从 4 字节寄存器读取超过 4 个字节

doc*_*dev -3 x86 assembly gdb cpu-registers

我有一个理解的问题。例如,32 位 x86 芯片的寄存器长度为 4 字节。美好的。使用 gdb,我可以指定从目标寄存器读取 4 个字节。( x/4b $edx).

但是如果我输入x/40b这意味着“从 4 字节寄存器中给我 40 字节”。这让我很困惑。这怎么可能?

是在第四个字节“垃圾”之后,还是来自内存/寄存器中的另一个区域?

Pet*_*des 5

x 读取内存,而不是寄存器。

它从您使用的表达式中获取一个地址(恰好包含一个寄存器值),并将其递增以从内存中读取您要求的尽可能多的字节。

这些字节都不是寄存器。寄存器值仅出现在x输出的地址列中。(然后仅当您碰巧使用单个寄存器的表达式时,而不是$eax + $edi, $edi + 16, 或(char*)symbol + 12

如果需要寄存器,请使用p /x $eax, or info reg, or layout reg