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

[ تمت الإجابة ]كيف أكتب برنامج للإزاحة المنطقية والحس

بدأه لون المآء..! في 21 أبريل 2009 · 21 رد · 2,881 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لآأعلم باأي قسم اضعه ولكني قرأت مواضيع من هذا القسم لاحظت انه اقرب شيء لموضوعي ان يكون في هذا القسم..

أرجــو مسأعدتكم..

هذه بعض التعلمآت

d3w3.com-e2905253f1.jpg

ومنها اريد كتــأبة برنامج..هذآ البرنامج يكون يعمل عمل..

shr logic-shl logic- shr arthmtic-shl arthmtic

هل تسطتع ان تكتب لي عملهم باأستخــدآم هذه التعليمآت فقط..؟؟؟؟؟

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

أن لم تظهر الصوره..فقط وضعتهآ في المرفق*.

post_200640_1240269513.rar

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

#2

هل هذا طلب حل وظيفة؟

شئ آخر أرى instructions يبدو أنها لآلة ما أو متحكم صغري، هذا ليس لتطبيقات أنظمة تشغيل والله أعلم.

Do as I say, not as I do

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

#3

نعم هو طلب لعمل وضيفتهم..

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

هذه التعليمآت عملت جمع وضرب لعددين ثنآيين.

بإستخدآم هذه التعليمآت..

فاأنآ اريد ان أعمل عمل الشفت لــ عدد ثنآئي باأستخدأم هذه التعليمآت..

أتمنى ان تســآعدني اخي..ولآتتركني معلقه:)...فاأنآ بحــآجةٍ جداً لمسآعدتك..

وإذآ لم يتضح لك..فاانآ مستعده ان اصور لك من كتآبي تعليمآت الجمع والضرب..

لكن ســأعدني.. :wacko:

أنتظـــــــرك..

#4

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

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

تالياً، التعليمات في الأعلى لا أفهمها، كما قلت لك، هذا لا يبدو لنظام تشغيل (أو على الأقل ليس لـ Windows)، حددي المعالج الصغري الذي تعملين عليه أو الآلة.

أخيراً، الإزاحة المنطقية لليمين أو لليسار هي ببساطة نقل البتات عدد من الخانات (مقدار الإزاحة) لليمين أو لليسار مع إهمال البت المنتمي إلى إحدى النهايتين (عند الإزاحة لليمين يهمل البت اليساري والعكس صحيح).

الإزاحة الحسابية شئ آخر وهناك عدة طرق لحسابها، منها خوارزمية Booth المفيدة بغض النظر عن إشارة العدد سالب أم موجب.

هذا بشكل منطقي، نأتي الآن للحل، ما هي التعليمات المتوفرة "بالضبط" ؟

Do as I say, not as I do

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

#5

أهلآ اخي..

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

اخوي..انآ افهم عمل الشفتآت كلهآ كفهم.وعندمآ احتــآج كتآبة برنآمج بلغة الآسمبلي ساأكتب ببسآطه كلمة

shr...وغيرهآ.

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

التعليمآت التي وضعتهآ في اعلى هي لمعـآلج اقدم من68..ع ماأظن..هذه تعليمآته فقط..كقول الدكتوره ان هذه التعليمآت له فقط ونحن نريد ان نعمل شفت لعدد ثنـائي..لكن شفت غير موجوده مع هذه التعليمآت لذلك

نبدأ بعمليه التفكير بكتآبه برنآمج يحتوي علي هذه التعليمآت

لكني لآاعرف اسم المعألج.

بدآيه..انآ اعتقد ان نحمل قيمة

x=11110000

LDA X

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

انت برأيك..وش استخدم من هالتعليمآت..؟؟

أتمنى ان وضحت الفكره..

.

#6

SHR أو SHL المنطقية يمكن أن تقومي بتنفيذها من خلال CIR و CIL (التعليمات من الصورة التي أرفقتيها)، في التدوير يتم قلب البتات مع الاحتفاظ بها، مثال 1101 بالتدوير لليمين، يصبح، 1110، يمكننا الآن أن نطبق AND مع 0111 لكي نلغي البت الموجود إلى اليسار بالتالي نحصل على 0110 وبهذا قمنا بالإزاحة لليمين.

الإزاحة لليسار سنأخذ نفس المثال 1101، بالتدوير لليسار يصبح 1011، الآن نطبق AND مع 1110 لكي نلغي البت في أقصى اليمين ويكون الناتج 1010.

نعمم هذا على الأمثلة الباقية ومن أجل كل إزاحة إضافية بعد التدوير بعدد الإزاحات نستخدم AND مع 0111, 0011, 0001, 0000 على الترتيب (الإزاحة لليمين)، و 1110, 1100, 1000, 0000 على الترتيب (الإزاحة لليسار).

