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

هل من مجيب ........ سؤال صغيرون ؟

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

السلام عليكم

عندي سؤال

يعني بحكم قلة خبرتي في الأسمبلي

حاولت اني اجمع عددين وأخلي البرنامج يسويلي مخرجات

لناتج بس ماعرفت

إذا حطيت المخرجات يطلعلي سهم ولا وجه وخرابيط ثانية

و بعد هذي المشكلة مع الضرب والقسمة

و الدكتور الي عندنا ماعلمنا حتى وشلون نطبق برنامج

وهو وجه طالب منا برنامج يسوي المتوسط الحسابي

انا كتبته صح بس المشكله الي ذكرتها قبل عكرت مزاجي

وقلت مالي إلا الله ثم منتدانا يحللي المشكلة

فلا تبخلو علينا بالعلم ولكم كل الشكر والعرفان

اخوكم آســــــــــــــــر

#2

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

اخي عليك ان تعلم بان المخرجات حتى تظهر على الشاشة يجب ان تكون بشكل رموز

اي انه لا يمكن ان تطبع العدد 8 على الشاشة الا اذا حولته الى الشكل الصحيح وهو

8 عبارة عن 38 بالميزان 16 . بالاختصار يجب ان تضيف القيمة 48 عشري على النتيجة او 30 بالميزان 16 وان تضع الرمز المراد طباعته في المسجل dl وانت تضع في في المسجل ah القيمة 2 ثم تطلب int 21h

مثال :

mov al,6

mov bl,2

add al,bl

mov dl,al

add dl,30h

mov ah,2

int 21h

مقطع البرنامج السابق يطبع على الشاشة النتيجة 8

ملاحظة المشكلة عندما تكون النتيجة اكبر من 9 عندها يجب ان تقسم النتيجة الى خانات وتطبع كل خانة لوحدة .

بالنسبة للقسمة

هنالك انواع

أ.قسمة الاعداد الموجبة ب.قسمة الاعداد الموجهة (السالبة والموجبة)

قسمة الاعداد الموجبة فقط تستخدم DIV

هنالك شروط

1-القسمة على بايت (byte )

-ضع العدد المراد قسمته في المسجل AX وفقط هذا المسجل

-ضع المقام الذي تريد ان تقسم عليه في مسجل او متغير بطول 8 بتات (byte)

-استخدم الامر div

-خارج القسمة الصيح موجود الان في المسجل al والباقي في المسجل ah

مثال: قسم العدد 9 على 2

الحل:

mov ax,9

mov bl ,2

div bl

بعد هذا المقطع

al=04

ah=01

اما اذا اردت ان تقسم عدد على word (16 بت)

هنا يجب ان تضع العدد المراد قسمته في المسجلات DX:AX أي انك تنظر الى المسجلين كانهما مسجلا واحدا بطول 32 بت.

الذي نريد ان نقسم عليه نضعه في مسجل بطول 16 بت

الناتج الصحيح يكون في المسجل AX والباقي في المسجل DX

مثال:

قسم العدد 500 عشري على 16 عشري

الحل

Mov dx,0

Mov ax , 500

Mov cx,16

Div cx

الناتج الصحيح يخزن في المسجل ax والباقي في المسجل DX

بالنسبة لقسمة الاعداد الموجه نفس الشروط ولكن مكان الامر DIV نسجل الامر idiv

اخي يجب ان اذهب الان الى عملي عندما اعود سوف اشرح لك امر الضرب.

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

#3

الله يعطيك العافيه يا أستاذ عفيف

#4

الله يجزاك كل خير ووفقك يا أخ afeef

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

أخوك آســــــــــــــر

#5

السلام عليكم

لا شكر على واجب

بالنسبة للضرب نستعمل الامر MUL لضرب الاعداد الموجبة فقط والامر IMUL لضرب الاعداد السالبة والموجبة. ولكن مع مراعاة الشروط التالية:

يمكن ان نضرب بايت ضر ب بايت (byte*byte)

-عليك ان تضع احد العددين في المسجل AL وفقط هذا المسجل

-ضع العدد الثاني في متغير من نوع بايت او في مسجل بطول 8 بتات

-نفذ الامر mul أو imul حسب السؤال

مثال: اكتب مقطع برنامج يضرب العدد 3 بالعدد 2

الحل:

mov al,3

mov bl,2

