C 在16位模式下加载地址

C 在16位模式下加载地址,c,memory,pointers,assembly,x86,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]上变量的物理地址。 例如: 我有一个从软盘读取扇区的程序,然后它跳转到段:0并执行它。 正在加载的程序是简单文本编辑器。在编辑器中,我需要获取单个变量的物理地址,将

我想问一下如何在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]
上变量的物理地址。 例如: 我有一个从软盘读取扇区的程序,然后它跳转到
段:0
并执行它。
正在加载的程序是简单文本编辑器。在编辑器中,我需要获取单个变量的物理地址,将其转换为
段:偏移量
,并将其用于加载文本文件。在跳转到exitor之前,我尝试设置了
DS:SI
,但这不是很好的解决方案。有人知道怎么解决吗?请帮助。

这就是您的要求:-

mov word ptr [bp-x], 10
lea ax, word ptr [bp-x] 
mov word ptr [bp-x+4], ax 
您可以使用一些旧的编译器,可能是漂亮的TCC(Turbo C编译器,16位)。 这将输出您需要的内容

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


然而,如果你真的对这类事情很感兴趣,只需打开
cmd
-->键入
debug
-->然后
a
-->就可以在那里编写一点汇编了。

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

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


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

,C指针没有什么特别之处。。。你的意思是模拟一个范围大于16位的指针吗?ax是一个字的大小…显然它足以存储实际模式地址。哦,对不起,是ax,我没有看到。是的,当然,lea加载有效地址,这里的(bp-x)值到ax中。。。