سأفكر بالإزاحة الحسابية، حالياً، اشرعي بكتابة الشرح أو البرنامج المطلوب منك بناء على ما ذكرته لك.

A single rotate through carry can simulate a logical or arithmetic shift of one position by setting up the carry flag beforehand. For example, if the carry flag contains 0, then x RIGHT-ROTATE-THROUGH-CARRY-BY-ONE is a logical right-shift, and if the carry flag contains a copy of the sign bit, then x RIGHT-ROTATE-THROUGH-CARRY-BY-ONE is an arithmetic right-shift. For this reason, some microcontrollers such as PICs just have rotate and rotate through carry, and don't bother with arithmetic or logical shift instructions.

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

Do as I say, not as I do

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

#7

يعطيك الف عأفيه ع البدايه..أحس انه الفكره وصلت..:)

طيب ابكتب لك طريقة البرنآمج بشكل عآم..

CLE

LDA Y

CIR

STA Y

LDA X

AND X

STR X

هذآ باأعتقــآدي...وأنت وش رأيك شكله صحيح..؟؟؟

تم تعديل هذه المشاركة بواسطة لون المآء..! في 22 أبريل 2009 في 02:16

#8

ما هي الرموز E، AC، M في الصورة؟

تصوري يخبرني AC - accumulator (هل هو كالمسجلات في معالجات x86 وما يليها؟)

M - memory

لكن E ؟ يبدو أنها مثل الرايات لكن هي عبارة عن ماذا بالضبط؟

بخصوص المثال العام الذي كتبتيه،

سنحتاج إلى تحميل العدد number لـ AC

ثم تدويره، والناتج سيكون ما زال في AC

ثم إجراء عملية AND بين قيمة AC وقيمة من الذاكرة mask تعبر عن قناع البتات الذي نتعامل معه والذي تكلمت عنه في الأعلى، الناتج مرة أخرى ما زال في AC

أخيراً حفظ الناتج من AC إلى M.

CLE
LDA   number
CIR
AND  mask
STA   result

ما رأيك؟

Do as I say, not as I do

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

#9

اخووووي....

لي عوده لقرآءة فكرتك..

واعتذر عن انقطاعي والسبب سفري المفآجيء لضروف ..

ولكنني سااعود حتى اسلم مشروعي الآسبوع القآدم..

#10

AC..نعم هو مسجل ويعمل كعمله في مسجلآت 86...ونستطيع تسميته بالقلب النآبض في المعآلج لآنه يعمل كل شيء..

M..نعم ميموري..

E..هذآ كعمل الرآيآت...اعطيك مثال ع كيفية عمله..ولعلني استطيع التوضيح..

مثلآ: في عمل ازآحة السيركت رايت..البت الآول الموجود في اليمين ينتقل ليكون في البت الآول من اليسآر..لكن في E..يكون موجود فيه بدل من انتقاله للبت الآول في اليسآر..

مثل:0011--->>0001 و E=1...هذآ في عمل السيركت رايت..

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

بالنسبه لمثآلك...اشعر اني فهمته وانهآ اجآبه صحيحه..لكن عندي بعض الآسئله..؟؟

مآعمل المآسك...هل العدد الذي يكون فيهآ يدخله المستخدم ساأوضح مآفهمته باأعدد ثنآئيه..

مثآل..0011-->> نعمل له ازآحه منطقيه من نآحية اليمين.. ويصبح العدد 0110

في برنآمجك.:

عملنآ تصفير..

حملنآ القيمه 0011

نعمل ازآحه يمنى (سيركت).لتكون القيمه 1001

نعمل مآسك.....\\ هنآ كيف عمل المآسك ليعطينآ النتيجه 0110..؟؟؟؟

تم تعديل هذه المشاركة بواسطة لون المآء..! في 1 مايو 2009 في 21:47

#11

الـ mask سيسمح لنا بإزالة البتات التي نود التخلص منها.

في الإزاحة المنطقية يتم إهمال البت الذي يخرج من اليمين أو اليسار (إلى E المستخدم في عمليات الحمل carry عند الضرورة)

لكن بما أننا نستخدم التدوير، التدوير يقوم فقط بنقل البت كما قلت من أقصى اليمين إلى أقصى اليسار أو العكس حسب نوع التدوير.

بالتالي لم يتم إهمال البت مثلما يحدث في الإزاحة وسنحتاج لتصفيره بأنفسنا.

لكي نقوم بالتصفير، نعتمد على العملية البوليانية AND التي أعرف أن:

1 AND 0 = 0 < يتم تصفير البت الأساسي

0 AND 0 = 0 < يتم تصفير البت الأساسي

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

1 AND 1 = 1 < يتم الاحتفاظ بالبت الأساسي

0 AND 1 = 0 < يتم الاحتفاظ بالبت الأساسي

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

