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

اسئلة الرجاء احلها

مغلق
بدأه مؤيد أبوجابر في 25 مايو 2004 · 17 رد · 2,788 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

Q1)Write complete assembly language programs of the following tasks. Your programs should be complete with headers, declarations, and proper ending of the program.

1) Write a program to compute sum of odd integers: 1+3+….+N The final sum should be stored in memory.

2) Write a program to count the number of bits in a 16 bit register that are 1s. The result should be stored in memory.

3) Write a program to calculate and list the first 20 values of Fibonacci series: (1,1,2,3,5,8,13,…) Except for the first two numbers in the sequence, each number is the sum of the previous two numbers.

4) Write a program to add two 3-byte ASCII numbers, ASCVALUE1 and ASCVALUE2,And produce a 4-byte sum, ASCTOTAL.

Q2)Write sequence of assembly instruction to do each of the following tasks:-

1) Multiply the contents of AX by 10 without using MUL or IMUL.

2) Divide the contents of AH by 4 without using DIV or IDIV.

3) Exchange the contents of AH and AL without using XCHG.

الرجاء حل هذه الاسئله

في اقرب وقت ممكن

وشكرا

#2

السلام عليكم,

الأخ أبو جابر : لهذا المنتدى طريقة لطرح الأسئلة وعدم طرح التمارين الدراسية وطلب حلها هنا. إنما يمكنك أن تعطي محاولتك ولو تكون بسيطة وإن شاء الله تجد المساهمة من جميع الإخوان لحل المشاكل التي تعترضك حتى تتمكن من فهم الأجوبة التي يقدمها لك الإخوان وحتى لا نعتمد على الأجوبة الجاهزة والتي ربما لا نفهمها.

في انتضار محاولتك أقول لك إلى اللقاء.

#3

يا اخ

chik اذا كنت انا مش عارف اسوي اشي فيهن

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

في الاردن كلها مافي حدا بعرف يشرحها منيح

وشكرا

#4

السلام عليكم,

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

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

- إذا أردنا جمع الأعداد الفردية من 1 إلى N يمكن أن نستعمل الطريقة التالية :

نفترض أن N هي دائما على الأقل أكبر أو تساوي 1 . نضع في ax القيمة 1 وهي بداية الجمع وسنزيد فيه كل مرة العدد الفردي الذي يليه . نضع في bx مثلا قيمة العدد N وفي cx القيمة 1 في الأول وهذا سيشير إلى الأرقام الفردية التي تهمنا وسنقوم فيما بعد في كل مرة ب : inc cx inc cx هكذا مرتين وهذه ستعطينا الرقم الفردي الموالي ونعلم أن الأمر inc cx فقط سيزيد 1 إلى قيمة cx فهكذا إذا زدناه مرتين نحصل على الرقم الفردي التابع له . وبعد هذا نقارن قيمة cx مع قيمة bx التي تساوي قيمة العدد N فإذا كان أكبر منه نتوقف وفي الحالة الأخرى نضيف قيمة CX إلى قيمة AX وهكذا ففي الأخير ستصبح عندنا النتيجة الرغوبة في AX ومن ثم يمكن تخزينها في مكان ما في الذاكرة .

mov ax,1
mov bx,N
mov cx,1
Repeat:
inc cx
inc cx
cmp cx,bx
ja TheEnd
add ax,cx
jmp Repeat
TheEnd:
mov Mem,ax

هذا فيما يخص السؤال الأول والثاني سنتعامل معه كما يلي :

نضع العدد من 16 بت الذي نريده في الرجستر ax مثلا ونضع في الرجستر bx القيمة 0 وهو الذي سيحصل في النهاية على النتيجة أي عدد البتات التي تكون تساوي 1 ومن بعد سنقوم بعمليت الدوران إلى اليسار للرجستر ax وسنرى قيمة العلم Carry ونعلم أنه سيكون 1 إذا كانت قيمة البت الذي دار عنده هي 1 و 0 في الحالة الأخرى . ولهذا ففي كل مرة يكون فيها العلم 1 نزيد 1 إلى قيمة bx ونقوم بهذه العملية 16 مرة حتى نمر على جميع البتات والتي عددها 16 .

mov ax,number
xor bx,bx
mov cx,16

TheLoop:
rol ax
jnc More
inc bx
More:
loop TheLoop

mov Mem,bx

