Flat memory Model 平坦内存模型

***************Title: Flat memory Model****************
***************  标题:平坦内存模型********************
*=================译自Tutor by Hutch==================*
*===Original:Collected and packed by dREAMtHEATER=====*
*======翻译:小桥 from QDU huasoft@163.com============*
*==================20020820 at home===================*
*******************************************************
之一:
平坦内存模型(Flat memory Model)


一个用本地32位Windows格式写成的程序是由所谓“平坦内存模型”创建的,它只有一个包含代码和数据的段。这个程序必须在386或更高的处理器上运行。

早期的16位代码,由段和偏移地址混合达到寻址64k(段的限制)。与此不同的是,平坦内存模型只需要偏移量却有4G的寻址范围。这使得汇编更容易书写,而代码总得来说也将快一点。

在这种平坦内存模型下,所有的段寄存器都被自动设为相同的值,而这意味着段/偏移寻址方式一定不能用于在32位Windows上运行的32位程序。

对于曾经在DOS下写程序的程序员来讲,一个32位的Windows PE可执行文件就像一个DOS下的COM文件,它们仅有一个包含程序代码和数据的段,而它们都直接用偏移地址,而不是段/偏移寻址方式。

平坦模型程序是近(NEAR)代码寻址以及近数据寻址,都是在4G的范围之内。

FS和GS段寄存器不在普通的程序中用到,但却被操作系统的某些程序实例所利用。
========================================================

在新的GCC编译器版本中,`far` 关键字可能已经不再被支持,因为它是特定于16位或某些老式32位架构的内存模型的一部分,而现代操作系统和编译器设计更多地依赖于平坦内存模型flat memory model)。 如果你的代码中包含 `far` 关键字,并且在新的GCC编译器下导致编译失败,你可以考虑以下几种方法来解决这个问题: 1. **修改代码以适应新的编译器**:检查 `far` 关键字的使用上下文,了解它为何而存在。通常,`far` 关键字用于声明指向远指针的变量,这类变量在数据段和代码段之间有特殊的寻址需求。如果代码是在16位实模式下编写的,你可能需要重写代码以适应平坦内存模型。这可能涉及到改变数据和函数的存储类,移除 `near` 和 `far` 指针的区分。 2. **使用编译器选项**:尽管GCC默认不支持 `far` 关键字,某些特定的编译器或编译器版本可能允许你通过特定的编译选项来支持它。不过,这通常不被推荐,因为它会使代码依赖于特定的编译器版本和平台。 3. **使用宏定义或条件编译**:如果你的代码需要同时在支持和不支持 `far` 关键字的编译器上编译,可以使用条件编译指令来区分这两种情况。例如,你可以在代码中使用宏定义来条件性地包含 `far` 关键字的使用。 ```c #ifdef FAR_POINTER_SUPPORT far int *ptr; // 只在旧编译器中定义 #else int *ptr; // 在新编译器中定义 #endif ``` 这种方法可以让代码在旧的编译器上编译时包含 `far` 关键字,而在新的编译器上编译时则不包含。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值