طويل: إدارة الذاكرة QuickBasic والمحول البرمجي الأساسية

ملخص

قد تريد المبرمجين فهم كيف Microsoft QuickBasic و Microsoft الأساسية مترجم ترتيب ذاكرة لكتابة البرامج كفاءة استخدام موارد النظام. لغة QuickBasic يوفر مجموعة متنوعة من أنواع البيانات وبنيه التعليمات البرمجية النمطية التي تسمح لك بإدارة البيانات والتعليمات البرمجية للبرامج.

مزيد من المعلومات

تغطي هذه المقالة الموضوعات التالية:


  1. إدارة التعليمات البرمجية


    1. برمجة نمطي
    2. ما يجري على مستوى الوحدة النمطية في وحدة الدعم
    3. عام، عام مشترك، مشتركة، أبعاد المشتركة
  2. إدارة البيانات


    1. Metacommands $DYNAMIC و $STATIC
    2. الصفيف كبير
ويتضمن التذييل ألف مثال التعليمات برمجية لتوضيح المواضيع المشمولة بهذه المادة.


يوضح التذييل باء. تعيين ملف تم إنشاؤه عندما يرتبط المثال البرنامج الملحق أ. يمكنك استخدام مخطط الارتباط لتحديد مدى قرب كل وحدة نمطية لتقترب من حد 64 كيلو بايت التعليمات البرمجية وكيفية إغلاق. تحصل على المتغيرات البرنامج EXE ثابتة إلى حد 64 كيلو بايت في DGROUP.


التذييلات جيم ودال وصف بالتفصيل تعيين الذاكرة للبرامج قيد التشغيل في بيئات مختلفة الثلاثة التالية: QB. EXE محرر برنامج. EXE البرنامج باستخدام الوحدة النمطية وقت التشغيل، و. EXE ترجمة مع خيار مستقل.

تعريفات

يعرف ملف مصدر فردية التي تحتوي على الإجراءات الأساسية "وحدة نمطية".


يعرف "التعليمات البرمجية على مستوى الوحدة النمطية" بعبارات ضمن وحدة نمطية الموجودة خارج SUB... END SUB، دالة... END FUNCTION أو DEF FN... نهاية كتلة تعريف DEF.


"وحدة دعم" هو ملف مصدر منفصل من الوحدة النمطية الرئيسية، التي تتضمن الإجراءات SUB أو وظيفة إضافية.

إدارة التعليمات البرمجية

برمجة نمطي

برمجة وحدات تتناول تقسيم البرامج إلى وحدات منفصلة (على سبيل المثال، ملفات مصدر منفصلة تتضمن إجراءات فرعية أو دالة). ولذلك أسباب ما يلي:


  1. مرة كنت قد كتبت كتلة من التعليمات البرمجية كوحدة نمطية، يمكن إدراجها بسهولة في المشاريع المستقبلية.
  2. التصحيح أسهل. مشاكل يمكن العثور بسرعة أكبر ويمكن تضمينها في منطقة معينة من البرنامج.
  3. المحول البرمجي (قبل الميلاد. EXE) والبيئة (QB. EXE) قد قيود التعليمات برمجية 64 كيلو كل وحدة نمطية. نمط برمجة نمطي يسمح لك بإنشاء برامج أكبر من 64 كيلو بايت، منذ كل وحدة نمطية، حتى ولو كان جزءا من برنامج واحد، يمكن أن تصل إلى 64 كيلو بايت.
إذا كان برنامج كبيرة، قد يكون من الضروري على تقسيمها إلى العديد من الوحدات النمطية. ويتم ذلك بسهولة بمخالفة الإجراءات SUB أو دالة من الوحدة النمطية الرئيسية ووضعها في وحدات الدعم. ثم يتم تصنيف هذه الوحدات بشكل منفصل مع BC. EXE والمرتبطة بالوحدة النمطية الرئيسية كما هو موضح في المثال التالي.


خذ بعين الاعتبار برنامج Main.BAS، مقسمة إلى ثلاث مجموعات:


  1. الرئيسي. BAS (الذي يستدعي الإجراءات الخارجية)
  2. MODULE2. BAS (والذي يتضمن الإجراءات الفرعية و/أو وظيفة)
  3. MODULE3. BAS (والذي يتضمن الإجراءات الفرعية و/أو وظيفة)