أتمنى أنه لم يزهق إلي خطء ما لأنه ليس لدي الإمكانية هنا لتجربة البرنامج وكما أتمنى أن يكون مفهوما وسأكون أنا وباقي الإخوة رهن الإشارة لكل تساؤل أو استفسار.

إلى اللقاء.

#5

بصراحه اخوي

chik ما قصرت بصراحه انا كمان حاولت في السؤال الثالث والاخير وللافاده سوف اضع

طيقة الحل للسؤال الثالث

وشكرا

mov ax,00
move bx,01
mov cx,12
mov dx,00
L10:
add ax,bx
mov bx,dx
mov dx,ax
loop L10

بصراحه اخوي chik تشكرك من كل قلبي لجهودك معي

وإن شاء الله لظل وره الاسمبلي وافهمها

وطالب منكم انت تظعوا برامج وحلها ليستطييع الشخص فهمها و

وشكرا

#6

السلام عليكم,

في هذا المنتدى بعض الإخوان يقترحون دروسا في مادة الأسمبلي سواءا منها 16 أو 32 بايت كما يحتوى على عدة أمثلة بكودها الكامل مع شروحها.

أنتمنى دائما أن نزيد في المواضيع ولكن هذا يرتبط بمشاركة الجميع.

إلى اللقاء.

#7

السلام عليكم

اود ان اقدم بعض الحلول لبعض الاسئلة:

ضرب المسجل ax بالقيمة 10 .

ان عملية الضرب عبارة عن عملية جمع اي انه يجب ان نجمع فحوى المسجل AX عشر مرات

الحل:

mov bx,ax

mov cx,10

mov ax,0

next_add:

add ax,bx

loop next_add

بالنسبة لقسمة المسجل ah على 4

mov cl,2

sar ah,cl

ملاحظة النتيجة النهائية في ah ولكن بدون باق

بالنسبة لتبديل القيم بين المسجلات ah و al

هنالك عدة طرق منها

الطريقة الاولى

mov bl,ah

mov ah,al

mov al,bl

الطريقة الثانية:

xor ah,al

xor al,ah

xor ah,al

الطريقة الثالثة:

mov bx,ax

mov cl,8

shr ax,cl

shl bx,cl

or ax,bx

الطريقة الرابعة:

mov cl,8

ror ax,cl

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

#8

بصراحه اخوي عفيف

والله ما قصرت

كفيت وفيت كمان

وبصراحه مش عارف شو احكي

منتدى الي بيكون من الصفر بسير بمستوى احسن بكثير من الي كان عليه

وشكرا والف شكرا إلك اخي عفيف وللخ

chik

#9

السلام عليكم

نحن في خدمة الناس الطيبين وهذا واجب علينا

#10

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

اجا الرد متاخر اخي

chik ولكن بعد مراجعه معلوماتي لان اليوم علي امتحان النهائي لهذه الماده

فوجد في جوابك الاول طريقه لحل السؤال

ولكن اذا كان الارقام ماشيه باتسلسل

وهي طريقه صحيحه اذ كان كذالك

اوكي ولكن

حاب اني اوريك في تقدم ملحوظ في مستواي

وهو الاجابه على سؤالي اذا كان عدد مستسل ام لم يكن كذالك

والاجابه

يجب ان نظع قيمة الاعدا في ال ax

ومن ثم نقسمها على 2

ونقرارن بين ال dx

والصفر

فإذا كان الناتج له باقي اذ يكون فردي واذا كان الناتج ليش له باقي فإنه بالتاكيد

سيكون زوجي

وبعدين نضيف

الرقم على رجيستر ويجب ان يكون قيمة الريجستر صفر

ونسوي العمليه هذا على جميع

عناصر المصفوفه

فشو رايك

بطريقة الحل هذه

واذا كان لديك الرغبه في مشاهدته

بالكود فانا سوف اضيفه على حسب رغبتك

وشكرا

#11

السلام عليكم

الطريقه الافضل لمعرفة إذا كان الرقم فردى او زوجى هى بمقارنة اول بت فى الرقم, إذا كان اول رقم يساوى 1 إذاً الرقم فردى وإذا كان يساوى 0 فالرقم زوجى:

xor ax,1
jz odd
jmp even

odd: 
;HERE IS THE CODE FOR ODD NUMBER
:even
;HERE IS THE CODE FOR EVEN NUMBER

