用表达式表示特定地址
Represent a specific address with an expression
我正在使用 gdb,我正在尝试获取由 [es:edi](或 es:[edi])表示的地址。我该怎么做?指令是:
rep movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
好在主流的OS都是flat内存模型,所以DS和ES的base都是0
。您想要的“地址”只是完整 seg:off 地址的偏移部分。
在复制之前从源头检查内存,x $esi
。
在具有 non-zero DS 或 ES 基础的自定义 protected-mode 内核中(您正在通过 QEMU 调试?),您必须手动找出段基础。 x86 没有简单的方法来查询它;体系结构状态的那部分不可读,只能写(当您使用选择器编写段寄存器时从 GDT 或 LDT 加载)。有些人称内部段 base/limit 寄存器为“缓存”,但事实并非如此。即使您更改了 GDT 条目,它们也保证会保持其值,直到您手动 mov ds, eax
或其他方式。
GDB 根本不知道分段,如果您想使用分段内存模型调试代码,请使用 BOCHS 的 built-in 调试器。
我正在使用 gdb,我正在尝试获取由 [es:edi](或 es:[edi])表示的地址。我该怎么做?指令是:
rep movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
好在主流的OS都是flat内存模型,所以DS和ES的base都是0
。您想要的“地址”只是完整 seg:off 地址的偏移部分。
在复制之前从源头检查内存,x $esi
。
在具有 non-zero DS 或 ES 基础的自定义 protected-mode 内核中(您正在通过 QEMU 调试?),您必须手动找出段基础。 x86 没有简单的方法来查询它;体系结构状态的那部分不可读,只能写(当您使用选择器编写段寄存器时从 GDT 或 LDT 加载)。有些人称内部段 base/limit 寄存器为“缓存”,但事实并非如此。即使您更改了 GDT 条目,它们也保证会保持其值,直到您手动 mov ds, eax
或其他方式。
GDB 根本不知道分段,如果您想使用分段内存模型调试代码,请使用 BOCHS 的 built-in 调试器。