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

كيف تتم عملية الضرب باستخدام الأسمبلي؟؟؟؟

مغلق
بدأه أحمد جندية في 11 ديسمبر 2008 · 11 رد · 6,870 مشاهدة · في الميكروكنترولر (المتحكم) و الدوائر الرقمية و المنطقية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

ياشباب كيف الحال .. عضو جديد ان شاء الله بفيد وبستفيد منكم

الآن كيف ممكن أعمل عملية ضرب رقمين كل واحد مكون من خانة واحدة , وكذلك عملية ضرب رقمين كل رقم مكون من خانتين ..

أيضا عملية القسمة

إذا في حد عندو ماكرو مايبخل علينا فيه :wink:

المهم أنا حاولت أستخدم فكرة الضرب عن طريق الجمع زي الكود التالي ..

MOVF 0DH,W

DECFSZ 0CH,F

ADDWF 0DH,F

MOVF 0DH,PORTA

طبعا القسمة عملية طرح .. لكن بصراحة مازبطت هادي الفكر ..

بالإضافة لإني متوقع انو ماتزبط في حالة رقم من خانتين ...

أرجو انو نناقش الحكاية ومستعد لأي استفسار ..

#2

ابحث عن

MUL

Be Happy

^_^

#3

قصدك ابحث في برنامج الأسمبلر نفسه ؟؟؟

بستعمل أنا برنامج mplab

أرجو التوضيح أخي الكريم ومشكور على المرور

#4

ابحث عن "التعليمه" mul في جووجل

Be Happy

^_^

#5

السائر في هذا القسم هو برمجة معالجات Intel

وانت تسال عن معالج اخر، وكونك ذكرت MPLab فانت تحاوب برمجة PIC

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

d4baa0.gif
#6

اعتقدت انو الفكرة واحدة في المعالجات ..

عالعموم الموضوع بالفعل في قسم المايكروكنترولر أخ عبد العزيز

بس معقول مفيش حد في المنتدى مرت عليه فكرة الضرب دي ..

أنا فكرتي متأكد انها صح بس في شوية مشاكل علاجها صعب شوية فحبيت أشوف قلت يمكن ألاقي فكرة أسهل أو أدق ..

#7

الاخ السائل انت ممكن تعمل ضرب وقسمه على 2

وهذا عن طريق عمل ازاحه يمين او شمال

للضرب

RLF

BIDEAR =5

همسح C

لانه ممكن يكون محمل من اى عمليه سابقه

الان المتغير BIDEAR بيساوى 5

------------------

BCF STATUS ,Cمسحت قيمه C

RRF BIDEAR,1ازاحه المتغير BIDEARالى اليمين خطوه بزلك تم ضربه فى 2

00000101القيمه الاولى 5

00001010القيمه الناتجه بعد الازاحه هى 10

والقسمه العكس

اتمنى انها تكون وضحت

ولو محتاج اى توضيح اكتر

ده اميلى

GOL2500@YAHOO.COM

تم تعديل هذه المشاركة بواسطة bidear في 13 ديسمبر 2008 في 07:05

#8

أخ bidear عملية الضرب والقسمة مش على 2 أو في 2 .. المقصود ضرب رقمين مثل 5*6 أو قسمة 9/3 .. وهكذا

ايضا رقم من خانتين مثل: 13*15 .. وكذلك القسمة ..

#9

السلام عليكم يا اخي أحمد ...انا راح اعطيك الحل في عملية الضرب بأستخدام عملية الجمع ...بلغة الاسنبلي للمعالج من نوع 8085 وهي تفس الفكرة لباقي لغات الاسنبلي وان اختلفت التعليمات قليل .

فكرة الحل بالنسبة لضرب عددين من خانة وحدة :-

1/ اولا ستحتاج لأستخدام ثلاثة مسجلات (registers) .

* واحد لخزن العدد الأول .

* واحد لخزن العدد الثاني (والذي سوف يعمل هذا المسجل كعداد) .... هذة النقطة سوف تفهمها في نفس البرنامج إن شاء الله .

* واحد لخزن عملية الجمع في كل مرة .(بما انني اشرح عن المعالج 8085 فسيكون المسجل الذي تخزن فيه النواتج عادة هو المسجل A ).

2/ ستحتاج لأستخدام تعليمة القفز المشروط (conditional jump) .

* البرنامج هو كالتالي :-

بسم الله ...لنفترض أنك تريد ضرب العددين 5*3 والناتج هو 15 . لتحويلها للجمع سوف نقوم بجمع العدد 3 مع نفسه خمسة مرات او نجمع العدد 5 مع نفسه ثلاثة مرات وهو الافضل هنا حتى نقل من زمن عمل البرنامج على الرغم من صغر البرنامج هنا لكن تعتبر هذة التفاصيل الصغيرة ذات اهمية كبيرة للمبرمج في اي لغة كانت ...وهي جعل زمن تنفيد اي برنامج اقل ما يمكن . عموما فلنذهب للبرنامج .

