c - 16位模式加载地址

标签 c memory pointers assembly x86

我想问一下如何在 16 位汇编中模拟 C 指针。

int var = 10;
int * ptr = &var;

在汇编中就像

mov dword ptr [ebp-x], 10
lea eax, dword ptr [ebp-x]
mov dword ptr [ebp-x+4], eax

有什么方法可以在 16 汇编中获取 [bp-x] 变量的物理地址。 例如: 我有一个从软盘读取扇区的程序,然后跳转到 segment:0 并执行它。 正在加载的程序是简单的文本编辑器。在编辑器中,我需要获取单个变量的物理地址,将其转换为 segment:offset 并将其用于加载文本文件。我曾尝试在跳转到退出程序之前设置 DS:SI,但这不是很好的解决方案。有谁知道如何解决它?请帮忙。

最佳答案

在实寻址方式下,一个字节内存的物理地址等于段*16+偏移量。

当您通过[(e)bp+...][esp+...] 引用内存时,涉及的默认段是ss。否则为 ds。可选的段覆盖前缀将更改默认段寄存器。

因此,例如,如果您的变量地址为 [bp-8],那么它的物理地址为 ss*16+bp-8

关于c - 16位模式加载地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12004921/

相关文章:

c - 使用malloc在c中分配大小为10^5 * 10^5的数组

c++ - 如何强制 avcodec 使用未对齐的帧数据平面?

c - 格式的参数太多 - C

c - 括号内的运算符优先级

c - Valgrind 向 malloc 报告愚蠢的 arg,我如何找出位置?

c - C 结构中的灵活数组成员

c - 如何确保分配缓冲区在内存中

c - 删除二叉树元素

c - 服务器无法正确读取/打开客户端用 C 发送的文件名

c - 为什么此更改会导致段错误?