Far pointer
In a segmented architecture computer, a far pointer is a pointer to memory in a specific context,[1] such as a segment selector making it possible to point to addresses outside of the default segment.
Comparison and arithmetic on far pointers is problematic: there can be several different segment-offset address pairs pointing to one physical address.
In 16-bit x86
For example, in an Intel 8086, as well as in later processors running 16-bit code, a far pointer has two parts: a 16-bit segment value, and a 16-bit offset value. A linear address is obtained by shifting the binary segment value four times to the left, and then adding the offset value. Hence the effective address is 21 bits[Note 1]. There can be up to 4096 different segment-offset address pairs pointing to one physical address. To compare two far pointers, they must first be normalized to a form with only one representation address. Such a normalized form may be one that minimizes the segment (maximizing the offset), minimizes the offset (maximizing the segment), or converts the 2-part segmented address to a (20-bit) linear representation. One commonly used normalized form minimizes the offset part of the address to a value less than 16 (10 hex): such a normalization can be computed simply by taking the low-order 4 bits of the unnormalized offset as the new offset, and adding to the unnormalized segment the unnormalized offset shifted right by 4 bits.
On Ccompilers targeting the 8086 processor family, far pointers were declared using a non-standard far qualifier; e.g., charfar*p; defined a far pointer to a char. The difficulty of normalizing far pointers could be avoided with the non-standard huge qualifier. On other compilers it was done using an equally non-standard __far qualifier.[2]
Example of far pointer:
#include<stdio.h>intmain(){charfar*p=(charfar*)0x55550005;charfar*q=(charfar*)0x53332225;*p=80;(*p)++;printf("%d",*q);return 0 ; }- مخرجات البرنامج التالي: 81؛ لأن كلا العنوانين يشيران إلى نفس الموقع.
- العنوان الفعلي = (قيمة سجل القطاع) × 0x10 + (قيمة الإزاحة).
- الموقع الذي يشير إليه المؤشر
pهو : 0x5555 × 0x10 + 0x0005 = 0x55555 - الموقع الذي يشير إليه المؤشر
qهو : 0x5333 × 0x10 + 0x2225 = 0x55555 - إذن، يشير
pكلاهماqإلى نفس الموقع 0x55555.
إرث
صُممت واجهة برمجة تطبيقات ويندوز ( Windows API) في الأصل لمعالجات x86 ذات 16 بت، ووفرت تعريفات أنواع للتعامل مع المؤشرات القريبة والبعيدة. [ 3 ] في اصطلاح WinAPI، تُسبق أسماء أنواع المؤشرات البعيدة بالبادئة LP (اختصارًا لـ long pointer
). [ 4 ] على سبيل المثال، PDWORDيشير إلى مؤشر قريب إلى قيمة DWORD ، بينما LPDWORDيشير إلى المؤشر البعيد المقابل. [ 5 ]
في نظام التشغيل Win32 ، تم الاحتفاظ بتعريفات أنواع المؤشرات القديمة لضمان التوافق مع الإصدارات السابقة . ولأن الحاجة إلى المؤشرات البعيدة قد أُلغيت، لم يعد هناك فرق بين الأنواع الفعلية التي تستند إليها تعريفات أنواع المؤشرات القريبة والبعيدة. [ 5 ] وقد نتج عن ذلك قيام الشيفرة المكتوبة أصلاً لنظام التشغيل Win16 بإجراء تحويلات زائدة لأنواع المؤشرات عند نقلها إلى نظام التشغيل Win32. [ 3 ]
في ESA/390 و z/Architecture
في بعض مُجمِّعات لغة C لأنظمة ESA/390 و z/Architecture ، يُمكن استخدام المؤشرات البعيدة لتضمين مُعرِّف لمساحة عناوين بديلة للوصول إليها. [ 6 ] [ 7 ] تتضمن أنظمة ESA/370 و ESA/390 و z/Architecture إمكانياتٍ لبرنامج يعمل في مساحة عناوين مُعينة للوصول إلى البيانات في مساحة عناوين أخرى عبر "سجلات الوصول". [ 8 ]
على جهاز AVR
في وحدات التحكم الدقيقة AVR الأكبر حجمًا ، يمكن الوصول إلى أكثر من 64 كيلوبايت عبر المؤشرات البعيدة، والتي تتضمن تحديد "الصفحة" التي يبلغ حجمها 64 كيلوبايت والتي يجب الوصول إليها.
ملحوظات
- ↑ كانت معالجات x86 المبكرة تحتوي على ناقل عناوين 20 بت فقط، لذا كانت النتائج التي تزيد عن 1 ميجابايت تُعاد إلى الصفر، مع تجاهل بت الحمل. أما أجهزة الكمبيوتر الشخصية التي تستخدم معالج 80286 أو أحدث، والتي تحتوي على خطوط العناوين اللازمة، فقد طبقت بوابة A20 لعكس هذا السلوك من أجل التوافق مع الإصدارات السابقة من البرامج.
مراجع
- ↑ إيثان ل. ميلر؛ جورج نيفيل-نيل؛ أخيل بينيتوبولوس؛ بانكاج مهرا؛ دانيال بيتمان (17 نوفمبر 2023). "المؤشرات في الذاكرة البعيدة" . مجلة اتصالات رابطة مكائن الحوسبة . 66 (12): 40-45 . doi : 10.1145/3617581 . ISSN 0001-0782 . Wikidata Q130948234 . تاريخ الاسترجاع: 11 فبراير 2024 .
- ↑ "مقدمة إلى Open Watcom C/C++" . GitHub . 2024. تم الاطلاع عليه في 11 فبراير 2024 .
- 1 2 تشين، ريموند (3 نوفمبر 2004). "لماذا أرى أحيانًا عمليات تحويل زائدة قبل التحويل إلى LPARAM؟" (منشور مدونة) . الشيء الجديد القديم . مايكروسوفت .
- ↑ بيتزولد، تشارلز (1996). "مرحباً، ويندوز 95". برمجة ويندوز 95. ريدموند، واشنطن: مطبعة مايكروسوفت . ISBN 1-55615-676-6.
- 1 2 لاور، توماس (1996). "الملحق 1" . النقل إلى Win32™ . نيويورك: سبرينغر-فيرلاغ . ص 355-358 . doi : 10.1007/978-1-4612-0727-6 . ISBN 0-387-94572-5تمت أرشفة هذا النص من المصدر الأصلي في 22 يونيو 2026.
- ↑ "دعم وضع سجل الوصول" . دليل مستخدم مُجمِّع ومكتبة SAS/C، الإصدار 7.00 . SAS .
- ↑ "دليل برمجة لغة سي المعدنية والمرجع" (ملف PDF) . شركة IBM. صفحة 35.
- ^ روجرز، ب. هيرينج، ص. كوهنر، L.؛ لافيت، J.؛ ميناتو، م.؛ موراو، J .؛ نايدو، م. بيليج، ج.؛ فيليبي، إي. رودولفي ج. (ديسمبر 2007). "الخيار المعدني z/OS XL C/C++". تطبيق z/OS الإصدار 1 الإصدار 9 (PDF) (الطبعة الأولى ). آي بي إم . ص 251 – 274. ISBN 0738488607.
- ذاكرة الحاسوب
- المؤشرات (برمجة الحاسوب)
