ZHCUAQ1F july 2015 – april 2023
可以通过以下两种方式访问全局和静态数据对象:
__near 关键字 | 编译器假定可以相对于数据页指针访问数据项。例如:
|
__far 关键字 | 编译器无法通过 DP 访问数据项。如果程序数据总量大于 DP 允许的偏移量 (32K),则可能需要这样做。例如:
|
与 near 和 far 声明保持一致。如果对象被定义为 far,则其他 C 文件或头文件中针对该对象的所有外部声明也必须包含 __far 关键字,否则您可能会遇到编译器或链接器错误。如果对象被定义为 near,您可以安全地在其他 C 文件或头文件中将其声明为 __far,但您对该变量的数据访问速度会变慢。
如果您使用 DATA_SECTION pragma,则对象被指示为 far 变量,并且不能被覆盖。如果您在另一个文件中引用此对象,则在另一个源文件中声明此对象时需要使用 extern __far。这确保了对变量的访问,因为变量可能不在 .bss 段中。相关详细信息,请参阅节 7.9.6。
在汇编代码中定义全局变量
如果您还使用 .usect 指令在汇编代码中定义了一个全局变量(该变量未在 .bss 段中分配),或者您使用 #pragma DATA_SECTION 指令将变量分配到单独的段;并且您想在 C 代码中引用该变量,则必须将该变量声明为 extern __far。这确保编译器不会尝试通过数据页指针生成对变量的非法访问。
当数据对象未指定 __near 或 __far 关键字时,编译器将使用 far 访问聚合数据,并使用 near 访问非聚合数据。更多有关数据存储模式和数据访问控制方式的信息,请参阅节 8.1.4.1。