المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : تمارين مادة بنية الحاسب فصل ثاني


Golden man
03-16-2008, 10:04 AM
بسم الله الرحمن الرحيم.

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

اصطلاح هام:
سوف اصطلح أن عنوان بداية أي loop في البرنامج سوف يعبر عنه بـكلمة Begin لذا عندما تريد تطبيق البرامج يجب استبدال هذه الكلمة بعنوان التعليمة التي بعد Begin.


1 ) اكتب التعليمات اللازمة لما يلي:
1 – تعيين الخانة الخامسة للمسجل al مع المحافظة على باقي الخانات كما هي.


2 – تصفير الخانة الخامسة للمسجل al مع المحافظة على باقي الخانات كما هي.


3 – عزل الخانة الثالثة فقط (العزل = جعلها تساوي الواحد و تصفير باقي الخانات).


4 – قراءة الخانة الثامنة فقط (القراءة = العزل).


الحل :


1 – or al,10 .
2 – and al,ef.
3 – and al,04.
4 – and al,80.

Golden man
03-16-2008, 01:11 PM
2 ) اكتب برنامج عداد تنازلي يعد من 10 إلى 0.
طريقة 1 :


mov cx,0010
begin: dec cx
jnz begin
brk

طريقة 2 :


mov cx,0010
begin: loop begin
brk

Golden man
03-16-2008, 01:17 PM
3 ) اكتب برنامج عداد تنازلي يعد من 10 إلى 0 و يخزن العدد في الذاكرة بدا من الموقع 2000 :


mov cl,10
mov si,2000
begin: mov [si],cl
inc si
loop begin
brk

Golden man
03-16-2008, 01:18 PM
4 )اكتب برنامج عداد تصاعدي يعد من 1 إلى 10 بعناصر byte :


mov cl,00
mov si,2000
begin : mov [si],cl
inc cl
inc si
cmp cl,10
jnz begin
brk

Golden man
03-16-2008, 01:20 PM
5 ) اكتب برنامج عداد تصاعدي يعد من 1 إلى 10 بعناصرword :


mov cx,0000
mov si,2000
begin : mov [si],cx
inc cx
inc si
inc si
cmp cx,0010
jnz begin
brk

Golden man
03-16-2008, 01:23 PM
6 ) اكتب برنامج عداد تصاعدي يعد الأعداد الزوجية من 0 إلى 20 لعناصر word و يخزن النتائج بدءا من الموقع 2000 :


mov cx,0002
mov si,2000
mov ax,0000
begin : mov [si],ax
add ax,cx
add si,cx
cmp ax,0020
jnz begin
brk

Golden man
03-16-2008, 01:24 PM
7 ) اكتب برنامج عداد تصاعدي يعد الأعداد الزوجية من 0 إلى 20 لعناصر word و يخزن النتائج بدءا من الموقع 2000 بحيث يكون عنصر العد و مؤشر التخزين نفسه :


mov cx,0002
mov si,2000
mov bx,0000
begin : mov [si+bx],bx
add bx,cx
cmp bx,0020
jnz begin
brk

Golden man
03-16-2008, 01:26 PM
8 ) اكتب برنامج لحساب مجموع الأعداد من 0 إلى 10 : الجواب 88


mov cx,0010
mov ax,0000
begin : add ax,cx
loop begin
brk

Golden man
03-16-2008, 01:28 PM
9 ) اكتب برنامج لحساب مجموع الأعداد الزوجية من 0 إلى 20: الجواب 110


mov cx,0020
mov ax,0000
begin : add ax,cx
dec cx
loop begin
brk

Golden man
03-16-2008, 01:33 PM
10 ) اكتب برنامج لحساب مجموع الأعداد الزوجية بحيث لا يتجاوز المجموع 23f : تكون قيمة العداد في نهاية الحلقة = 32


mov cx,0000
mov ax,0000
begin: add ax,cx
inc cx
inc cx
cmp ax,23f
jnz begin
brk

Eyad
03-19-2008, 07:37 AM
السلام عليكم :

هذه طريقة أخرى لحل السؤال رقم 9:

9 ) اكتب برنامج لحساب مجموع الأعداد الزوجية من 0 إلى 20: الجواب 110

mov ax,22
mov cx,0
mov dx,0
Begin : add cx,dx
inc dx
inc dx
cmp dx,ax
JNz Begin
Brk;

في البداية تم تحميل كل من المسجلات المذكورة أعلاه بقيمها
الـ ax مسجل يتم من خلاله معرفة هل تم الوصول إلى العدد 20 وتم الانتهاء منه.
الـ dx مسجل فيه العدد الزوجي الذي يتم جمعه.
الـ cx مسجل يتم حفظ القيمة الناتجة عن الجمع الدوري للـ dx .


10 ) اكتب برنامج لحساب مجموع الأعداد الزوجية بحيث لا يتجاوز المجموع 23f :
* تكون قيمة العداد في نهاية الحلقة = 32
هذا هو الحل الصحيح لهذا السؤال والجواب السابق بحاجة إلى التعديل :

mov cx,0000
mov ax,0000
begin: add ax,cx
inc cx
inc cx
cmp ax,23f
js begin
brk

يتم هنا زيادة cx و إضافة قيمتها عند كل زيادة إلى ax ومن ثم مقارنتها "ax"
هل وصلت إلى 23f أم لا
لكن بتمعن بسيط بالعدد 23f لوجدناه عددا فرديا أليس كذلك !!!
لذلك مستحيل أن يكون ناتج الجمع في ax مساويا هذه القيمة لذلك الـ flage z
ليس له عمل هنا لأنها مرتبطة بالنتيجة هل هي معدومة أم لا

Eyad
03-28-2008, 03:29 AM
السلام عليكم ورحمة الله وبركاته :

أما بعد تحية طيبة وعودة محمودة بإذن الله الأعلى :

11)المطلوب نقل 10 عناصر Byte إلى أماكن متقابلة من الموقع 2000 إلى الموقع 2400

mov si,2000
mov di,2400
mov dl,0 //تصفير العداد
Begin : mov cl,[si]
mov [di],cl
inc si
inc di
inc dl //عداد يعد 10 عناصر فقط ليتم نقلها
cmp dl,10
JNz Begin
brk

12) جمع 10 عناصر Word متقابلة من الموقعين 800,e00 ووضع الناتج في الموقع 2000

mov si,800
mov di,2000
mov dl,0 //تصفير العداد
Begin : mov cx,[si]
add cx,[si+600]
mov [di],cx
inc si
inc si
inc di
inc di
inc dl //عداد يعد 10 عناصر فقط ليتم نقلها
cmp dl,10
JNz Begin
brk

طريقة أخرى للحل باعتبار أن المكان الذي سنخزن فيه هو نفسه الذي يبدأ من e00
mov si,800
mov dl,0;
Begin : mov cx,[si]
add [si+600],cx
inc si
inc si
dec dl
JNz Begin
brk
هنا تم اعتماد طريقة جديدة من أجل عد 10 عناصر فقط ألا وهي أن نقوم بإنقاص dl
وبذلك نكون قد قمنا باختصار سطر في البرنامج وبتعبير أدق قمنا بتخفيف وهو المقارنةcmp
ثلاثة بايتات 3Bytes من كل دورة للبرنامج.

Eyad
03-29-2008, 08:33 PM
السلام عليكم ورحمة الله وبركاته :
لا أعلم مدى استفادة الإخوة الطلاب مما نفعل كون عدد المشاهدات ما أراه الآن لكن لا بأس:
بالعودة إلى موضوعنا الأساسي وإلى المشاركة السابقة بالتحديد أردت فقط أن أنوه برقم 600
المضمن ضمن الكود !!
لعلمكم نحن طلاب السنة الثانية ندرس الآن مادة الخوارزميات ونتعلمها وإحدى الغايات المراد الوصول إليها
من هذه المادة هي استخدام موارد النظام باقل كلفة أي ترشيد الموارد المتاحة
ونريد هنا النقل بين موقعين في الذاكرة هما 800,e00 ونحتاج إلى عدادين للتعامل معهما
لكن أذا أعملنا الحس الخوارزمي:cool: سنجد بعملية بسيطة أننا نستطيع الوصول إليهما بعداد واحد
كيف ذلك : باستخدام الفرق بينهما للوصول إلى أحدهما من موقع الآخر e00-800=600
واذا أمعنا النظر وأعملنا الفكر :rolleyes:لوجدنا أننا اختصرنا من حجم برنامجنا عدداً من البايتاتsmil1
وهذا في دورة واحدة.......لكن إذا دار 100دورة ستكون هذه البايتات القليلة مئات4smil!!