لذلك لو أردت مثلاً أن أصفر البتات باللون الأحمر في المثال التالي سأستخدم mask تكون فيه البتات المقابلة التي أريد تصفيرها عبارة عن 0 والبتات التي أريد الاحتفاظ فيها عبارة عن 1 وأطبق AND

البتات باللون الأخضر لا تتأثر ويتم نقلها كما هي.

original:

11110001

mask:

11001011

11110001

11001011 &

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

11000001

أرجو أن يكون المثال مفهوم.

بالتالي حسب المثال الذي كتبتيه

أنا أحتاج أن أزيل البت الذي سيتم نقله إلى أقصى اليسار، فأضع البت المقابل له في الـ mask 0 وبقية البتات 1

[color= #007f00; font-style: italic;]; number = 0011

[color= #007f00; font-style: italic;]; mask = 0111

[color= #007f00; font-style: italic;];---------------------

CLE		[color= #007f00; font-style: italic;]; reset E

LDA	number	[color= #007f00; font-style: italic;]; AC = number = 0011

CIR		[color= #007f00; font-style: italic;]; rotate right AC by 1, AC becomes 1001

[color= #ff007f;]AND	[color= #7f00ff;]mask	[color= #007f00; font-style: italic;]; (AC=1001) & (mask=0111) = 0001

STA	result	[color= #007f00; font-style: italic;]; store AC into result memAddr, result becomes 0001

تم تعديل هذه المشاركة بواسطة Xacker في 3 مايو 2009 في 09:19

Do as I say, not as I do

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

#12

..:)ايووه أحس اني استوعبت الفكره..

البرنآمج حقك صحيح بس يختلف بين الآزاحه من نآحية اليمين والآزآحة من نآحية اليسآر..

أذأ كآن من نآحية اليمين..نستخدم العكس وهي

CIL

وإذكآنت من آليسآر نستخدم

CIR

هكذآ فهمت..وانتيهنآ من الآزآحة المنطقيه من كلآ الجهتين..

لكن آلحسآب..كيف اكتبه..؟؟

يعطيك الف الف عــآفيه...

#13

سؤال بسيط قبل ماننتقل للحسآب..

عندمآ كتبت AND MASK...هل المآسك تعليمة اسأسيه لآنهآ غير موجوده مع التعليمآت لهذا المعآلج..

وإلا عآدي نستخدمهآ لو هي مو موجوده...؟؟؟

#14
لون المآء..! كتب:
سؤال بسيط قبل ماننتقل للحسآب..

عندمآ كتبت AND MASK...هل المآسك تعليمة اسأسيه لآنهآ غير موجوده مع التعليمآت لهذا المعآلج..

وإلا عآدي نستخدمهآ لو هي مو موجوده...؟؟؟

لا يغرّك لونها، هذه تكون كلمة محجوزة لذلك قام الكود بتلوينها.

mask مثلها مثل number و result

أماكن في الذاكرة نخزن فيها قيم أو نأخذ منها قيم.

بعض الوقت حتى ذهني يبدأ بالدوران فقد استيقظت منذ قليل :lol:

Do as I say, not as I do

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

#15

حلوو...دخلت في آخر لحظه..لآنني غداً ساأشرح لزميلآتي مآكتب هنآ..

ودخلت لأ أعرف ردك الآخير بمآسك..

مأفهمته انه مخزن ..طيب لو وضعت..y..لآبآس في ذلك..؟؟؟؟

أعتذر ...ومآتنلآم اتعبنآك معنآ يأخبير..

#16

طبعاً المتغيرات number, mask, result ممكن تكون أي شئ (تقريباً ما عدا الكلمات المحجوزة لو كان هناك)

Do as I say, not as I do

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

#17

تباً - لماذا لا يقرأ بعض من أثق بهم ما أكتبه بعدي حتى يصوب لي لو أخطأت :(

fkugd2003 أين أنت :angry:

أختي أنا أخطأت فيما كتبته حول الإزاحة لليسار، لا أعلم كيف فعلت هذا فكل شئ كان واضح بالنسبة لي، سبحان الله الآن كنت أفكر في الإزاحة الحسابية وخطر في بالي أني كتبت شئ خاطئ عدت للبداية وتأكدت.

المهم،

سأحاول تلخيص الأفكار:

* الإزاحة المنطقية إلى اليسار والإزاحة الحسابية إلى اليسار:

متطابقتان، لأن الإزاحة إلى اليسار تحافظ على إشارة العدد مهما كانت.

في الحالتين يتم إدخال 0 في أقصى اليمين وإزاحة البتات الأصلية خانة إلى اليسار.

مثال:

1011

تصبح 10110

تصبح 101100

تصبح 1011000

كما تلاحظين، استمرار الإزاحة إلى اليسار يعني أنه من المحتمل أن أتخطى حجم المسجلات التي أتعامل معها، لا أعلم AC و E كم حجمهم ولم تذكري هذه المعلومة.

لنفرض أن AC و E كلاهما بحجم 4 بتات، أي كل مسجل يستطيع أن يمثل قيمة من 0 حتى 15 (عشرياً)

لنقل أن 1011 قيمة مخزنة في AC

بإزاحتها خانة واحدة إلى اليسار يعني أني الآن بحاجة إلى 5 بتات وهذا يتخطى حجم AC تماماً، بالتالي أستعين بـ E

فيصبح لدي

E = 0001 / AC = 0110

بالإزاحة مرة أخرى

E = 0010 / AC = 1100

بالإزاحة مرة أخرى

E = 0101 / AC = 1000

بالإزاحة مرة أخرى

E = 1011 / AC = 0000

بالإزاحة مرة أخرى هنا لم يعد هناك إمكانية وسيصبح هناك ضياع في البيانات

الإزاحة ستنفذ، لكن ما بأقصى اليسار الآن سيهمل بالتالي تصبح القيمة

E = 0110 / AC = 0000

وإن تابعت الإزاحة ثلاث مرات الآن سأنتهي بقيمة 0 في كلا المسجلين، والتي هي نوعاً ما تمثل لانهاية متزايدة باتجاه موجب ويظهر لدي ما يسمى بالطفحان overflow.

سأفرض الأمر غير معقد لهذا الحد، ولنقل أن الرقم 0011 ممثل على 4 بتات والمطلوب إزاحته مرتين إلى اليسار، كيف سنقوم بهذا؟

أنا أعلم أن العدد سيتم إزاحته بالشكل:

00110 ثم 001100 والأصفار إلى أقصى اليسار تهمل أي 110 ثم 1100

أنا أعلم أيضاً أن الإزاحة لليسار هي عبارة عن ضرب بـ 2n حيث n هو عدد مرات الإزاحة.

أي لدي 3 * 22

سأستخدم خوارزمية Booth (وضعت ملف مساعد في المرفقات).

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

* الإزاحة المنطقية إلى اليمين:

تتم على الأعداد الغير مؤشرة unsinged لأنها لا تأخذ بعين الاعتبار البت الذي يخرج بالإزاحة إلى اليمين.

طريقة عمل البرنامج مثلما تم ذكره من قبل باستخدام الـ mask..

* الإزاحة الحسابية إلى اليمين:

تتم على الأعداد المؤشرة signed حيث يتم حفظ إشارة العدد في راية الحمل ويتم إدخالها في أقصى اليسار عند الإزاحة بدلاً من الصفر المطلق للمحافظة على الإشارة.

مثال:

00001011

قيمة E = 0 والعدد موجب.

بالإزاحة إلى اليمين، تصبح القيمة، 00000101

بالإزاحة مرة أخرى، تصبح القيمة، 00000010

بالإزاحة مرة أخرى، تصبح القيمة، 00000001

بالإزاحة أيضاً تصبح 0

أعتذر جداً على الخطأ الذي حصل :(

ICA.pdf

تم تعديل هذه المشاركة بواسطة Xacker في 3 مايو 2009 في 11:26

Do as I say, not as I do

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

#18

لآ اعلم ولكني ارى صحة كلآمك سابقاً..حتى أنني شرحته لزميلآتي واقتنعن وطبقن ع بعض الآمثله واصبح النآتج صحيح

ساخبرك مآهو برنآمجنآ..

الآزآحة المنطقيه من نآحية اليمين

CLE

LDA number

CIR

AND mask

STA result

ومن نآحية اليسآر..

CLE

LDA number

CIR

AND mask

STA result

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

وإزآحة الحسآب من نآحية اليمين..

CLE

SPA

CME

CIR

وأزآحة حسآب من نآحية اليسآر

CLE

SPA

CME

CIL

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

هكذآ مآفهمنآ وان شآءالله ربي يوفقنآ..

يعطيك الف عآفيه ويرزقك جنآت الفردوس..

غداً تسليمه وشرحه للدكتوره..أتمنى ان نوفق في الشرح واذا كآن خطآ سآآخبرك وان كآن صحيح فالله الوفق..

:)..دعوآتك....

#19

لا أعتقد أنه بهذه البساطة

لكن الدعاء لكم بالتوفيق، وأنا صراحة أنتظر معرفة الحل بواسطة هذه التعليمات لو أعطوكم إياه

Do as I say, not as I do

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

#20

كم حجم AC في هذا المعالج بالمناسبة ؟

Do as I say, not as I do

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

#21

أعتذر عن تآخر استآذ x..

لكن سااعود..لآكتب مآهو الصحيح ..وبعضاً من حلك صحيح..

لكن ساأصحح الخطأ ليستفيد من يمر من هنآ وهو محتآج لهذآ الموضوع..

#22

وأنا بالإنتظار

Do as I say, not as I do

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…