mul bl

النتيجة تخزن في المسجل AX

يمكن ضرب كلمة (word) ضرب word

-ضع احد الاعداد في المسجل AX

-ضع العدد الثاني في متغير من نوع word او في مسجل بطول 16 بت

-استخدم mul أو imul

النتيجة تخزن في المسجلات DX:AX

اي يمكن ان ننظر الى المسجلين كانهما مسجل واحد بطول 32 بت

مثال : اكتب مقطع برنامج يضرب العدد 1210 بالعدد -8

mov ax,1210

mov bx,-8

imul bx

النتيجة تخزن في المسجلات DX:AX

#6

ما قصرت اخوي afeef

وأشكرك على جهودك

بس انا عندي مشكلة انت ما تطرقت إليها إلا بشيء يسير

بودي انك تساعدنا فيها

المشكلة أنه إذا جمعت اكثر من عدد وطلع الناتج عشرة وما فوق

فكيف اطبع هذا العدد

لأني الصراحة حاولت وجبت جدول اسكي بس ما أفلحت

يطلع عند رموز مثلاً

اتمنى منك الإجابة

تحياتي آســــــــــــــــــــــر

تم تعديل هذه المشاركة بواسطة آسر في 4 مايو 2004 في 11:50

#7

يا شباب وينك

عطونا حل الله يجزاكم خير

#8

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

إن مشكلة إظهار الأرقام هي من بين المشاكل التي تتعرض مبرمج الأسمبلر عند بدايته لأنه نعرف فقط كيف نظهر على الشاشة أكواد آسكي فقط. ولهذا الغرض إذا أردنا أن نظهر عددا فيجب أولا تحويله إلى آسكي.

إذا كان الرقم أقل من 10 فهذا سهل إذ يكفي أن نزيد لهذا العدد الرقم 30 هيكس ليتحول إلى الكود الأسكي الخاص به أما إذا كان يتكون من عدة أرقام مثلا نريد أن نكتب الرقم 5482 فهنا يجب تقسيم هذا العدد إلى الأعداد التي تكونه وتكون أقل من 10 أي يجب أخذ الأرقام 2 و 8 و 4 و 5 كل واحد على حدى ونزيد لكل واحد الرقم 30 هيكس لتكون عندنا جملة مكونة بالرقم الذي نريد وحين نظهرها على الشاشة فهناك لا فرق بين جملة أو عدد.

لكي نتمكن مما سبق هناك عدة ألغوريثمات متفاوتة التطوير لهذا الغرض ولكن يمكن أن نقوم بها في الأول باتباع الطريقة البدائية والسهلة . فحين يكون عندنا العدد 5482 كما ذكرنا نقسمه على 10 وسيكون عندنا الرقم X=548 - هنا القسمة تكون حقيقية - نضرب مرة أخرى x في 10 ويكون عندنا العدد 5480 ولو نقوم بنقص العدد الأول بهذا الأخير سنحصل على العدد الأول المكون لرقمنا أي 9 .نأخذ مرة أخرى الرقم X=548 ونقوم بالعملية كما سبق أي نقسم على 10 ويعطينا 54 ونسجله مرة أخرى في X ونظرب مرة أخرى في 10 وننقص لنحصل على 8 ونعاود الكر مرة أخرى حتى نمر على جميع الأرقام المكونة للعدد الذي نريده.

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

/index.php?showtopic=35405

أتمنى لكم التوفيق في عملكم وإلى اللقاء.

#9

شكرا لك اخوي chik

و الله ما قصرت

بس ما تحس ان الطريقة هذي طويلة

يعني ما فيه طريقة اقصر منها

اخوك آســـــــــــــــــر

#10

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

هي بالفعل قد تبدو الطريقة شيء ما مملة ومتعبة ولكن يجب أن نعلم أننا حين نبرمج فقد لا نعاود هذه البرمجة كل مرة نحتاجها بل يمكن أن نضع هذه البرامج على شكل ماكويات أو برامج من نوع Subroutine أو مكتبات بحيث ما نقوم به في المستقبل هو استدعاء دالة نكون قد برمجناها في يوم من الأيام.

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

إلى اللقاء.

#11

شكرا اخوي chik

بس يا ليت انك توضحلي الطريقة اكثر لأنه لو أفترضنا انه عندي اكثر من عدد وأرت إني اسوي المتوسط الحسابي فأقوم بالأتي

