如何将内存地址转换为代码段地址?

时间:2019-02-10 02:12:04

标签: assembly x86 32-bit machine-instruction

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

1 个答案:

答案 0 :(得分:3)

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

然后,您可以在该节/段中以偏移= 0x00E51000引用内存。例如mov eax, 0x00E51234 / jmp eax

在DS / ES / SS也是0 / -1的情况下,您拥有一个平面存储器模型,其中mov eax, [0x00E51234]加载了您将跳转到的相同字节。