首页 > 解决方案 > 如何将内存地址转换为代码段地址?

问题描述

如何将地址转换为 16 位代码段(CS 寄存器)?例如,如果 .text 段从 00E51000 开始,如何计算该段的 CS 寄存器?这个问题特定于 32 位 x86 架构。

标签: assemblyx8632-bitmachine-instruction

解决方案


在 32 位模式下,您可以(并且通常应该)始终使用引用具有 base=0 / limit=-1 的 GDT 条目的 CS 值。如果您在主流操作系统下的用户空间中运行,那么您的进程就已经开始了。实际上,DS/ES/SS 也会以同样的方式设置,即平面内存模型。(FS 或 GS​​ 可能具有线程本地存储的非零基数。)

然后您可以使用偏移量 = 0x00E51000 引用该部分/段中的内存。例如mov eax, 0x00E51234/ jmp eax

由于 DS/ES/SS 也为 0 / -1,您将拥有一个平坦的内存模型,其中mov eax, [0x00E51234]加载您将跳转到的相同字节。


推荐阅读