ثلاث وحدات يتم عندئذ كل تجميع بشكل منفصل لإنتاج ملفات الكائنات التالية:


  1. الرئيسي قبل الميلاد. بيان النشاط التجاري؛ ---> الرئيسي. الكائنات
  2. MODULE2 قبل الميلاد. بيان النشاط التجاري؛ ---> MODULE2. الكائنات
  3. MODULE3 قبل الميلاد. بيان النشاط التجاري؛ ---> MODULE3. الكائنات
لإنشاء الملف التنفيذي (. ويستخدم البرنامج EXE)، سطر الأوامر التالي:
    LINK Main.OBJ+Module2.OBJ+Module3.OBJ; ---->  Main.EXE
Main.EXE هو الانتهاء من البرنامج القابل للتنفيذ. عند التحويل البرمجي في بيئة QuickBasic's (QB. EXE) البيئة تلقائياً بتصنيف كل وحدة نمطية ويربط بينها معا لإنتاج نفس. ملفات OBJ وانتهاء البرنامج القابل للتنفيذ.


لجعل. البرنامج EXE من QB. EXE البيئة، القيام بما يلي:


  1. اختر قائمة التشغيل.
  2. اختر "ملف EXE جعله".. الخيار.
  3. حدد الخيار "ملف EXE المستقل" لإنشاء ملف مستقل. إذا لم يكن هذا الخيار محدداً، يتطلب البرنامج أن تكون الوحدة النمطية وقت التشغيل BRUN4x.EXE موجودة في وقت التشغيل.
  4. اضغط على المفتاح ENTER.
بيئة QuickBasic يوفر طريقة سهلة لإجراء العمليات التالية، تم وصف أدناه:


  1. إنشاء وحدة نمطية جديدة للغواصات
  2. تحرير SUBs والوحدات النمطية
  3. حذف الغواصات
  4. نقل الغواصات من وحدة نمطية إلى وحدة نمطية أخرى
في QB. EXE لإنشاء وحدة نمطية منفصلة (الملف المصدر) للغواصات، القيام بذلك:


  1. اختر من القائمة "ملف".
  2. اختر "إنشاء ملف"... الخيار.
  3. أدخل اسم الوحدة النمطية.
  4. اضغط على المفتاح ENTER.
ثم إنشاء ملف بالاسم الذي حددته، وسيكون في الذاكرة بوحدة (وحدات) الأخرى. لحفظ كافة الوحدات النمطية المحملة، قم بما يلي:


  1. اختر من القائمة "ملف".
  2. اختر خيار "حفظ الكل".
عندما يتم حفظ الوحدات النمطية معا، QuickBasic بإنشاء ملف (ذو الملحق. MAK) التي تتبع يحتفظ من الوحدة النمطية الرئيسية والوحدات الأخرى التي يستخدمها الرئيسي. لتحميل كافة الوحدات النمطية في مرة واحدة، قم بما يلي:


  1. اختر من القائمة "ملف".
  2. اختر "البرنامج المفتوح".. الخيار.
  3. حدد الوحدة النمطية الرئيسية للبرنامج فتح الملف.
لعرض وتحديد الغواصات للتحرير، قم بما يلي:


  1. اختر من القائمة عرض.
  2. اختر الغواصات... الخيار.
  3. تمييز الوحدة النمطية أو الفرعي الذي تريد تحريره.
  4. علامة التبويب وصولاً إلى التحرير في نشطة أو تحريرها في سبليت.
  5. اضغط على المفتاح ENTER.
لحذف فرعية، قم بما يلي:


  1. اختر من القائمة عرض.
  2. اختر الغواصات... الخيار.
  3. تمييز الفرعي الذي تريد حذفه.
  4. الانتقال إلى الخيار 'حذف'.
  5. اضغط على المفتاح ENTER.
لنقل SUB إلى وحدة نمطية مختلفة، قم بما يلي:


  1. اختر من القائمة عرض.
  2. اختر الغواصات... الخيار.
  3. وتبرز اللجنة الفرعية التي تريد نقلها.
  4. الانتقال إلى الخيار النقل.
  5. اضغط على المفتاح ENTER.
  6. حدد الوحدة النمطية تريد اللجنة الفرعية فيه.
  7. اضغط على المفتاح ENTER.