وهذا ينطبق على كتابة inc bl مرتين بدل كتابة add bl,2

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

في الأكواد السابقة مزيج من كل ما ذكر .
والله من وراء القصد

Eyad
03-29-2008, 08:43 PM
السلام عليكم ورحمة الله وبركاته

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

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

من الآن سيتم اختيار أقصر طريقة أراها مناسبة مع مباركة الآنسة لها وهي اعتماد cx كعداد تنازلي ينتهي بالصفر واستعمال loop التي تقوم بإنقاص cx عند كل دورة و تتوقف تلقائيا عندما cx =0 وهذه هي الطريقة الأنجع والأنجح لأنها تختصر عددا كبيرا من الـByte
لاستغنائنا عن عملية تحريك العداد ومقارنته في النهاية و من ثم القفز واستغنائنا عن أي قيمة فورية ووضعها في مسجل كما أشارت الآ نسة في حديثها حول هذا .

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

Eyad
04-03-2008, 03:11 PM
السلام عليكم ورحمة الله وبركاته :

أما بعد تحية طيبة وعودة محمودة بإذن الله الأعلى الذي نرجوه أن يعمنا برحمتة وواسع مغفرته
وأن ينهلنا من علمه ما شاء ما يفيدنا لدنيانا وآخرتنا :

15)لتكن لدينا قائمة مؤلفة من 10 عناصر مفروزة تصاعديا والمطلوب منكم رحمكم الله :
a:إعادة فرزها تنازليا بفرض العناصر Word مع استخدام تعليمات المكدس ؟

mov si,2000
mov bl,10
Begin1: push [si]
inc si
inc si
dec bl
jnz Begin1
mov si,2000
mov bl,10
Begin2: pop [si]
inc si
inc si
dec bl
jnz Begin2
brk


*******************************************
و هذه طريقة أخرى باستعمال loop,cx هي التالية :

mov si,1000
mov cx,10
Begin1: push [si]
inc si
inc si
loop Begin1
mov si,1000
mov cx,10
Begin2: pop ax
xchg al,ah
mov [si],ax
inc si
inc si
loop Begin2
brk
*******************************************
b:إعادة فرزها تنازليا بفرض العناصر Byte مع استخدام تعليمات المكدس ؟