مثال:

2+2=4

تكون مخزنة في AX بعدين على حسب كلام اخوي afeef إني اقوم بإضافة القيمة صفر عشان ترجع إلى قيمتها الصحيحة وهي 4

بعدين ارت ان اضيف القيمة 7 للعدد الناتج من العملية السابقة

7+4=11

هنا تبدأ المشكلة والسؤال هو

-كيف أقوم بتقسيم العدد 11 أو غيره على حسب ما ذكرت سابقاً ؟

-وكذلك كيف اقوم بإعادته إلى وضعه الطبيعي كي اجري عليه عملية جمع أخرى مع عدد آخر حتى احصل على المجموع ( sum )؟

أنت ذكرت انك وضعت برنامج للآلة الحاسبة بس هناك دوال لم نأخذها وأخاف ان الدكتور يسألني عنها لو كتبتها في برنامج وأنا لا أعرفها جيداً

أشكرك على تجاوبك

أخوك آســــــــــــــــــــر

#12

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

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

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

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

#13

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

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

1)كم هو عدد الحدود التي تريد ان تعمل لها المتوسط الحسابي

2)هل تريد استقبال القيم عن طريق لوحة المفاتيح ام انها مخزنة بالذاكرة واذا كانت مخزنة بالذاكرة فما هو عنوان اول حد منها

3)كم خانة تريد بعد الفاصلة لانه ربما يكون الناتج عدد حقيقي اي انه مع كسور

4)ماذا مع الحدود هل هي موجبة ام موجبة وسالبة لانه هنالك فرق في التعامل معها

5)ما هي الاوامر التي درستها . اي ما هي الاوامر المسموح استعمالها. مثلا يمكن ان احصل على 4*5 عن طريق جمع الاربعة خمسة مرات ويمكن ان اضرب بمساعدة الامر mul او imul للحصول على النتيجة

ارجو ان توضح هذه البنود لكي استطيع ان اساعدك

ارجو ان اكون دائما عند حسن ظن الاخوة

#14

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

الله يعطيك العافية اخوي afeef

وأسف ياشباب كاني أشغلتكم

السؤال هو كالتالي :

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

( أفضل انا لتسهيل البرنامج أن تكون زوجية لتفادي الفاصلة العشرية و غير سالبة )

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

الأوامر التي درستها هي أوامر الضرب ( mul , imul ) وأوامر القسمة ( div , idiv )

وأوامر الجمع ( add , adc ,inc ) وأوامر الطرح (sub,sbb,dec)

وكذلك

mov , out , in, lea ,push , pop ,xchg ,xlat ,lds ,les , lahf , sahf , neg

وكذلك تعليمات الإزاحة (sar , shr , shl , sal )

هذا كل ماطلبتها أخوي afeef

وأرجو أن لا أكون اخذت من وقتك الشيء الكثير أنت و أعظاء هذا المنتدى

تقبلوا خالص تحياتي

أخوكم آســــــــــــــــــــــــــــــــــر

تم تعديل هذه المشاركة بواسطة آسر في 5 مايو 2004 في 23:44

#15

السلام عليك

هنالك بعض الاسئلة

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

الثاني:هل تريد ان نحفظ النتيجة في الذاكرة فقط اي في متغير معين ام انك تريد ان تطبعها على الشاشة ايضا في حالة الطباعة ما هي الinterrupts التي تعلمتها لانه يمكن الطباعة في عدة طرق ارجو تسجيل النوع الذي تعلمته

الثالث:انت تحدثت عن 4 او 5 قيم هذا لا يهم كثيرا الشيء المهم هو ما هو كبر كل حد من الحدود التي تريد ان تعمل لها المتوسط الحسابي. هل هي من نوع بايت (byte) او من نوع word

الرابع: هل تريد ان اكتب لك البرنامج بشكل كامل ام يكفي كتابة المقطع الذي يقوم بعملية الحساب والطباعة في حالة وجود طباعة وانت تعرف المتغيرات في data segment

الخامس: هل تريد ان استعمل الماكرو والاجراءات macro and procedures أم اكتب برنامجا بدونها

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

#16

هلا اخوي afeef

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

- نعم تعلمت معظم المتغيرات بشكل يسير ولكن لا يهم نوع المتغيرات التي سوف تضع لان الدكتور لا يعرف اي شيء في اللغة فقط مجرد أوامر

