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

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

4

2 回答 2

2

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

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

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

于 2012-08-17T11:35:16.297 回答
1

所以这是你的要求: -

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

您可以使用一些旧的编译器,可能是漂亮的 TCC(Turbo C 编译器,16 位)。这将输出你需要的东西。

此外,即使您会看到一个 16 位指针,它只是 virtual ,并且它的真实地址将根据体系结构进行转换(就像 32 位操作系统在 64 位体系结构上以兼容模式运行一样)。

但是,如果您真的对做这些事情非常感兴趣,只需打开cmd-->type debug--> 然后a--> 并且您可以在那里编写一些程序集。

于 2012-08-17T11:33:36.890 回答