0

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

4

1 回答 1

3

在 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]加载您将跳转到的相同字节。

于 2019-02-10T05:26:42.470 回答