لمزيد من المعلومات حول استخدام محرر QB. بيئة EXE، الرجاء راجع كتيب "QuickBasic: التعلم باستخدام Microsoft" للإصدار 4، 50، أو راجع "Microsoft QuickBasic 4.0: التعليم واستخدام" دليل إصدارات 4.00 و4.00 b وإصدارات برنامج التحويل البرمجي أساسي 6.00 و6.00 b.

ما يجري على مستوى الوحدة النمطية في وحدة الدعم

وحدة دعم، عند التحويل البرمجي، ينتج كائن (. ملف OBJ) المرتبط بالوحدة نمطية رئيسية لإنشاء ملف قابل للتنفيذ. هو مستوى الوحدة النمطية للتعليمات البرمجية للوحدة النمطية الرئيسية فقط التعليمات البرمجية مباشرة تنفيذها بواسطة QuickBasic. لا يمكن التعليمات البرمجية على مستوى الوحدة النمطية من وحدات دعم التشغيل أو يسمى CHAINed. يتم استخدام هذه التعليمات البرمجية على مستوى الوحدة النمطية من وحدات الدعم فقط من أجل:


  1. معالجات الأحداث أو خطأ الملائمة
  2. Metacommands
  3. اكتب البيانات المشتركة التعاريف وأبعاد والعامة
يمكنك وضع عبارات ملائمة على الحدث GOSUB و ON ERROR GOTO ضمن البرنامج الفرعي الإجراءات [حيث "حدث على" يعني على KEY(n)، COM(n) على TIMER(n) على، إلخ.]. ومع ذلك، يجب أن الخط أو خط التسمية هو هدف GOTO أو GOSUB في فخ الحدث أو خطأ في التعليمة البرمجية على مستوى الوحدة النمطية في الوحدة النمطية نفسها كهذا البرنامج الفرعي. وهذا لأن QuickBasic لا يسمح جوسبس أو جوتوس من البرنامج الفرعي الوحدات النمطية الأخرى أو برنامج فرعي، ويسمح QuickBasic عبارات فقط على الحدث GOSUB و ON ERROR GOTO للانتقال من البرنامج الفرعي للتعليمات البرمجية على مستوى الوحدة النمطية.


يمكن أيضا استخدام المحول البرمجي metacommands (REM $INCLUDE $STATIC أ و $DYNAMIC أ) على مستوى الوحدة النمطية. REM $INCLUDE لصق مصدر إضافي في الوحدة النمطية في وقت التحويل البرمجي. $DYNAMIC أ و $STATIC أ تعريف الصفائف اللاحقة ك $DYNAMIC (تخصيص وقت التشغيل) أو $STATIC (تخصيص وقت التحويل البرمجي).


يمكنك استخدام نوع... بيانات نوع النهاية قاتمة ومشاركتها العامة في التعليمة البرمجية على مستوى الوحدة النمطية. يمكن مشاركة متغيرات والصفائف بين الوحدات النمطية استخدام العبارة "العامة المشتركة" على مستوى الوحدة النمطية.

عام، المشتركة العامة والمشتركة وأبعاد المشتركة

البيان المشترك الذي يوفر إجراء وصول SUB أو دالة للمتغيرات المعرفة في مستوى الوحدة النمطية الرئيسية لهذه الوحدة النمطية (دون تمريرها كمعلمات). لا يمنح الوصول إلى المتغيرات التي تم تعريفها في الوحدات النمطية للدعم.


البيان المشترك الصادر على توفير متغيرات مستوى الوحدة النمطية بين الوحدات النمطية. السمة المشتركة للقائمة العامة (على سبيل المثال، شائعة مشتركة) مطلوب لمشاركة المتغيرات مع برنامج فرعي أو الدالات. يجب أن تطابق قائمة المتغيرات في البيانات المشتركة ومشاركتها العامة في نوع في البيانات المشتركة ومشاركتها العامة في كل وحدة نمطية.


عند استخدام العبارة الشائعة (أو مشاركة عامة)، صفائف والدينامية أبعاد مختلفة. يجب أن يكون صفيف ثابت مشتركة أبعاد قبل البيان المشترك الصادر في كافة الوحدات النمطية مع هذا البيان المشترك. صفائف الحيوية المشتركة يجب أن تكون أبعاد بعد البيان المشترك الصادر في الوحدة النمطية الرئيسية فقط ولا يمكن أبعاد أي وحدات الدعم.


