assembly - 使用 GDB 从 4 字节寄存器读取超过 4 字节
问题描述
我有一个理解问题。例如,32 位 x86 芯片的寄存器长度为 4 字节。美好的。使用 gdb,我可以指定从目标寄存器读取 4 个字节。( x/4b $edx
)。
但是,如果我输入x/40b
这意味着“从 4 字节寄存器中给我 40 字节”。这让我很困惑。这怎么可能?
都是在第四个字节“垃圾”之后,还是来自内存/寄存器中的另一个区域?
解决方案
x
读取内存,而不是寄存器。
它从您使用的表达式(恰好包含一个寄存器值)中获取一个地址,并将其递增以从内存中读取您要求的尽可能多的字节。
这些字节都不是寄存器值。寄存器值仅出现在x
输出的地址列中。(然后仅当您碰巧使用的是单个寄存器的表达式,而不是$eax + $edi
, $edi + 16
, 或(char*)symbol + 12
)
如果您想要一个寄存器值,请使用p /x $eax
、 或info reg
、 或layout reg
。
推荐阅读
- django - Django REST Serializer 使用错误的模型进行序列化
- python - python文件写入程序运行时如何更新桌面上的文件大小
- javascript - 使用 d3.js 更新表数据
- c# - C#捕获从不在进程中的函数返回的异常?
- r - 如何设置仅在输入 3 时才显示集合向量的函数?
- javascript - 如果 URI 没有改变,例如在单页应用程序上,如何检测用户是否在新页面上?
- angular - Angular Kendo UI 全局访问
- php - 内连接循环通过
- git - 如何 git rebase 从另一个分支直接到 master 分支?
- javascript - 受控数字比例映射