والسلام

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

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

#12

السلام عليكم

بالنسبة لحل الاخ احمد فهو الحل الاقصر والاسرع والافضل ولكن اخي احمد لقد كتبت عن طريق الخطأ xor ax,1 بدلا من and ax,1 و jz بدلا من jnz

الحل النهائي

and ax,1

jnz odd

jmp even

:odd

HERE IS THE CODE FOR ODD NUMBER;

jmp finish

:even

HERE IS THE CODE FOR EVEN NUMBER ;

:finish

اما بالنسبة لحل الاخ مؤيد انا لا ادري لماذا المقانة بين dx والصفر لانه يمكن ان نضع القيمة 2 في مسجل بحجم 8 بتات مثلا bl ثم نقوم بعملية القسمة وبعدها نقارن المسجل ah مع صفر واذا كان صفرا فالعدد زوجي والا فالعدد فردي

اما اذا اردت ان تقارن المسجل dx عليك ان تنتبه للامور التالية:

1.يجب ان تضع المقسوم في المسجل ax

2. يجب ان تتأكد قبل عملية القسمة ان المسجل dx=0 . وذلك بمساعدة مثلا الامر

mov dx,0

3.يجب ان تضع القيمة 2 في مسجل بكبر 16 بت مثلا bx

4. ان تستعمل div bx

5.نقارن dx مع صفر

ارجو ان اكون قد اسهمت في توضيح الامور

وشكرا

#13

السلام عليكم

نصيحه للجميع لا تحاولو كتابة برنامج الساعة الخامسه صباحاً , بعد العوده من العمل.

شكراً الاخ عفيف على التصحيح, وبارك الله فيك على مجهوداتك الملموسه فى المنتدى.

الحل الامثل هو بستخدام BT اخى عفيف, حتى لا يتاثر محتوي AX لنتمكن من إستخدامه مرة اخرى.

BT ax,1
JC odd
even:
;HERE IS THE CODE FOR EVEN NUMBER
JMP done
odd:
;HERE IS THE CODE FOR odd NUMBER
donr:

والسلام

تم تعديل هذه المشاركة بواسطة احمد غريب في 31 مايو 2004 في 13:06

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

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

#14

السلام عليكم

اخي احمد انت على حق الامر bt لايؤثر على المسجل ولكن هل جميع المعالجات تتعرف على هذا الامر

اقتراح الامر test لا يؤثر على المسجل وجميع المعالجات تتعرف عليه

test ax,1

jnz odd

jmp even

:odd

HERE IS THE CODE FOR ODD NUMBER;

jmp finish

:even

HERE IS THE CODE FOR EVEN NUMBER ;

:finish

#15

السلام عليكم,

فعلا اقتراح الأخ أحمد هي الطريقة الأفضل لمعالجة هذا التمرين حيث نعلم أن كل رقم زوجي في تحويله إلى عدد ثنائي ينتهي بالصفر أو نقول أن البت الأول على اليمين يساوي 0 بينما العدد الفردي يجب أن يكون هذا البت هو 1.

فقد اقترح الإخوان جملة من الحلول والأخ عفيف على حق فيما يخص الأمر BT حيث هذا الأمر ظهر ابتداءا من 386 وهنا يبقى الإختيار إذن حسب المقصود وأضن أن الآن معضم الحواسيب من النوع الجديد وربما بدأت 386 في الإندثار.

وفي الحالة الأخرى يكون اقتراح الأخ عفيف هو الأنسب .

وأريد أن أقول للأخ أحمد حاول على صحتك .الخامسة صباحا وأنت لا زلت صاحي icon6.gif

إلى اللقاء.

#16

السلام عليكم

اشكر لاجميع بصراحه

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

بدي سنين حتى اوصل الكم

وإن شاء الله

نواصل مواصيلكم في هذه اللغه وشكرا للجميع

#17

السلام عليكم,

أخي أتمنى لك أن تصل إلى أسمى الدرجات .

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

إلى اللقاء.

#18

السلام عليكم

اقول للاخ الحبيب الغالى chik

ما اطال النوم عمراً ..... وما قصر فى الاعمار طول السهر .

الاخ مؤيد بالممارسه إن شاء الله ستعرف كل هذه الاشياء.

وتحيه خاصه للاخ عفيف على مجهوداته الملموسه فى قسم الاسمبلى.

والسلام

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

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

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

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