mov si,1000
mov cx,10
[Begin1: push [si
inc si
inc si
loop Begin1
mov si,1000
mov cx,10
Begin2: pop ax
xchg al,ah
mov [si],ax
inc si
inc si
loop Begin2
brk

*******************************************
c:إعادة فرزها تنازليا بفرض العناصر Byte دون استخدام تعليمات المكدس ؟

mov si,2000
mov di,200f
mov cx,8
Begin: mov al,[si]
mov ah,[di]
mov [si],ah
mov [di],al
inc si
dec di
loop Begin
brk

*******************************************
:إعادة فرزها تنازليا بفرض العناصر Word دون استخدام تعليمات المكدس ؟

mov si,2000
mov di,201e
mov cx,8
Begin: mov cx,[si]
mov dx,[di]
mov [si],dx
mov [di],cx
inc si
inc si
dec di
dec di
loop Begin
brk

Eyad
04-04-2008, 09:17 AM
السلام عليكم ورحمة الله وبركاته :

أما بعد تحية طيبة

تعددت الطرق للحل والتقدير واحد لها جميعا وهو "صحيح" بإذن الله
طريقة أخرى لحل طلبين من السؤال السابق

15)لتكن لدينا قائمة مؤلفة من 10 عناصر مفروزة تصاعديا والمطلوب منكم رحمكم الله:

c:إعادة فرزها تنازليا بفرض العناصر Byte دون استخدام تعليمات المكدس ؟

mov si,2000
mov di,200f
mov cx,8
Begin: mov al,[si]
xchg [di],al
mov [si],al
inc si
dec di
loop Begin
brk

*******************************************
d:إعادة فرزها تنازليا بفرض العناصر Word دون استخدام تعليمات المكدس ؟

mov si,2000
mov di,201e
mov cx,8
Begin: mov dx,[di]
mov [si],dx
mov [di],cx
inc si
inc si
dec di
dec di
loop Begin
brk

ملك التصميم
04-04-2008, 02:21 PM
بسم الله ماشاء الله

الشباب منورين وماشاء الله عليهم مو مقصرين يعني يوم المذاكرة حرام ننقص أي علامة

بس إخواني لي طلب بسيط
ياريت تحطولنا التعليمات وFlags التي تتعامل معها لكي تعم الفائدة

لأن معلومات هذه المادة ليست مختصرة على التمارين

والله يوفقكم ووحده الذي يعلم مدى حبنا لكم

تحياتي..

Eyad
04-05-2008, 09:53 AM
السلام عليكم ورحمة الله وبركاته

16)لتكن لدينا قائمة مؤلفة من 100عنصر Byte موجودة في الموقع 2000 والمطلوب :

أ)نقل العناصر الموجبة إلى الموقع 800 والسالبة منها إلى الموقع 400 :

mov si,2000
mov di,800
mov bx,400
Begin1: mov ax,[si]
cmp ax,0
js Begin2
mov [di],ax
inc di
inc si
cmp si,2100
jnz Begin1
brk
Begin2: mov [bx],ax
inc bx
inc si
cmp si,2100
jnz Begin1
brk

ب)الطلب السابق مع حساب عدد هذه العناصر في القائمتين:




mov si,2000
mov di,800
mov bx,400
mov cx,0 // يعد الأعداد السالبة
mov dx,0 // يعد الأعداد الموجبة
Begin1: mov ax,[si]
cmp ax,0
js Begin2
mov [di],ax
inc di
inc si
inc dx
cmp si,2100
jnz Begin1
brk
Begin2: mov [bx],ax
inc bx
inc si
inc cx
cmp si,2100
jnz Begin1
brk

ج)النقل السابق + حساب مجموع الأعداد الموجبة والسالبة :

mov si,2000
mov di,800
mov bx,400
mov cx,0
mov dx,0
Begin1: mov ax,[si]
cmp ax,0
js Begin2
mov [di],ax
inc di
inc si
add cx,ax
cmp si,2100
jnz Begin1
brk
Begin2: mov [bx],ax
inc bx
inc si
add dx,ax
cmp si,2100
jnz Begin1
brk

من بين هذا الصخب البرمجي أطل عليكم عسى أن يلهمني الله شرحا لما سبق أفك به طلاسم
ما سبق كتابته :
يتم أولا تجهيز المسجلات المطلوبة
ثم يتم وضع القيمة التي وصلنا إليها في مسجل ax للتتم عليه جميع العمليات التي سنجريها
هل القيمة في axسالبة (أصغر من الصفر)إذهب إلى الموقع المشار عليه بـ Begin2
إذا كانت القيمة سالبة سيذهب وينقل هذه القيمة السالبة الموجودة في axإلى قائمة تبدأ بـ 400
وهي التي يؤشر عليها bx سيتم تحريك مؤشري القائمتين ويتم اختبار هل انتهت قائمتنا ذات
الـ 100 عنصر إذا كانت قد انتهت اخرج وإلا عد لنقارن عنصرا جديدا في قائمنتا ...حتى تنتهي
أما إذا لم يكن سالبا لم يقفز وتابع مسيرة تسلسل أسطر التعليمات وقام بنفس الخطوات المذكورة
أعلاه مع النقل إلى قائمة تبدأ من 800