mov A,00h ------------- هذا المسجل الذي سوف تتم في عملية الحفظ في كل مرة يتم فيها جمع العدد نفسه .

mov B,05h-------------- العدد الأول والذي سوف تتم عملية جمعه مع نفسه ثلاث مرات

mov C,03h-------------- هذا هو العدد الثاني لكن هنا نحن نتعامل معه وكأنه عداد .

xxxxh : add B --- هنا تتم عملية الجمع وهي كالتالي ADD B = A+B .

dcr c------------- هنا سوف يتم تنقيص المسجل الC بقيمة عددية واحدة (أي تنقص منه واحد بس) .

jnz xxxxh --------------هنا يتم التحقق من الاعلام (STATUS FLAGE) والعلم الذي سوف يتم التحقق منه هنا هو ZERO FLAGE ZF فأذا

كانت قيمته 1 لن تتم عملية القفز هنا . أما اذا كان يحتوي على 0 فسوف تتم عملية القفز للسطر الذي تم تحديده مسبقا من قبل

المبرمج (xxxxh)

HLT نهاية البرنامج

* نقاط توضيحية :

- بالنسبة لحفظ النواتج في المسجل A دائما ...وهو بسبب كون المعالج 8085 يعمل بهذة الطريقة .

- في السطر الأول قمنا بوضع القيمة 00h للمسجل A وهي بسببب التأكد من خلو المسجل A من اي قيمة سابقة كان محتفظ بها من عمليات سابقة .فلو كان محتفظ بقيم سابقة سوف يكون الناتج خاطء على الرغم من ان البرنامج طريقة عمله صحيحة 100 % .

- بالنسبة للقفز المشروط في هذا البرنامج والذي كانت عملية القفز فيه تعتمد على العلم ZF . سبب اختيار هذا العلم هو أن القيمة التي يحملها فيه تعتمد على الناتج الذي يحتويه المسجل في السطر الذي قبله والمسجل الذي كان قبله هو المسجل C وقد تمت فيه عملية تنقيصه بواحد . الان العلم ZF سوف يتحقق من المسجل الذي قبله فلو كان يحمل قيمة غير الصفر سوف تكون القيمة التي يحويها العلم ZF هي 0 واذا كان المسجل الذي قبله يحتوي على قيمة الصفر فسوف يكون القيمة التي يحويها العلم ZF 1 .

أعتقد أنه يكفي الشرح إلى هنا ...لا اريد تعقيد الامور اكثر من ذلك .....

بالنسبة لعملية ضرب رقم من خانتين فهي نفس الفكرة ولكن هنا سوف يزيد وقت عمل البرنامج .

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

اخوكم

وسام الكوكو

1230119258.jpg

#10

عفوا ...بس عندي تعديل في احد التعليمات في نفس البرنامج (mov) بدلتها بـ (mvi) وهي لنقل البيانات المرادة إلى اي مسجل بشكل مباشر .

mvi A,00h

mvi B,05h

mvi C,03h

xxxxh : add B

dcr c

jnz xxxxh

1230119258.jpg

#11

انت عايز تضرب كم بت في كام بت ؟! !

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

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

#12

بســم الله الـرحمــن الرحيــم

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

لك ما طلبت أخي الكريم برنامج ضرب 8bit*8bit طبعا الناتج يكون من 16bit

mulcnd   equ  09;تهيئة المضروب ثماني الخانة
mulplr	equ  10;تهيئة المضروب فيه ثماني الخانة
H-byte  equ  12;تهيئة البايت العالي لنتيجة الضرب
L-byte  equ  13;تهيئة البايت الأدنى لنتيجة الضرب
cont	equ   14;تهيئة عداد حلقة
same   equ   1;تحديد متحول وقيمته الإبتدائية 1
;===========================
;بداية روتين الضرب
mpy-s  clrf   H-byte;تهيئة سجلات النتيجة بتصفيرها
		  clrf   L-byte;تهيئة سجلات النتيجة بتصفيرها
		  movlw  8
		  movwf  cont;تحميل العداد بالقيمة 8
		  movf	mulcnd,w; تحميل المضروب في المراكم
		  bcf	  status,c ; تصفير علم الحمل
loop	 rrf	   mulplr,f  ; تدوير المضروب فيه
		  btfsc   status,c  
		  addwf  H-byte,same
		  rrf	   H-byte,same
		  rrf	   L-byte,same
		  decfsz cont,f
		  goto   loop
		  retlw   0

سبحان الله وبحمده .. سبحان الله العظيم

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

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