الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما هي ال equtes؟

مغلق
بدأه allko في 4 سبتمبر 2005 · 10 رد · 791 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اود ان اعرف معنى الـ equate بشء من التفصيل

حيث ان اوامرها تكون بالشكل التالي(كما في الكتاب الذي قراته)

LinesDown EQU 4; Number of lines down to start ASCII table

وفي كثير من المواضع تاتي اسفل ال DB(اوDW) كثنائي كالتالي

VidIDStr   DB  'The installed video board is:'
LVidIDStr  EQU  $-VidIDStr

وعن الثائي هذا يقول الكاتب ان ال equate مخصصة لحساب طول ال string

(((لاحظ حرف L في بداية السطر الثاني يبدو انه يرمز للطول..احيانا اجد نفس الامر هكذا

VidIDStrLength EQU $-VidIDStr

)))

فهل من الممكن ان اجد شرحا لهذا الـ directive ؟؟

وما الفرق بينها وبين ال label فالاثنين هما اختصارات لقيم معينة

وقد ارفقت شرحا لها كما جاء في كتاب assembly step by step)

بصيغةtxt.لكني لم افهمه والا لما كنت قد كتبت هذا الموضوع!

مرة اخرى اعتذر كن كثرة الاسئلة :(

eqates.txt

#2

وعليكم السلام

equ تعطى قيمة ثابته لمتغير مثلاُ تريد ان تستخدم ثوابت امثال pi فإنك تعطيها القيمه 3.1415 وبذلك تستطيع إستخدامها فى برنامج دون ان تحتاج إلى التفكير فى قيمتها..

lable هو عنوان شفره معينه تريد العوده إليها فبدلاً من ان تكتب العنوان بشكل 32 بت تستطيع ان تضع رمز للعنوان, نفترض انك تريد ان تقوم بعمل حلقه (loop) تستطيع ان تحدد بداية الحلقه بـlable.

بالنسبه للعلامة $ فهى تعنى العنوان الحالى فى لغة الـmasm لا اعرف بالنسبه للغات الاخره مثل tasm , المثال الذى ارفقته الداله الاولى VidIDStr هى عنوان النص , والداله LVidIDStr هى طول النص..

دائماً العنوان الحالى إذاطرحنا منه عنوان النص الاصلى يعطينا الفرق بينهم وهو طول النص ..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

شكرا على سرعة الرد اخ احمد غريب

انت تقول

"

equ تعطى قيمة ثابته لمتغير مثلاُ تريد ان تستخدم ثوابت امثال pi فإنك تعطيها القيمه 3.1415 وبذلك تستطيع إستخدامها فى برنامج دون ان تحتاج إلى التفكير فى قيمتها..

"

لكن ماذا عن هذه ال variables (احد انواع الlables)

MyData DB 07H

MOV AX,MyData

ان MyData اصبح لها قيمة ثابت هي 07h اي ان ال DB حل محل ال equ

ارجو التوضيح

تحياتي

#4

بالنسبة للمتغيرات اخي allko فيه نقطة انه اكبر متغير ممكن تعرفه حسبما اذكر هو DQ (تبعا لنوع المعالج) لكن اذا بدك مثلا تحجز منطقة في الذاكرة بحجم 100 بايت مثلا فبتستخدم equ بالشكل:

buffer     equ    100 dup (0)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

علي حد علمي equ تقابل const في لغات البرمجة الاخري مثل vb

وبالتالي لا يمكن تغيير القيمة التي تاخذها هذه الثوابت بعد عمل ترجمة للبرنامج

بالنسبة للمتغيرات فيمكن ان تغير قيمتها كما تريد اثناء وقت التنفيذ

#6

المتغير مثل mydata يمكنك ان تغير محتواه اثناء عمل البرنامج, فقط ضع بإستخدام offset المتغير mydata فى اى مسجل ثم غير محتواه ولكن التعريفات التى استخدمت عملية equ فى إنشائها لا تستطيع تغيرها, لذلك تستخدم فى الثوابت مثل pi او الثوابت الفيزيائيه الخ..

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#7

اعتقد انني الان قد استطع تجميع معلوماتي B)

ال lable عدة انواع فمنها

segment lable كالـ mydata segment مثلا وهذه تمثل عنوان محدد للسيجمنت

الخاصة بالداتا مثلا

variable lable كالتي كتبت اوامر لها مثل MyVariable DB 07H

ونوع اخر كـ start: حيث تقوم بتحديد مكان بداية الداتا كود

وردّ الاخ احمد الاول والاخير فيه الكثير من التوضيح

ال label هو " هو عنوان شفره معينه تريد العوده إليها فبدلاً من ان تكتب العنوان بشكل 32 بت تستطيع ان تضع رمز للعنوان"

ان الـ variable lable :

"يمكنك ان تغير محتواه اثناء عمل البرنامج, فقط ضع بإستخدام offset المتغير mydata فى اى مسجل ثم غير محتواه ولكن التعريفات التى استخدمت عملية equ فى إنشائها لا تستطيع تغيرها, لذلك تستخدم فى الثوابت مثل pi او الثوابت الفيزيائيه الخ.."

لكن احب ان اضيف الى كلام الاخ احمد قليلا...

ان الـ equate اما ان تحدد قيمة لثابت من الثوابت كما تفضلت..

او ان تحدد طول احد المتغيرات كما اشرت سابقا وذلك بالامر التالي

LVidIDStr  EQU  $-VidIDStr

وهي هنا تحدد طول الstring التي عرفها الDB

اخH7SE شكرا لك رغم انني لم افهم شيئا فليش لي اية معلومات عن الفيبي

اخ xacker شكرا جزيلا لك :) الا انني اعتقد ان المتغيرات ليس من الضروري ان يكون لها حجم محدد

فالdirective الذي استخدمته مع ال equ يمكن استخدامه مع ال variables كالتالي

MyBuffer DB 100 DUP (0)

تحياتي للجميع

#8

كل ما قلته صحيح إلا ان النص التالى :

LVidIDStr  EQU  $-VidIDStr

يتم تحويله من قبل الاسمبلر إلى عدد ثابت, يعنى الاسمبلر يقوم بعملية حسابية تحول LVidIDStr EQU $-VidIDStr إلى رقم ثابت يتم التعامل معه خلال عمل برنامجك..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#9

لماذا؟

انت تقول "يتم تحويله الى رقم ثابت"

انا قلت "تحدد طول احد المتغيرات"

حسنا يمكن الجمع بين الجملتين بان الرقم الثابت الذي ينشئه الاسمبلر هو طول الstring

اي ان الامر الاول لتعريف الstring والثثاني هو نوع خاص من ال equate لتحديد طول الstring

VidIDStr   DB  'The installed video board is:'
LVidIDStr  EQU  $-VidIDStr
#10

لم تفهم قصدى

ما قصدته هو سواً كتبت

LVidIDStr  EQU  $-VidIDStr

او كتبت

LVidIDStr  EQU  30

الفرق الوحيد هو انك فى الحاله الاولى تطلب من الاسمبلر ان يقوم بعملية حساب حجم النص, وفى الحاله الثانيه قمت انت بعملية الحساب. ولو قمت بعل ملف تنفيذى وإستخدمت الطريقتين ستجد ان النتيجه متطابقه ولا يوجد اى فرق بين العمليتين.

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#11

شكرا جزيلا اخ احمد

اعتقد انني فهمتك الان

شكرا مرة اخرى

هذا الموضوع مغلق.