如何将地址转换为 16 位码段(CS 寄存器(?例如,如果 .text 段从 00E51000 开始,如何计算该段的 CS 寄存器?此问题特定于 32 位 x86 体系结构。
在 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]
加载的字节与跳转到的字节相同。