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

جمع وطرح مجموعة أعداد باستخدام لغة الآله Sim

بدأه PROGRAMMER_15 في 12 نوفمبر 2008 · 11 رد · 3,758 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لقد قمت بكتابة هذا البرنامج باستخدام لغة الآله SIM

لجمع وطرح هذه الأعداد

(15+8+33)-(44+54+64)

الكود هو:

0004

2001

2002

1006

3001

2003

2004

ffff

44t

54t

64t

15t

8t

33t

0000

لكن النتيجة لم تكن صحيحه

ماهو الخطأ؟

وشكراً

#2

وين المساعدة يا أخوان

#3

ستنتظر طويلاً، السبب أنك تعمل في شئ ربما لم يعمل به أحد منّا من قبل ولم يضطر إلى هذا.

Do as I say, not as I do

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

#4

ماذا لو أردت كتابة نفس هذا البرنامج بالاسمبلي؟

الفكرة أنو الكود 0004

يعني ld في لغة الأسمبلي

2005 يعني add

الفكرة أني استخدم Hex بدلاً من الرموز.

لو أردنا كتابته بالاسمبلي

هل سيكون كالتالي

ld 1

add 2

add 3

st 4

add 6

add 7

st 8

sub 9

st 4

st 8

halt

dw 64t

dw 54t

dw 44t

dw 33t

dw 8t

dw 15t

dw 0

هل صحيح

تم تعديل هذه المشاركة بواسطة PROGRAMMER_15 في 13 نوفمبر 2008 في 19:12

#5

لا أستطيع الجزم لذلك سأناقشك

ld 1
add 2
add 3
st 4

سأكتبه بشكل عبارات فصحح لي لو ذكرت شئ خاطئ

load 64t > stack

add 54t > stack

add 44t > stack

store stack > local.4 ?

- هل 64t هي قيمة عشرية؟

- بعد الجمع، أليس من المفترض أن يكون st 1 لأنك تخزن في متغير محلي وليس على الـ stack ؟ (أنا مشوش قليلاً لأن هذه الأسمبلي قريبة نوعاً ما من الـ MSIL)

add 6
add 7
st 8

ألا يجب أن تقوم بتحميل loc.5 ثم تضيف لها loc.6 ثم loc.7 وتقوم بحفظ القيمة st 2 ؟

تقريباً كما حدث في الأعلى

ثم

sub 9
st 4
st 8

لا أدري بالضبط ما الفكرة، ما رأيك بـ

ld arg.1
ld arg.2
sub
st loc.3

يعني بالمختصر المفيد وبشكل Pseudo:

load loc.1

add loc.2

add loc.3

store arg.1

load loc.4

add loc.5

add loc.6

store arg.2

load arg.1

load arg.2

sub

store arg.3

halt

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

Do as I say, not as I do

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

#6

مشكور على الرد

بالنسبة 64t , نعم هي قيمة عشرية.

هل تعني loc متغير محلي؟

بعد halt ستكون القيم

dw 64t

dw 54t

dw 44t

dw 33t

dw 15t

dw 8t

dw 0

هل صحيح كتابة القيم بالشكل أعلاه بعد الأمر halt

#7

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

ld n1

add n2

add n3

st fg

ld n4

add n5

add n6

st sg

ld fg

ld sg

sub 7

st result

halt

n1: dw 64t

n2: dw 44t

n3: dw 54t

n4: dw 33t

n5: dw 8t

n6: dw 13t

0 result: dw

لكن عند التنفيذ يحدث خطأ

تم تعديل هذه المشاركة بواسطة PROGRAMMER_15 في 13 نوفمبر 2008 في 20:54

#8

لم تجبني على كل أسئلتي, وكما لاحظت أنا قلت لك لم أكتب بهذه الطريقة من قبل ولم أكتب على SIM هذه التي تتكلم عنها، أنا فقط أحاول مجاراة ما تقوم بكتابته من خلال ما رأيته كثيراً في تطبيقات MSIL (يعني في تطبيقات .NET بشكلها Intermediate Language)

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

هل هناك شئ على الأقل يوضح "structure" استخدام التعليمات، في MSIL لا تستطيع جمع ثلاث متحولات مباشرة حسبما أذكر

تقوم بتحميل قيمة للذاكرة، تقوم بتحميل قيمة أخرى، تنفذ عملية جمع فيتم جمع آخر قيمتين في الذاكرة وتخزينهم في متحول محلي (نعم loc أقصد بها متحول في برنامجك وليس شئ في الذاكرة)

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

