在16位模式下加载地址

3

我想询问如何在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,但这不是很好的解决方案。有人知道如何解决吗?请帮忙。


1
一个 C 指针并没有什么特别的……你是指模拟一个比 16 位更大范围的指针吗? - Prof. Falken
2个回答

2
在实模式下,一个字节内存的物理地址等于段 * 16 + 偏移量。
当您通过 [(e)bp+...] 或者 [esp+...] 引用内存时,默认涉及的段是 ss。否则就是 ds。可选的段覆盖前缀将更改默认段寄存器。
因此,例如,如果您的变量被标记为 [bp-8],那么它的物理地址就是 ss*16+bp-8

1

所以这是您的要求:

mov word ptr [bp-x], 10
lea ax, word ptr [bp-x] 
mov word ptr [bp-x+4], ax 

你可以使用一些旧的编译器,比如那个漂亮的TCC(Turbo C Compiler,16位)。 这样就能输出你需要的内容。

此外,即使你看到了一个16位指针,它只是虚拟的,它的真实地址将根据架构进行转换(就像32位操作系统在64位架构上运行兼容模式一样)。

然而,如果你真的对这些东西非常感兴趣,只需打开cmd -->输入debug --> 然后a -->你就可以在那里写一点汇编代码。


ax 是一个字的大小...显然足以存储实模式地址。 - perilbrain
1
哦抱歉,是ax,我没看到。当然了,lea将(bp-x)的值载入ax中,这样可以有效地获取地址。 - perilbrain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接