هناك اثنين من الاختلافات بين استخدام العبارة المشتركة وبيان DIM المشتركة:


  1. لجعل متغير قابل للوصول بكل برنامج فرعي في الوحدة نمطية، استخدم DIM المشتركة على مستوى الوحدة النمطية.
  2. لمشاركة متغير على مستوى الوحدة نمطية مع البرنامج الفرعي معينة، وضع المتغير في بيان مشترك في البرنامج الفرعي. البيان المشترك الذي يذهب مباشرة بعد السطر الأول من البرنامج الفرعي.

إدارة البيانات

الصفائف $DYNAMIC و $STATIC

الإعداد الافتراضي لتخزين الصفيف هو REM $STATIC، الذي يقوم بتخزين كافة الصفائف في DGROUP (جزء البيانات الافتراضية). لأي الأساسية. يقتصر البرنامج EXE، DGROUP إلى 64 كيلو بايت. إذا كنت تستخدم صفيف ثابت، يمكنك الحصول على المزيد من الذاكرة في DGROUP بجعل الصفائف الحيوية، التي ينقلها إلى كومة أقصى. لجعل مجموعة ديناميكية، أبعاد الصفيف بعد $DYNAMIC أ metacommand أو أبعاد الصفيف مع متغير في منخفض الخاصة به.


يتم تخزين كافة الصفائف الحيوية على كومة أقصى ما عدا صفائف من سلاسل الأحرف ذات الطول المتغير. يتم تخزين سلاسل أحرف ذات طول متغير الصفيف والمتغيرات البسيطة دائماً في DGROUP. لتخزين السلاسل في كومة أقصى، يجب أبعاد صفيف ديناميكي سلاسل ذات طول ثابت. قياس الأبعاد سلاسل بطول ثابت في صفائف الحيوية يساعد على تحرير مساحة التخزين التي وإلا قد اتخذتها في DGROUP، الذي يقتصر على 64 كيلو بايت.

الصفيف كبير

الصفيف كبير الصفائف التي أكبر من 64 كيلو بايت. عند استخدام صفائف ضخمة، يجب استدعاء QB. محرر EXE وقبل الميلاد. EXE المحول البرمجي مع خيار/AH. ويجب أبعاد صفيف كبير صفيف ديناميكي مع متغير في صفيف منخفض أو $DYNAMIC أ metacommand السابق. يسمح خيار/AH صفائف حيوية من الأنواع المعرفة من قبل المستخدم وسلاسل ذات طول ثابت والبيانات الرقمية ليشغل كل من الذاكرة المتوفرة.


عدد وحدات البايت في عنصر واحد من مجموعة ضخمة يجب يفضل قوة 2، بغية تجنب إهدار الذاكرة ولتمكين الصفائف أن تكون أكبر من 128 ألف، كما هو موضح أدناه.


يتم تخصيص مساحة لمجموعة ضخمة من المنطقة المجاورة في كومة أقصى، مع تقييد يسمح أي عنصر صفيف مفرد (أو سجل) يمكن تقسيم على حد 64 كيلو. إذا لم يكن حجم سجل قوة 2، يتم تخصيص الصفيف في إزاحة عالية بما يكفي، بالنسبة إلى عنوان الصفيف الشريحة الأساسية (التي تم إرجاعها بواسطة الدالة VARSEG)، حيث يتم تقسيم لا عنصر صفيف عبر الحدود في تماما 64 ألف أعلاه الجزء الأساسي. القيمة التي يتم إرجاعها بواسطة الدالة VARPTR للعنصر الأول من الصفيف ثم يشير إلى كل من إزاحة الصفيف، وأيضا حجم فجوة تم إنشاؤه في الكومة. هذه الفجوة في كومة أقصى الأجزاء والذاكرة المهدرة أو غير المستعملة. هو حجم الفجوة MOD يساوي (65536) (حجم الصفيف السجل). [وفي أسوأ الحالات، الفجوة يمكن يصل إلى (حجم سجل الصفيف) ناقص 1 في حجم.]


حدوث خطأ "منخفض خارج النطاق" عند تخصيص مجموعة ضخمة أكبر من 128 كيلو أن حجم غير إس زوجي 2 عناصر الصفيف. صفائف أكبر من 128 كيلو يجب أن يكون حجم عنصر قوة 2 (2، 4، 8، 16، 32، 64، إلخ)، حيث يتم تخزين صفائف التتالي ومسموح بعنصر صفيف مفرد لا يمكن تقسيم على حد 64 كيلو.


