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

مشكلة مع الرياضيات

مغلق
بدأه عبد القادر طفي في 13 مايو 2004 · 14 رد · 3,689 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اخواني الكرام لدي مشكلة في برمجة العلاقات الرياضية بلغة الاسمبلي

علما الن المعالج المستخدم مسجلاته 8Bit فقط

على سبيل المثال اريد ان احسب "جيب زاوية ما"

Super Nova

#2

السلام عليكم

اليك قواعد الحساب بالنسبه ل sin و cos

Maclaurin series for sin & cos:
sin x=x-(x^3)/3!+(x^5)/5!-(x^7)/7!...
cos x=1-(x^2)/2!+(x^4)/4!-(x^6)/6!...

بستخدام هذه القواعد تحتاج فقط لعمليات الحساب العاديه, جمع, طرح, ضرب و قسمه.

والسلام

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

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

#3

شكرا لك ولكني لم افهم ماذا تعني "!"

Super Nova

#4

السلام عليكم

اتوقع ان جيب الزاويه تعنى sin x و بستخدام قانون Maclaurin series يمكنك تحويلها الى معادله على النحو الذى اوضحته سابقاً.

مثال :

sin 30=30-(30^3)/3!+(30^5)/5!.....

هذه المعادله تحتوى على جمع, طرح, ضرب و قسمه فقط, والتى يمكننا برمجتها بالاسمبلى بكل سهوله, المشكله ان لديك 8bit فقط لذالك انصحك بستخدام lookup table بمعنى انه يمكنك وضع قائمه بالاعداد التى تحتاجها فى الذاكره ثم إستدعائها عند الحاجه اليها.

والسلام

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

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

#5

شكرا استاذ احمد

حقيقتا انا اعاني كثيرا من هذه المشاكل

فهل تعرف احد المراجع الحاصه ببرمجة العلاقات الرياضية من خلال لغة الأسمبلي

Super Nova

#6

السلام عليكم

اخى الحبيب برمجة حساب المثلثات علي بروسسور ب 8bit سعب وذالك لانه لايمكن التعامل مع الارقام العشريه, مثلاً كيف يمكنك التعامل من pi والذى يعتبر من الاساسيات فى حساب المثلثات ؟

الحل الامثل هو إستخدام ال FPU والذى طورته شركة INTEL بالتعاون مع منظمة ال IEEE , وهو موجود ك بروسسر مستقل يسمى 487 و 387 او كجزء مدمج مع البروسسور 386DXو 486DX , البروسسورات من Pentium فمافوق فهى تحتوى نظام ال FPU .

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

والسلام

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

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

#7

السلام عليكم،

اخواني انتم اخبر مني في الاسمبلي وبخاصة الاخ احمد وخاصة انني لم استعملها منذ فترة طويلة - ولا انصح باستعمالها الا لمن يضطر لها ولكن انصح بتعلمها - الا انني احب الاضافة هنا .

اذا كان لدينا بروسسر 8 بت فان بالامكان عمل عمليات حسابية كبيرة بشرط توفر ذاكرة كافية هكذا اعتقد. وفي الحقيقة ربما تصل الى انشاء انتربرتر.

في حالة كهذه بروسسر 8 بت انت بحاجة الى انشاء Soft Stack مع ان كل البروسسرات لديها ستاك ولكن كثيرا من الستاك ليس عميقا. ثم انت بحاجة الى انشاء Functions 16 بت ثم انشاء 32 بت فنكشن نستخدم اثناءها ال 16 بت الذي انشأناه واذا احتجت تعمل 64 بت كذلك. وتعمل كذلك فنكشن لل (!) فاكتوريال الذي سئل عنه الاخ عبد القادر وكذلك فنكشن لل قوة ^ Power. وحتى PI تخزن في الذاكرة.

والصعوبة تكون في انشاء هذه الفنكشنز بالبداية ثم يتم اعادة استخدامها في برامج اخرى.

تم تعديل هذه المشاركة بواسطة عماد الخليل في 15 مايو 2004 في 20:28

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#8

السلام عليكم

انا ايضا اعتقد ان الاخ عماد على حق انا متأكد ان الانسان يمكن ان يجد الحل المناسب عندما يحتاج الى حل معين. مثلا لو اردت ان اعمل دالة وظيفتها ان تعبر عن النسبة التقريبية فيجب ان نسأل ما هي النسبة التقريبة هل هي فعلا 3.14 ام ان هنالك شكل اخر الجواب هنالك شكل اخر وهو 22/7 اي ان الدالة التي نريدها دالة تستقبل قيمة معينة عن طريق متغير معين او مسجل او stack وتقوم بضرب هذه القيمة بـ 22 وبعد ذلك تقسم النتيجة على 7 فنحصل على النتيجة الصحيحة مثلا في المسجل ax والباقي في المسجل dx واذا اردنا تحديد الخانات بعد الفاصلة فيمكن ذلك عن طريق ضرب الباقي في عشرة للقوة عدد الخانات وقسمة النتيجة على 7

