我有一个旧的16位汇编程序应用程序,我想将其移植到32位。问题是它大量使用了段ds,es和gs。所以我不能使用扁平模型。所以我可以将它们移植到选择器上。
VS2010可以在32位模式下支持用户级应用程序中的选择器吗?
答案 0 :(得分:1)
你混合了两个不同的术语。在REAL模式下,x86使用段寄存器并计算20位地址,如下所示:
address = (segment_register << 4) + Offset
在PROTECTED模式下(16位和32位),段寄存器将选择器保持为64k / 4GB内存块,地址计算如下:
address = selector_table[segment_register] + offset
在使用32位和64位保护模式的操作系统中,操作系统通常保持ES = DS = GS = SS并仅使用32位或64位偏移量来寻址内存。
如果您的代码依赖于实模式地址计算,则需要完全重写保护模式。但是,如果它是为16位保护模式编写的,那么它仍然需要进行重大更改,但比第一种情况要少。
回到你的问题 - VS2010不限制你编写代码的方式,操作系统也是如此。在受保护模式下更改段寄存器的值可能会导致权限违规。此外,段覆盖(例如ES:[DI])是不必要的,因为所有段寄存器包含相同的值。