جانب رئيسي نهائي من إدارة الذاكرة QuickBasic هو أن يحاول QuickBasic كفاءة استخدام الذاكرة، مما قد يسبب صفائف سلسلة متغيرة الطول وسلاسل الأحرف ذات الطول المتغير صفائف الحيوية للتنقل في الذاكرة من عبارة إلى عبارة في وقت التشغيل. (المتغيرات الأخرى يكون موقع ثابت يحدد وقت التحميل EXE.) بالإضافة إلى ذلك، إذا كنت تقوم ببيان سلسلة، قد نقل أي البيانات التي يتم تمريرها في كتلة شائعة. وهذا يعني أن نتائج VARPTR، VARSEG، VARPTR$ أو دالة السد ينبغي دائماً أن تستخدم مباشرة بعد أن يتم استدعاء الدالة.

ملحق أ: نموذج البرنامج

يوضح نموذج البرنامج هذه المواضيع المشمولة بهذه المادة. يعطي هذا البرنامج مثال الطرق إلى أبعاد الصفيف، وتمرير المتغيرات بين الوحدات النمطية وبرنامج فرعي. البرنامج تتكون من وحدتين، كل الذي يعرف البرنامج الفرعي واحد.

الوحدة النمطية الرئيسية (EXAMPL1. BAS)

DECLARE SUB OtherModSub ()DECLARE SUB Subdemo ()

TYPE PowerOfTwo
I AS INTEGER ' 2 Bytes
L AS LONG ' 4 Bytes
S AS SINGLE ' 4 Bytes
D AS DOUBLE ' 8 Bytes
St AS STRING * 14 ' 14 Bytes

END TYPE ' 32 Bytes Total, a power of 2, 2^5

REM $STATIC
DIM A(100) AS INTEGER ' Static array, stored in DGROUP.

COMMON SHARED A() AS INTEGER ' Share the variables with the other
COMMON SHARED B AS STRING * 20 ' module and its SUBprograms.
COMMON SHARED X() AS INTEGER

REM $DYNAMIC
DIM X(100) AS INTEGER ' Dynamic array, stored in far heap.
DIM PTwo(4000) AS PowerOfTwo ' Dynamic huge array, stored in far heap
' Each element is a power of two, 2^5.

DIM NonFixedLen(10) AS STRING ' Dynamic array, but since it is not
' fixed length it is stored in DGROUP.

REM $STATIC
DIM SHARED M(100) AS LONG ' These variables are shared with all
DIM SHARED Equals AS STRING * 10 ' the SUBprograms in this module,
' and are stored in the DGROUP.

Num = 40

DIM DynArray(Num) AS SINGLE ' The array is dynamic since it is
' DIMensioned with a variable, so
' it is stored in far heap.

Plus$ = " + "
Equals = " = "
M(1) = 7
A(1) = 4

CALL Subdemo ' CALLs the SUBprogram of this module.
CALL OtherModSub ' CALLs the SUBprogram of the support module.
END

'SUBprogram of the Main Module:

SUB Subdemo

SHARED Plus$, NonFixedLen() AS STRING, Num

PRINT STR$(Num) + Plus$;
PRINT STR$(M(1))+ Equals + STR$(A(1));
A(1) = M(1)


END SUB

الوحدة النمطية لدعم (EXAMPL2. BAS)

REM $STATIC
DIM A(100) AS INTEGER ' Only the static array is DIMensioned
COMMON SHARED A() AS INTEGER ' before the COMMON SHARED statement.
COMMON SHARED B AS STRING * 20
COMMON SHARED X() AS INTEGER ' The dynamic array is only DIMensioned
' in the main module.

Panic: ' The label for ON ERROR has to be at
resume next ' the module level.


' SUBprogram of the Support Module:

SUB OtherModSub
PRINT A(1)
ON ERROR GOTO Panic
END SUB

الارتباط ب: التذييل. شرح ملف مخطط

فيما يلي. تعيين ملف تم إنشاؤه عندما يرتبط المثال البرنامج الواردة في التذييل ألف. . يظهر ملف خريطة من ارتباط نجاح مدى قرب مقطع التعليمات البرمجية في وحدة نمطية يقترب من حد التعليمات البرمجية 64 كيلو بايت، ثم كيفية إغلاق المتغيرات ثابتة للكامل. البرنامج EXE لتقترب من حد 64 كيلو بايت DGROUP. لإنشاء مخطط سرد البرنامج، تضمين اسم ملف مخطط في الوسيطة الثالثة الأمر الارتباط، كما في المثال التالي:
   LINK EXAMPL1.OBJ+EXAMPL2.OBJ,,EXAMPLE.MAP;