وشكرا

#9

اخي عفيف ما المانع من تخزين PI في Array في الذكرة بكامل قيمتها 3.14159265 ولنفترض اننا نريد PI^2 الا يمكن حساب القيمة بالدقة المطلوبة؟ طبعا لاتسأل عن السرعة نحن نتحدث عن الامكانية. ساقوم بتخزين PI بصيغة ال BCD بالشكل التالي

314159265 F8

حيث F8 في هذه الحالة هي القوة 10^(-8) وهي بايت مخزنة في الذاكرة وتكون

من 0x00 الى 0x80 يعني 0 الى 128

ومن 0x81 وحتى 0xFF وتعنى -127 وحتى -1

يعني الرقم الصحيح BCD ورقم القوة HEX

بالنسبة للضرب تجمع الاسس وستحصل على 1F0 الواحد يعتبر overflow ويتم استخدام F0 فقط والتي تعني 10^ - 16

والان عليك ضرب الارقام 314159265 * 314159265 وكلا الرقمين في الذاكرة ولديك ال Index لهذين الموقعين. الا يمكن استجلاب بايت من كليهما واجراء الضرب ولو كان الضرب غير موجود نعمل لوب جمع. ويكون لدينا overflow يؤثر علي عملية الضرب التالية. هل برايكم ممكن اتمام العملية من هنا؟ ان عمل ال Functions الازمة سيؤدي الى حساب اي قيمة واي دقة تريدها وكلما تطلبت دقة اكثر كلما زدت في وقت المعالجة.

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#10

السلام عليكم

لا تنسى اخى عماد ان اكبر رقم يمكن تخزينه فى بيت هو 255 , لضرب او حتى إستخدمت لوب جمع, الرجستر لا يحتمل اكثر من 255.

لو اخذنا على سبيل المثال 314*314, الرقم 314 فى حد ذاته مشكله, هناك مكتبات خاصه لمثل هذه الارقام تسمى Big Number Libraray ولكنها للبروسسر 16 لابت و 32 بت, اما 8 بت الله اعلم إذا كان هناك اى حل لها.

والسلام

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

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

#11

اخي احمد انا ظننت اني قد وضحت الصورة، ربما ليس بالقدر الكافي. انا لا اقول انك ستضرب الرقم الصحيح كاملا دفعة واحدة بل ستاخذ القيمة من الخانة الاولى للرقم الاول مع القيمة من الخانة الاولى للرقم الثاني يعني 5 * 5 ويكون النتج 0x19 تقوم بتحويل هذا الرقم الى BCD ويكون 25 تكون ناتج اول ضرب العدد 5 والباقي 2 يرفع الى العملية التالية ليجمع بعد ضرب الخانات 5 * 6 وهكذا، وربما تحتاج للتحويل من BCD الى HEX وبالعكس من حين لاخر. وبالتالى فان اكبر عملية ضرب ستكون 9 * 9 يعني 0x51 اي 81 وهي اقل من 255. وربما ما اتحدث عنه هو كيفية انشاء هذه المكتبات بشكل مبسط. والا اخي احمد كيف تتم عمليات 32 بت ببروسسر 16 بت ولو كان الامر كذلك لكان اكبر رقم يمكن ان يحسبه ال 386 بدون ال 387 هو 2،147،483،648 وكيف اذا ستحسب ميزانية الولايات المتحدة حتي ايام ال 8086 ؟ ان بالامكان استخدام بروسسر 4 بت للقيام بعمليات 64 بت اذا توفر لنا Address و ذاكرة كافية. وكيف كانت الالات الحاسبة تحل عملياتها قديما ولم تكن البروسسرات الحالية موجودة. ولاتنسي ان منشأ البايت اصلا هو بت. فالطريقة تصبح بعمل سوفتوير بروسسر له ضعف او اربع اضعاف عرض الرجستر لل Hardware بروسسر.

بالنسبة لك اخي عبد القادر اذا كانت العملية تبدو طويلة او صعبة فلم لاتستخدم Compiler مثلا C ثم تستخدم Disassembler لاعادته للاسمبلى هل هذا تحايل؟

تم تعديل هذه المشاركة بواسطة عماد الخليل في 26 مايو 2004 في 02:46

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#12

السلام عليكم

بالتاكيد يمكنك تحويل الرقم 314748 الى BCD وتحصل بعملية الضرب التقليديه على الناتج, ولكن التحويل بين binary و BCD عمليه تاخذ وقت طويل جداً, وبالذات على برسسور 8 بت وبسرعة 16 MHz على اعلى تقدير.

لا تنسى ايضاً ان حجم الذاكره sigment لا يمكن ان يكون اكبر من 255 بت بالنسبة لبروسسر 8 بت , لذالك إذا كان البرنامج اكبر من 255 بيت فلا بد ان يقسم على عدة sigment و كذالك ال data , مما يطرنا الى إستخدام ال offset , وعلى ما اذكر فهذه الخاصيه غير متاحه فى البرسسر 8بت ,