بالنسبة للطلب الثاني الحسابي قمنا فقط بعد عناصر كل قائمة ناتجة من خلال طرح القيمة الإبتدائية
من النهائية
أما بشأن الطلب الأخير تم إضافة مسجل لكلا القائمتين لجمع عناصرهما كلا على حده

Eyad
04-05-2008, 01:11 PM
السلام عليكم :

وكأني باسم:cool: :cool:EYAD يلمع في الأفق :eek:وينير أمامي "بالتوافق مع مشاركاتي" هذا الموضوع
مزحة جميلة;);) مني بهذا الكلام المؤنق ......

المهم هناك سؤال ...:confused:.. ممممم لا بأس :
نعيد السؤال ليتم الجمع بينه وبين الإجابة للذي ربط اسمه باسمي ولهذا لن أرد على ما يقوله من ترهات:cool::

المشاركة الأصلية كتبت بواسطة Eyad Chalenger
16.5)لتكن لدينا قائمة مؤلفة من 10 عناصر مفروزة تصاعديا والمطلوب حساب مجموع الأعداد الزوجية و مجموع الأعداد الفردية حيث تكون النتيجة في مواقع ذاكرة


mov si,2000
mov ax,0 //لجمع الأعداد الفردية
mov bx,0 //لجمع الأعداد الزوجية
mov cx,10//لعد 10 عناصر
Begin1: test [si],0
jnz Begin2
add ax,[si]
inc si
jmp End
Begin2: add bx,[si]
inc si
End: loop Begin1
brk

Eyad
04-06-2008, 07:57 AM
السلام عليكم :

طريقة أخرى لحل السؤال رقم 16الطلب الأول

mov si,2000
mov di,800
mov bx,400
mov cx,100
Begin1: mov ax,[si]
cmp ax,0 // هذه طريقة,باستخدام مقارنة القيمة مع الصفر
js Begin2
mov [di],ax
inc di
inc si
jmp End //هذه تعليمة القفز الغير مشروط
Begin2: mov [bx],ax
inc bx
inc si
End : loop Begin1
brk

هنا قمنا فقط باختصار عدد من البايتات تلك التي كانت تصرف على المقارنة ومن ثم القفز على إثرها
وذلك باستخدام التوأم loop & cx واحذف المكرر من الأسطر بين معالجة نوعي الأعداد

وهذه أخرى لكن هذه المرة باستعمال RCl & ROR وهذه طريقة باستخدام الإزاحة:

mov si,2000
mov di,800
mov bx,400
mov cx,100
Begin1: mov ax,[si]
Rcl ax,1 // هنا تتم الإزاحةأو الدوران
jc Begin2
RoR ax,1 //وهنا العودة عن الإزاحةفي حال كان العدد موجب
mov [di],ax
inc di
inc si
jmp End
Begin2: RoR ax,1// وهنا العودة عن الإزاحةفي حال كان العدد سالب
mov [bx],ax
inc bx
inc si
End : loop Begin1
brk

بعملية الإزاحة يتم وضع أكبر قيمة في Carry Flagواختبارها هل هي صفر"العدد سالب" أم لا"العدد موجب"

وهذه أخرى باستخدام Test
مع الأخذ بالعلم أن القيم التي فوق 80هكسا هي قيم سالبة والتي أسفل منها موجبة :


mov si,2000
mov di,800
mov bx,400
mov cx,100
Begin1: mov ax,[si]
test ax,80 // هنا يتم اختبار القيمة
jnz Begin2
mov [di],ax
inc di
inc si
jmp End
Begin2: mov [bx],ax
inc bx
inc si
End : loop Begin1
brk
وأخيراً وليس آخراً هذه طرق تغني مجموعة الحلول كما وأسأل الله لنا جميعا العلم الذي تنتفع به الأمة
كما وتغني أفكارنا عن هذه المادة الجميلة وتزيد من أفق مداركنا لأنها لغة برمجية فيها من الحلول
ما شاء الله أما بقية الطلبات ستسير بنفس الركب والطريقة .
والسلام عليكم