ملاحظات للارتباط. تعيين عرض المزيد فيما يلي:


  1. EXAMPL1_CODE هو مقطع التعليمات البرمجية ل EXAMPL1. BAS.
  2. EXAMPL2_CODE هو مقطع التعليمات البرمجية ل EXAMPL2. BAS.
  3. مقطع التعليمات البرمجية لكل وحدة قد يكون أقل من 64 كيلو بايت. عندما يتم الاقتراب من مقطع التعليمات البرمجية 64 كيلو بايت، بتقسيم الوحدة النمطية إلى اثنين أو أكثر من الوحدات النمطية. للعثور على طول مقطع التعليمات البرمجية، انظر أسفل عمود الطول. على سبيل المثال، طول مقطع التعليمات البرمجية ل EXAMPL1. BAS بايت سداسي 15 (أ)، وهو 346 بالتدوين العشري.
  4. FAR_MSG هي مجموعة إدارة أقصى يحتوي على نص رسائل الخطأ. ليس هذا هو أقصى كومة الذاكرة المؤقتة. يتم تخصيص كومة أقصى في وقت التشغيل.
  5. وفقا للبند المنشأ في أسفل مخطط الارتباط، يبدأ DGROUP 06DC:0، وهو عشري 06DC عنوان الفقرة، مع إزاحة 0. هذا هو نفس ست عشري 06DC0 عنوان بايت (حيث يتضمن فقرة 16 بايت). وهكذا، في هذا المثال، يبدأ DGROUP حيث يبدأ BR_DATA.
  6. DGROUP ينتهي عند عنوان إيقاف المكدس.
  7. لمعرفة حجم DGROUP للبرنامج، الحصول على عنوان إيقاف المكدس وتقلل منها عنوان البدء بيانات العنصر الأول في DGROUP. على سبيل المثال، حجم DGROUP للبرنامج هو ست عشري 7F9F ناقص ست عشري 6DC0 بايت (4575) سداسي 11DF.
  8. كافة العناوين في. يتم تعيين فقط بالنسبة إلى البداية. البرنامج EXE. يتم تحديد عنوان التحميل المطلق دوس فقط في وقت التشغيل. يمكن استخدام عبارات VARSEG و VARPTR في البرنامج وقت التشغيل لعرض عناوين المتغيرات المطلق.

EXAMPLE.MAP

 Start  Stop   Length Name                   Class
00000H 00159H 0015AH EXAMPL1_CODE BC_CODE
00160H 001C1H 00062H EXAMPL2_CODE BC_CODE
001C2H 03931H 03770H CODE CODE
03932H 03A0CH 000DBH INIT_CODE CODE
03A10H 041B2H 007A3H _TEXT CODE
041C0H 065EFH 02430H EMULATOR_TEXT CODE
065F0H 065F0H 00000H C_ETEXT ENDCODE
065F0H 065F7H 00008H FAR_HDR FAR_MSG
065F8H 06C44H 0064DH FAR_MSG FAR_MSG
06C45H 06C46H 00002H FAR_PAD FAR_MSG
06C47H 06C47H 00001H FAR_EPAD FAR_MSG
06C50H 06DBFH 00170H EMULATOR_DATA FAR_DATA

