assembly - 如何将内存地址转换为代码段地址?
问题描述
如何将地址转换为 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]
加载您将跳转到的相同字节。
推荐阅读
- anylogic - 在 AnyLogic 中计算司机工资
- php - nodejs应用程序的PHP子进程不输出任何内容
- coldfusion - 如何将分块上传文件名从“blob”更改为另一个值?
- c# - 如何从返回类型为 int 的方法返回错误消息/null?
- java - 为什么程序在第二行和第三行打印不正确?
- r - 部署 Shiny 应用程序时包加载导致错误
- docker - 来自守护程序的错误响应:驱动器尚未共享
- java - javac 返回“错误:找不到模块:ini4j”
- php - 在缓存数据中搜索会给出数组第一个索引 1
- python - 我的 Python 代码没有写入我的文件。为什么?