Eyad
04-06-2008, 11:13 AM
16.75)
المشاركة الأصلية كتبت بواسطة Eyad Friend
المطلوب :برنامج لتخزين 100 رقم من سلسلة فيبوناتشي في مواقع متسلسلة بالذاكرة تبدأ بالموقع 2000
سلسلة فيبوناتشي بدءا من الموقع 2000

mov ax,0
mov bx,1
mov si,2000
mov cx,100
mov [si],ax
inc si
mov [si],bx
Begin: mov dx,ax
add dx,bx
inc si
mov [si],dx
mov ax,bx
mov bx,dx
loop Begin
brk
وبانتظار المزيد من الأعضاء الذين ترتبط أسماؤهم باسمي ولو كانو من نفس الشخص كما هو الحال الآن

المشاركة الأصلية كتبت بواسطة صعب المنال
صديق اياد:cool: ..عاشق اي:eek:اد... وما ينقص ..مرافقة اياد :cool:...قوات اياد الخاصة.:rolleyes:... شفير اياد;) ....
شئ رائع
مدري ليش كل الهلوسة 3smilعلى اسمي

Eyad
04-19-2008, 01:00 PM
السلام عليكم :


17) من المعلوم أنه عند تنفيذ تعليمة Call يتم تخزين عنوان الموقع الذي يليها في المكدس
فكيف يمكننا أن نجعله يعود إلى سطر تعليمة الـ Callنفسها عند تنفيذ سطر ret
دون العودة إلى التعليمة التي تلي تعليمة الـCall


call A
A : mov si,sp
mov cx,ss:[si]
sub cx,3 //لأنه قريب مباشر
mov ss:[si],cx
Ret

call A
A : pop cx
sub cx,3
push cx
Ret

Eyad
04-19-2008, 01:01 PM
السلام عليكم :

16.95)المطلوب ايجاد القاسم المشترك الأكبر لعددين مو جودين في ax,bx
في البداية يتم شحن المسجلين المذكورين بقيمتين مختارتين ثم :

Begin : cmp ax,bx
jz End
js Begin2
sub ax,bx
jmp Begin
Begin2: sub bx,ax
jmp Begin
End : Brk

Eyad
04-19-2008, 01:18 PM
18)
لدينا قائمة موجودة في الموقع 2000 عناصرها Byte فيها أرقام عشوائية من 0-->3
ولدينا قيمتين موجودتين في ax,bx
عندما الرقم 0 ----> يوقف البرنامج
عندما الرقم 1 ----> يحمع القيمتين
عندما الرقم 2 ----> يطرح إحدى القيمتين من الأخرى
عندما الرقم 3 ----> يضاعف كلاً من القيمتين
المطلوب :
كتابة برنامج يحقق ما سبق ,بعد قراءة رقم يدل على العملية المطلوبة من قائمة تبدأ بالموقع 2000 والتخزين في قائمة أخرى تبدأ من الموقع 2020 ؟

هاكم ثلاثة حلول بطريقتين اثنتين :
[1] نفوم هنا بقارنة القيمة الحالية من قائمة 2000 مع 3,2,1,0 بالترتيب ومن ثم الذهاب
إلى مكان المعالجة :


mov si,2000
mov di,2020
mov al,5 ;First value you can enter it
mov bl,3 ;Second value you can enter it
Begin : cmp [si],0
JNz A
Brk
A : cmp [si],1
JNz B
call Add
Jmp Begin
B : cmp [si],2
JNz C
call Sub
Jmp Begin
C : cmp [si],3
JNz Begin ;إذا لم تكن القيمة من 0 إلى 3 عد إلى البداية
call AddSelf
Jmp Begin

Add : mov dl,al
add dl,bl
mov [di],dl
inc di
inc si
Ret
Sub : mov dl,al
Sub dl,bl
mov [di],dl
inc di
inc si
Ret
AddSelf:mov dl,al
add dl,al
mov [di],dl
inc di
mov dl,bl
add dl,bl
mov [di],dl
inc di
inc si
Ret