إن شاء الله طبعاً

السلام عليكم

تم تعديل هذه المشاركة بواسطة Xacker في 13 نوفمبر 2008 في 22:33

Do as I say, not as I do

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

#9

أنا أكتب برنامج بلغة الألة

أنت تعرف أن الكمبيوتر لا يتعرف سوى على 01 فقط

فأنا إذا أريد أن اقول للمعالج أجمع يجب أن أكتب:

0010000000000101

أول أربعه bit تسمى operation code

إما 12 bit الباقيه فهي عنوان الذاكره

هذه الطريقة سوف تكون صعبه إذا قررنا الكتابةbinary numbers

لذلك لدينا برنامج اسمه sim وظيفته أننا بدلاً من نكتب instructions عن طريق binary numbers نستطيع كتابته بـ hexdecimal numbers بمعنى:

الأمر 0010000000000101

يكون Hex 2005

برنامج sim يقوم بتحويل Hex إلى binary ألي هو لغة الآله.

أيضاً الكتابة بلغة الأله صعبه جداً ، لذلك تم إيجاد لغة الاسمبلي كبديل حيث أنها تستخدم الرموز بدلاً من الأرقام

الأمر load يكتب في لغة الاسمبلي ld

وفي برنامج sim :

0004

وفي لغة الآلة

0000000000000100

تطور الموضوع وأصبح لدينا لغات عالية المستوى كـ السي بلس بلس والجافا.

إذا أردت أن تجمع رقمين في لغة عالية المستوى كـ الجافا يكون بالشكل التالي:

;int a=5

;int b=5

;int c

c=a+b

وانتهى الموضوع

في لغة المستوى الآول كـ الاسمبلي:

ld 1

add 2

st 3

halt

dw t5

dw t5

dw 0

في لغة الأله

0000000000000100

0010000000000101

0001000000000110

1111111111111111

0000000000001111

0000000000000101

0000000000000101

0000000000000000

انظر الفرق بين مستوى اللغات وكيف التطور التقني.

لكن لغة الاسمبلي تبقى صاحبة قوة برمجية تقدمها للمطور

على العموم بالنسبة للبرنامج أنا وصلت لنتيجة لكن لست متأكد من ناتج العملية الحسابية وهذا هو الكود بلغة الأسمبلي:

ld n1

add n2

add n3

st 4

ld n4

add n5

add n6

st 5

ld 4

ld 5

sub 7

st result

halt

n1: dw 44t

n2: dw 54t

n3: dw 64t

n4: dw 33t

n5: dw 15t

n6: dw 8t

result: dw 0

وهذا هو الكود بلغة الألة بشكل Hex:

0004

2001

2002

1004

0005

2003

2004

1005

0006

0007

3009

1006

ffff

44t

54t

66t

33t

15t

8t

0000

وإذا أردته بشكل Binary Number

توقع أن ترى شكلاً كهذا:

0000000000000000100

0010000000000000101

وهكذا

تم تعديل هذه المشاركة بواسطة PROGRAMMER_15 في 14 نوفمبر 2008 في 00:57

#10

أخي هل نسيت أنك في قسم الأسمبلي؟ :)

أنا لم أخطئ القسم ودخلته معتقداً أنه للفيجوال بيسك

ما تكلمت عنه أعرفه من سنوات، ما كتبته لك في الأعلى شئ مختلف تماماً عما كتبته لي ولم تقدم لي شئ حتى أستطيع مساعدتك.

أنت تكتب بلغة تسميها SIM، حسناً لم أسمع بها، هل لك أن تخبرني هل لها برنامج تجميع تستخدمه، هل لها تعليمات معينة، هل لها مراجع، هل لها موقع؟

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

بالمناسبة الكمبيوتر دارات الكترونية، نحن نستخدم 0 و 1 حتى نفهم فقط ما تعنيه الإشارات الكهربائية التي تمر في هذه الدارات.

Do as I say, not as I do

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

#11

sim برنامج يحاكي H1

horizontally microprogrammed

وأيضاً V1

vertically microprogrammed

على العموم أنا توصلت لنتيجة مقاربة، ما كتبته في الأعلى للتوضيح فقط .

#12

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

بالمناسبة قسم البرمجة بالـ microprocessor is down the hallway

أقصد أنه في قسم آخر لكن لم يكن هناك مانع من النقاش به هنا، لو أردت يتم نقل هذا الموضوع هناك.

Do as I say, not as I do

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

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