- أما النتيجة أوريد أن تكون على الشاشة

- وعن نوع الطباعة فلم اتعلم اي نوع من الطباعة في الأسمبلي لكن لا أعلم ان كانت أنواع الطباعة في الأسمبلي تشابه لغة السي أم لا اختر النوع الذي تراها مريح لك

- حجم المتغيرات تكون من النوع (byte)

- أفضل كتابة البرنامج كامل

- أما اوامر الماكرو و الاجراءات macro and procedures فلا اعرفها

اكرر اسفي اخي afeef على ازعاجك بهذه الأسئلة

أخوك آســــــــــــــــــــــــــــــــــر

#17

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

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

كل ما يمكن القول الآن أن الطباعة على الشاشة أو غيرها تختلف –على ما يبدو لناكمبرمجين – لأن اللغات المتطورة تتوفر على مكتبات متطورة صممت لتسهل لنا البرمجة وفي الأسمبلر 16 بايت فتوجد نوع من المكتبات والتي تعرف ب Interrupt ولكنها ليست في درجة التطور كاللغات الأخرى ولهدا تبدو لنا أصعب . وللمزيد من المعرفة يمكن تحميل لائحة Interrupt وقد وضعتها في هدا المنتدى ومن خلالها يمكن أن نتعرف كيف يمكن أن نبرمج مختلف ما يتعلق بمختلف وضائف الكمبيوتر.

إلى اللقاء.

#18

السلام عليك اخي آسر

انا اعتقد بان ما قاله الاخ CHICK صحيحا لقد قمت بتقسيم المادة الى ما يقارب مئة درس منها دروس حل اسئلة ومنها المادة ارجو ان تتحلى بالصبر.

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

الملف الاول ملف شرح عمل البرنامج

الملف الثاني حل السؤال

انا شخصيا اتعامل مع المترجم MASM4

وهنا نعرف المقاطع بالشكل التالي

SSEG SEGMENT STACK

DB 20 DUP (0)

SSEG ENDS

ولكن في المترجم الذي قمت بتنزيله من المنتدى يتم التعريف بالشكل مختلف وقمت بحل السؤال حسب المترجم الذي قمت بتنزيله اذا اردت تغيره انا على استعداد لذلك

اليك الملفات

tam1.doc

#19

السلام عليك

لقد ارسلت اليك في الرسالة السابقة شرح الحل

اليك ملف حل السؤال

AV1.ASM

#20

أشكرك أخوي afeef

والله يجزاك خير أنت والأخ CHICK ولا ننسى الاعضاء بعد كلهم

اخذنا من وقتك الشيء الكثير

بس عند سؤال عن( .stack 100h ) ماذا يعني هذا الجزء وخاصة 100h

انا اعرف اني ازعجتك بسألتي بس تحملني شوي الله يجزاك خير

اخوك المخلص

آســــــــــــــــــــــر

#21

السلام عليك

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

sseg segment stack

db 100h dup (0(

sseg ends

ولكن رأيت بانكم تستخدمون في هذا المنتدى الطريقة القصيرة وهي بالشكل التالي

.stack

.data

.code

ما هي الطريقة التي تستخدمها انت في البرمجة؟

اما بالنسبة stack 100h

هذا يعني انه لدينا مقطع stack بحجم 100h اي ما يعادل 255 عشري

يمكن ان تقلل من هذه الكمية

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

العمليات التي تحتاج مقطع stack هي

pop push call ret

اخي اذا اردت اجراء تعديل على الحل بحيث تتخلص من ال stack فانا على استعداد

#22

اهلا اخي afeef

البرنامج شغال مية المية

والله بودي انك تكتبه لي بالطريقة الطويلة

بس ياليت ترسله على البريد حقي أو رسالة خاصة لا سباب امنية !!

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

والله ماقصرت ولك جزيل الشكر والعرفان

اخوك آســــــــــــــــــــــر

#23

اسف نسيت بريدي

هذا بريدي

kadi727@hotmail.com

بس ياليت ولا عليك امر يكون اليوم

اخوك آســـــــــــــــــــــــــــر

#24

السلام عليكم

لقد بعثت لك الحل على البريد

#25

مشكور والله يجزاك كل خير يا أخ afeef

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

أخوك المخلص

آســـــــــــــــر

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

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