Eyad
04-19-2008, 01:19 PM
18)
[2]هنا سنقوم بالتعديل على الحل السابق بأن نختصر عمليات المقارنة الأربعة باثنتين
سنختبر هل القيمة 0 إذا Brk وإلا
هل القيمة 2 إذا sub وإلا هل نتيجة المقارنة سالبة اذا القيمة 1 إذا Add
وإلا فنتيجة المقارنة موجبة (Not Sign) أي القيمة 3 إذا AddSelf




mov si,2000
mov di,2020
mov al,5
mov bl,3
Begin : cmp [si],0
JNz A :هل القيمة 0
Brk
A : cmp [si],2
Jz B : هل القيمة 2
Js C : وإلا هل نتيجة المقارنة سالبة
call AddSelf : وإلا
Jmp Begin
B : call Sub
Jmp Begin
C : call Add
Jmp Begin

Add : mov dl,al
add dl,bl
mov [di],dl
inc di
inc si
Ret
Sub : mov dl,al
Sub dl,bl
mov [di],dl
inc di
inc si
Ret
AddSelf:mov dl,al
add dl,al
mov [di],dl
inc di
mov dl,bl
add dl,bl
mov [di],dl
inc di
inc si
Ret

Eyad
04-19-2008, 01:22 PM
[3] الطريقة الاخرى :
وهي بدون أي عملية مقارنة بأن نضع تعليمات Call في مكان نقفز إليه من مكان أخر
يطلب بالعملية التالية : { Call { [2000]*2 +500
أي نضاعف القيمة في قائمة 2000 ثم نضيف إليها 500 هو مكان القفز إلى تعليمات call


mov si,2000
mov di,2020
mov al,5
mov cl,3
mov bx,0
Begin : mov bl,[si]
add bx,bx
add bx,500
call [bx]
Jmp Begin

500: Brk
502: Jmp add //Jmp short 2Byte
504: Jmp Sub //Jmp short 2Byte
506: Jmp AddSelf //Jmp short 2Byte
//الفرق بين العنوان الحالي والعنوان الذي يتم القفز إليه لا يتجاوز 80
// Byteوإلا ستأخذ 3

Add : mov dx,ax
add dx,bx
mov [di],dx
inc di
inc si
Ret
Sub : mov dx,ax
Sub dx,bx
mov [di],dx
inc di
inc si
Ret
AddSelf:mov dx,ax
add dx,ax
mov [di],dx
inc di
mov dx,bx
add dx,bx
mov [di],dx
inc di
inc si
Ret

Eyad
04-20-2008, 11:32 AM
طريقة الآنسة :

mov si,2000
mov di,2020
mov [100],5
mov [105],3
mov ax,2050
mov [2050],125 //هنا القيم عشوائية
mov [2052],126 //فقط للتعبير عن
mov [2054],136 //موقع تعليمات
mov [2056],145 //المعالجة المطلوبة
mov cx,10
mov bx,0
Begin : mov bl,[si]
add bx,bx
add bx,ax // + 2050 يعني
call [bx]
loop Begin
125 : Brk

126 Add:mov dl,[100]
add dl,[105]l
mov [di],dl
inc di
inc si
Ret
136 Sub:mov dl,[100]
Sub dl,[105]
mov [di],dl
inc di
inc si
Ret
145 Mul:mov dl,[100]
add dl,[100]
mov [di],dl
inc di
mov dl,[105]
add dl,[105]
mov [di],dl
inc di
inc si
Ret

Eyad
04-29-2008, 04:54 PM
ليكن لدينا قائمة تحوي أعمار 50 شخص والمطلوب حساب متوسط أعمارهم 19):

mov si,2000
mov ax,0
mov cx,50
mov dl,50 //لنقسم على 50 بعد جمع الأعمار لأنه لا يمكننا القسمة على قيمة فورية
Begin : add al,[si]
inc si
loop Begin
adc al,ah
Div dl // (ax/dx)
Brk

Eyad
05-01-2008, 03:09 AM
20)لتكن لدينا قائمة تحوي عناوين برامج فرعية والعناوين موجودة في قائمة تبدا بـ 2000 على الترتيب
يتم قراءة عنوان البرنامج من البوابة 62 علما بأن أرقام البرامج من 0-->10
والرقم 10 لإيقاف هذا البرنامج.