06DC0H 06DC0H 00000H BR_DATA BLANK
06DC0H 06DEFH 00030H BR_SKYS BLANK
06DF0H 06EFBH 0010CH COMMON BLANK
06EFCH 070E3H 001E8H BC_DATA BC_VARS
070E4H 070E9H 00006H NMALLOC BC_VARS
070EAH 070EAH 00000H ENMALLOC BC_VARS
070EAH 070EAH 00000H BC_FT BC_SEGS
070F0H 0710FH 00020H BC_CN BC_SEGS
07110H 07122H 00013H BC_DS BC_SEGS
07124H 07124H 00000H BC_SAB BC_SEGS
07124H 0712BH 00008H BC_SA BC_SEGS
0712CH 0712FH 00004H BC_SAE BC_SEGS
07130H 07345H 00216H _DATA DATA
07346H 0761FH 002DAH _BSS DATA
07620H 0771CH 000FDH BR_DATA DATA
0771EH 0771EH 00000H XIB DATA
0771EH 07741H 00024H XI DATA
07742H 07742H 00000H XIE DATA
07742H 0774DH 0000CH DBDATA DATA
0774EH 0775BH 0000EH CDATA DATA
0775CH 0775CH 00000H XIFB DATA
0775CH 0775CH 00000H XIF DATA
0775CH 0775CH 00000H XIFE DATA
0775CH 0775CH 00000H XPB DATA
0775CH 0775CH 00000H XP DATA
0775CH 0775CH 00000H XPE DATA
0775CH 0775CH 00000H XCB DATA
0775CH 0775FH 00004H XC DATA
07760H 07760H 00000H XCE DATA
07760H 07760H 00000H XCFB DATA
07760H 07760H 00000H XCF DATA
07760H 07760H 00000H XCFE DATA
07760H 0779FH 00040H CONST DATA
077A0H 077A0H 00000H BC_DATA BC_DATA
077A0H 077A0H 00000H XOB BSS
077A0H 077A0H 00000H XO BSS
077A0H 077A0H 00000H XOE BSS
077A0H 07F9FH 00800H STACK STACK

Origin Group
06DC:0 DGROUP
065F:0 FMGROUP
Program entry point at 03A1:00C8

التذييل جيم: حيث QuickBasic 4.00، 4.00 b، وتخزين 4.50 الصفائف الخاصة بهم

هناك اختلاف واحد في صفيف التخزين بين البرامج التي يتم تشغيلها أثناء التحويل البرمجي. تشغيل ملفات EXE والبرامج داخل بيئة إصدارات 4.00 b, و 4.50 QuickBasic (QB. EXE). في QB. يتم تخزين البيئة EXE، صفيف ثابت، لا بشكل عام ولا تتكون من سلاسل الأحرف ذات الطول المتغير، في الكومة (بدلاً من DGROUP، كما هو الحال في. برامج EXE).


هذا يغير إدارة الذاكرة في البرنامج، اعتماداً على حيث تقوم بتشغيل البرنامج.


وبالتالي، في البرامج التي تعمل في بيئة QuickBasic 4.00 b, أو 4.50 (QB. EXE)، يتم تخزين صفائف كما يلي:


  1. كافة الصفائف $STATIC مشتركة يتم تخزينها في DGROUP ويمكن الرجوع إليها بالقرب من عناوين.
  2. يتم أيضا تخزين في DGROUP كافة الصفائف سلاسل ذات طول متغير وأيضا يمكن الرجوع إليها بالقرب من عناوين.
  3. صفائف أخرى مخزنة ككائنات أقصى ويتطلب أقصى عناوين. يتضمن هذا الصفيف $STATIC غير موجودة في بيان مشترك، ويمكن نقل هذه الصفائف في الذاكرة مثل الصفائف $DYNAMIC.
في QuickBasic 4.00 b, و 4.50 البرامج التي يتم تشغيلها أثناء التحويل البرمجي. يتم تخزين ملفات EXE، الصفائف كما يلي:


  1. كافة الصفائف $STATIC مخزنة في DGROUP ويمكن الرجوع إليها بالقرب من عناوين.
  2. يتم أيضا تخزين في DGROUP كافة الصفائف $DYNAMIC من سلاسل الأحرف ذات الطول المتغير وأيضا يمكن الرجوع إليها بالقرب من عناوين.
  3. يتم تخزين كافة الصفائف $DYNAMIC ككائنات بعيدة.

التذييل دال: خرائط الذاكرة

يتضمن هذا التذييل مخطط الذاكرة عام واحد وثلاثة مخططات تفصيلية الذاكرة وقت التشغيل.

مخطط الذاكرة العامة

يلخص المخطط التالي كيف يتم تحميلها في الذاكرة برامج QuickBasic التي تم تحويلها برمجياً في وقت التشغيل:
          High Memory (640K maximum)
+-----------+
| | The far heap stores dynamic arrays. The far
| (Far) | heap consists of the rest of high memory
| Heap | available after MS-DOS and the Basic
| | program's DGROUP segment and code
--- +-----------+ segment(s) are allocated.

| | | The stack is used to store temporary data,
| | Stack | such as variables that are passed to a
DGROUP | | subprogram procedure. The default stack
Up to |- - - - - -| size is 2K.
64K | | The DGROUP (default data segment) is used
| | (Near) | to store all static arrays, strings,
| | Data | simple variables, and the stack. DGROUP
--- +-----------+ can be up to 64K in size.
:
+-----------+
| Code | The code segments store the executable code.
| Segments | Each module can have up to 64K for its
+-----------+ code segment.
Low Memory