الخلاصه : لايمكن برنامج code+data لحساب المثلثات فى برسسر 8بت و بذاكره مقدارها 255 بيت.

و لو إستخدمنا swap file فى ال Hard Disk يصبح ال code اكبر و المساحه المخصصه لل data اصغر.

والسلام

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

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

#13

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

اولا لا نقول الا اساتذتنا الاخ احمد والاخ عفيف والاخ chik ولا يمنع ان يناقش الطالب الاستاذ

اقتباس
ولكن التحويل بين binary و BCD عمليه تاخذ وقت طويل جداً

حسنا ممكن التعامل بال BCD وتفادي الثنائى وبنفس الطريقة التي شرحت. ويتم ادخال الارقام مباشرة ك BCD.

اقتباس
وبسرعة 16 MHz على اعلى تقدير.

لقد تغير الحال والان هنالك ميكروكنترولرات بسرعات 100MHZ وربما اكثر وبقدرة 100MIPS

اقتباس
لا تنسى ايضاً ان حجم الذاكره sigment لا يمكن ان يكون اكبر من 255 بت بالنسبة لبروسسر 8 بت , لذالك إذا كان البرنامج اكبر من 255 بيت فلا بد ان يقسم على عدة sigment و كذالك ال data , مما يطرنا الى إستخدام ال offset , وعلى ما اذكر فهذه الخاصيه غير متاحه فى البرسسر 8بت

اخي احمد معظم الميكروكنترولرز الحالية هي RISC وليست CISC وال RISC يستخدم مسار مختلف للذاكرة والبرنامج لذلك فان الذاكرة متصلة وليست مجزأة وكذلك البرنامج وهي حوالي 128KByte في كثير من الميكروكنترولرات وتصل الى واحد ميجا بايت وهذا كثير جدا.

اقتباس
الخلاصه : لايمكن برنامج code+data لحساب المثلثات فى برسسر 8بت و بذاكره مقدارها 255 بيت

اخي احمد لو كان الحال كما ذكرت اوافقك بالصعوبة وليس بالاستحالة ولكني مقتنع تمام القناعة انه بالامكان عمل كامل الفنكشنز - جيب جتا ظل ظتا الخ - لآلة حاسبة متقدمة ب مايكروكنترولر من الموجود حاليا بالسوق.

تم تعديل هذه المشاركة بواسطة عماد الخليل في 26 مايو 2004 في 23:14

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#14

السلام عليكم

الاخ الحبيب الغالى عماد انا كنت اتحدث عن الميكرو كونترولر ماقيل 8086 ولم اكن اعلم انه مازال هناك تصنيع لمكروكونترول 8بت بهذه السرعه و الامكانيات المطوره.

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

والسلام

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

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

#15

اخي احمد اعلم ان عملكم بالاسمبلي مركز على البنتيوم والحقيقة انني لا اعرف عن اسمبلي ال PC تقريبا الا اللغة بمعناها الشمولي فانا لم اطلع على بنية البتيوم ولا ماقبله وكل ما عملته بالاسمبلي على ال PC هو انه كان عندي لعبة باكمان ايام الدوس وكانت مغلبتني ومش عارف اخترق مستوي معين فجلست ادخل واعدل بدون علم بلغة الالة مباشرة واخرج وارى النتائج حتى استطعت ان اجتاز مراحل اللعبة ويبدو انني غيرت بمحض الصدفة الشروط وظهرت الوان غريبة للعبة و جبت سكورات تمام. الا انني تعاملت مع بروسسرات مثل Z80 وعملت عليه مشروع (ليس مشروع جامعة) وكذلك استخدمت بروسسر 80251 من شركة انتل اول ما نزل وعملت عليه ايضا مشروع وكلها كانت بالاسمبلي وال 80251 هو 8051 ولكن بمواصفات 25X السرعة لل 8051 وكذلك وجود رجسترات 32 بت داخله رغم انه 8 بت. وحاليا انتقلت الى عائلة PIC18F حيث ان له دعم اكبر ومخارج اكثر وكذلك الذاكرة المبنية داخله بالفلاش اي تبرمجه دون الحاجة لنزعه من اللوحة وهذه هي حال معظم الكنترولرات الحالية هذه الايام. لم استطع ان انهي مشروع ال 80251 وذلك بسبب الاسمبلر حيث ان البرنامج كان كبيرا لدرجة ان اي سطر اضافي كان الاسمبلر يعطيني اخطاء لا حصر لها ولهذا توقفت عنه.

ارفق نسخة من برنامج الاسمبلى الخاص بالبروسسر 80251 وذلك لمن احب الاطلاع على 8 بت اسمبلي. ويمكن فتحه بال Notepad او Wordpad

PLC251.txt

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

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

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