mov si,2000
mov cx,10
mov ax,0
Begin : in al,62
cmp al,10
Jz End
mov bx,ax
shl bx // add bx,bx
call[si+bx]
loop Begin
End : Brk

Eyad
05-01-2008, 03:16 AM
21)لتكن لدينا قائمة تحوي 20 عدد تبدأ بالموقع 800 والمطلوب :
تحويل الأعداد الفردية إلى زوجية ؟

يتم معرفة العدد أزوجي هو ام فردي وذلك من خلال الخانة الأولى .

mov si,800
mov cx,20
Begin : test [si],0
Jnz End
Add [si],1
End : inc si
loop Begin
brk

Eyad
05-04-2008, 04:55 PM
السلام عليكم :

22) :لتكن لدينا قائمة تبدأ من الموقع 2000 تحتوي أعمار 50 موظف
المطلوب :
فرز أعمار الموظفين ثم نقل من تجاوز الستين60(بالنظام العشري) إلى قائمة تبدأ بالموقع 400
وحساب عددهم وحساب من هم تحت الستين ؟


mov si,2001
mov Cx,50

Begin : mov di,2000
mov Ax,si
sub Ax,di
S.cmp : mov dl,[si]
cmp dl,[di]
Jns reEnd
xchg [di],dl
xchg [si],dl
reEnd : inc di
dec al
cmp al,0
jnz S.cmp
inc si
loop Begin
//الأن وبعد الفرز سنعالج عملية نقل من هم فوق الـ60
mov si,2000
mov di,400
mov cx,50
mov Bl,0 //لحساب عدد الذين هم فوق60
M.cmp : cmp [si],3c // مقارنة العمر مع 60
Jns move // إذا كان العمر فوق الـ 60 اذهب إلى معالجة النقل
inc si
loop M.cmp
brk

move : mov dl,[si]
mov [di],dl
inc di
inc si
inc Bl
loop move
mov Al,50 // blلحساب عدد الذين هم تحت60 نبدأ به هكذا لننقص منه فيما بعد
sub bl
Brk

الساعي
05-05-2008, 07:04 AM
بسم الله الرحمن الرحيم

11) لدينا قائمة تحوي أعمار الموظفين وينتهي الإدخال بالعدد (0) أكتب برنامج يقوم بفرز هذه القائمة ونقل الأعمار التي تكون ستين فما فوق إلى قائمة أخرى تبدأ بالموقع 800
علما أن القائمة الأعمار تبدأ من الموقع 2000 واحسب عددهم?


MOV BX,2000
MOV SI,0000
LABEL1:MOV Al,[BX+SI]
MOV DI,SI
INC SI
CMP AL,00
JZ LABEL3
LABEL2: MOV AH,[BX+DI]
INC DI
CMP AH,00
JZ LABEL1
CMP AL,AH
JS LABEL2
MOV [BX+SI-1],AH
MOV [BX+DI-1],AL
XCHG AL,AH
JMP LABEL2


LABEL3:MOV SI,0000
MOV DI,0800
LABEL4:MOV AL,[BX+SI]
INC SI
CMP AL,00
JZ LABEL5
CMP AL,60
JS LABEL4
MOV [DI],AL
INC DI
JMP LABEL4
LABEL5:BRK



تم بعون الله هذا الحل وتم تعديله فقد كنت قد أغفلت سطرا عند كتابته أثناء بقله من برنامج الـ SIM أرجو دعوة صالحة لي ولأخي Eyad
السلام عليكم ورحمة الله وبركاته
لا إله إلا الله محمد رسول الله

Eyad
06-26-2008, 06:20 PM
السلام عليكم :

أيام جميلة مرت علينا في هذا المعهد وهذا المنتدى

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

طبعا قمت شخصيا بحذف جميع المشاركات التي لا تمت إلى الهدف الاساسي للموضوع بصلة والتي كان عددها بين 15-20

والسلام مسك الختام