وصف الأرقام التالية 1 و 2 و 3 بمزيد من التفصيل هذه الترتيبات من التعليمات البرمجية والبيانات في الذاكرة في وقت التشغيل.

الشكل 1

يظهر الشكل الأول (أدناه) مخطط الذاكرة وقت التشغيل عند تنفيذ البرنامج داخل QB. EXE الإصدار 4.x البيئة:
                   +-------------+
| Quick |
| Library |
+-------------+
|Communication| User-specified size
| buffers |
+-------------+
| | This area contains items, such as
| FAR heap | large/huge arrays and user code,
| | dynamic arrays.
+-------------+

User Data ------->Run-time heap| Files buffers, etc.
End DS:xxxx +-------------+
| String heap |
+-------------+
| User Program|
DGROUP | Data |
+-------------+
UP to | User Stack |
64K +-------------+
| Quick Lib |
| Data |
+-------------+
| QuickBasic |
User Data | Static |
Start DS:0 ------->| Data |
+-------------+
| QuickBasic | QB.EXE
Low Memory ------->| Code |
+-------------+
| MS-DOS | MS-DOS Operating System
+-------------+
0000:0000 ------->

الشكل 1 (أعلاه): مخطط الذاكرة ل QB. بيئة 4.x EXE

الشكل 2

يظهر هذا الشكل الثاني (أدناه) مخطط الذاكرة وقت التشغيل كما يظهر عند استخدام الوحدة النمطية وقت التشغيل BRUN4x.EXE مع الأسلوب التصنيف منفصلة (جعل ملف EXE...):
                   +-------------+
| BRUN4x.EXE | Separately loaded run-time code
+-------------+
|Communication| User-specified size
| buffers |
+-------------+
| | This area holds less-frequently-
| | used items, such as dynamic
| FAR heap | arrays, the user environment
| | table.
| |
| |
+-------------+
User Data ------->Run-time heap|
End DS:xxxx +-------------+
| String heap |
+-------------+
| User Stack | Preset to 2K
+-------------+
| Named | Named COMMON areas
| COMMON |
DGROUP +-------------+

| BC_DATA | User program variables
Up to +-------------+
64K | BC_CONST | User program constants
+-------------+
| Blank COMMON|
+-------------+
| _DATA | QuickBasic run-time data areas,
User Data | CONST | used during user code execution
Start DS:0 ------->| _BSS |
+-------------+
| User Code | User program separately linked
Low Memory ------->| | with BRUN4x.LIB
+-------------+
| MS-DOS | MS-DOS Operating System
+-------------+
0000:0000 ------->

الشكل 2 (أعلاه): الذاكرة النمطية وقت التشغيل BRUN4x.EXE. EXE

الشكل 3

يظهر هذا الشكل الثالث (أدناه) مخطط الذاكرة وقت التشغيل عند استخدام الخيار وحدة المكتبة (BCOM4x.LIB)-حامل بأسلوب تجميع منفصلة (جعل ملف EXE...):
                   +-------------+
|Communication| User specified size
| buffers |
+-------------+
| | This area contains less frequently
| | used items, such as large
| FAR heap | numeric arrays, the user
| | environment table, dynamic
| | arrays.
| |
+-------------+

User Data ------->|Run-time heap| Files, buffers, etc.
End DS:xxxx +-------------+
| String heap |
+-------------+
| User Stack | Preset to 2K bytes
+-------------+
| Named | Named COMMON areas
| COMMON |
DGROUP +-------------+
| BC_DATA | User program variables
Up to +-------------+
64K | BC_CONST | User program constants
+-------------+
| Blank COMMON| Library and user definitions
+-------------+
| _DATA | QuickBasic run-time data areas,

User Data | CONST | used during user code execution
Start DS:0 ------->| _BSS |
+-------------+
|Run-time code| Run-time code linked into file
+-------------+
| User Code | User program separately linked
Low Memory ------->| | with BCOM4x.LIB
+-------------+
| MS-DOS | MS-DOS Operating System
+-------------+
0000:0000 ------->

الشكل 3 (أعلاه): المستقل الذاكرة (مكتبة BCOM4x.LIB). EXE
خصائص

رقم الموضوع: 45850 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات