C 在16位模式下加载地址
我想问一下如何在16位汇编中模拟C指针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并执行它。 正在加载的程序是简单文本编辑器。在编辑器中,我需要获取单个变量的物理地址,将
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中。。。