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

بعض أسئلة في جمع عددين ست عشريين

بدأه طالب أولي في 19 مايو 2009 · 9 رد · 1,004 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

من فضلكم مساعتدي

مطلوب مني برنامج في 8086 ادخال عددين ست عشريين وتخزينهم في الذاكرة كل عدد في مكان وطول كل عدد 10 بايت وجمعهم وحفظ الناتج بطول 11بايت في مكان اخر في الذاكرة

اتتني مساعدة ان الحل يكون باستخدام اللوب

بس سعة كل مكان في الذاكرة 4بايت كيف اخزن فيها 10 بايت والناتج يكون 11بايت

ساعدوني الله يسعدكم في الدنيا والاخرة

#2

الذاكرة ليس لها حد حتى تقول أن سعة كل مكان هو 4 بايت، أظن أن سبب قولك هذا هو فهمك لاستخدام DD للتصريح عن متغير..

المهم، تستطيع أن تقوم أخي بحجز 10 بايتات بالطريقة التالية، كما تفعل مع array

param	db	10 dup (0)

بهذا تحجز 10 بايتات متسلسلة وتضع فيها قيمة ابتدائية 0

موضوع أن يكون طول العددين 10 بايتات عليك أن تتأكد هل هذا هو الحجم الأقصى المسموح أم يجب أن يكون فعلياً طوله 10 بايتات على الأقل

لن يكون لديك مشكلة overflow مع 11 بايت لأن أقصى عدد ممكن تدخله بصورة hex وطوله 10 بايتات هو FFFFFFFFFFh ولو جمعت له نفس القيمة سيكون الناتج 1FFFFFFFFFEh وهو 11 بايت.

Do as I say, not as I do

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

#3

مشكور الله يجزاك خير على ردك السريع

لكن اان مبتدى ممكن تزيدني في الشرح او تزودني ببرنامج مشابه كمثال .

ومعليش تحملنا

#4

حاول

Do as I say, not as I do

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

#5

الله يعطيك العافية

الا ن عرفت كيف ادخل الارقامللذاكرة

لكن كيف اجمعهم واضعهم في 11 بايت وفي مكان جديد

الله يبارك فيك تحملنا

#6

السلام عليكم

مادري لكن بضع توضيح اذا ممكن يساعدك

عشان اجمع عددين في

mov esi,0

add eax,[esi]

add esi,4

add eax,[esi]

لكن هل هذا يساعد وشكرا

#7

جزء الأرقام إلى ثلاث أقسام

1234567890

ثم اجمع كل جزء مع ما يقابله من الرقم الآخر، ولو كان هناك carry سيظهر لديك فوراً في النتيجة، هذا الحمل تضيفه للمجموعة الثانية، وهكذا.. حتى انتهاء آخر مجموعة.

قم بحجز متغير اسمه carry مثلاً بقيمة افتراضية 0، خزن فيه ناتج الحمل الأول (إن حدث)، ثم قم بإضافته للمجموعة الثانية حتى لو كانت قيمته صفر بالتالي توفر على نفسك تحديد حدوث حمل من عدمه، وانقل الحمل إليه (إن وجد وإن لم يوجد انقله كـ 0 حتى تزيل الحمل الأول)، واجمع قيمته مع آخر مجموعة، ولن يكون هناك حمل في النهاية كما أوضحت سابقاً.

انتبه أن قيم المسجلات تخزن بشكل مقلوب في الذاكرة حتى تبقى صحيحة عند تنفيذ العمليات عليها!

اقتباس
مادري لكن بضع توضيح اذا ممكن يساعدك

عشان اجمع عددين في

mov esi,0
add eax,[esi]
add esi,4
add eax,[esi]

المثال خاطئ، ويسبب كارثة في البرنامج، لن أذكر السبب

سأترك لك اكتشافه وهو واضح جداً.

تم تعديل هذه المشاركة بواسطة Xacker في 21 مايو 2009 في 13:10

Do as I say, not as I do

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

#8

السلام عليكم

عذرا لكن التصحيح

mov esi,offset param
mov eax,[esi]
add esi,4
add eax,[esi]

تم تعديل هذه المشاركة بواسطة برمجة حاسب في 21 مايو 2009 في 12:35

#9

نعم المثال أصبح صحيح الآن

Do as I say, not as I do

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

#10

شكراً لكم|

على تجاوبكم السريع

مواضيع مشابهة