ملاحظات
»» إذا تجاوزت هذه الفقرة فلا تخف أبدا من المجمع، كما أن تمارين هذه الفقرة تمكنك من التفكير في كيفية صنع أسس لغات البرمجة كـ C أو Pascal.
»»وكذلك ستبتعد عن قواطع DOS حتى لا تكون مرتبطا به ليِؤدي بك التفكير في كيفية إنشاء نظام تشغيل جديد كـ DOS أو UNIX..
»»هذه الفقرة بالذات مرتبطة مع جميع الفقرات التي مررت بها، لهذا فيجب أن تقوم بمراجعتها كلها وخصوصا فقرة العنونة والمكدس والدوال.
1. مقدمة
الجداول عبارة عن مجموعة من العناصر أو متغيرات لها نفس النوع.
المتسلسلات الحرفية عبارة عن جمل أو كلمات وبمعنى أدق عبارة عن جداول متكونة من حروف.
ولربما رأيت أننا تطرقنا في الفقرات السابقة إلى معرفة دور بعض الخزانات المؤشرة كـ :
- IP : مؤشر الأوامر حيث من خلاله يتم أخد عنوان الأمر الذي يجب تنفيذه من الذاكرة.
- SP : مؤشر المكدس الذي يراقب عمليات الإدخال في المكدس.
- BP : مؤشر القاعدة الذي يراقب عمليات التغيير والقراءة في المكدس.
- وبقي لنا المؤشرين SI و DI ..
رغم أننا قد تطرقنا للمؤشرين SI و DI لكن ليس بكيفية متعمقة. ففي هذه الفقرة سنستعملهما بشكل واسع...
- SI : يسمى بمؤشر المرسل.
- DI : يسمى بمؤشر المستقبل (أو المرسل إليه).
من خلال اسميهما قد يتبادر إلى الدهن أن هناك عمليات تحويل أو إرسال بين شيئين، وهذا صحيح.
2. الجداول
2.1 مميزات الجدول
عند التعامل مع الجداول يجب أن تتعرف على ما يلي :
-
عنوان أول عنصر للجدول.
-
عدد الأثمان التي يحجزها كل عنصر.
-
رقم الخانة التي ينتمي إليها كل عنصر. (رقم أول خانة أو أول عنصر هو 0 كما الحال في C)
2.2 تعريف الجدول
يمكن أن يكون الجدول:
+إما مملوءا، في هذه الحالة سيكون معرفا في منطقة التعريفات المهيأة.
+أو غير مملوء في هذه الحالة سيكون معرفا في منطقةالتعريفات غير المهيأة.
أمثلة:
[segment .data] ; نعرف جدولا ذي 10 عناصر مهيأة ذات الحجم نصف أي 4 أثمان لكل عنصر a1 dd 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 a2 dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; نعرف جدولا ذي 10 عناصر من نوع ربع أي ثمنين a3 times 10 dw 0 ; نفس التعريف الذي يسبقه a4 times 200 db 0 ; نعرف جدولا ذي 200 عنصر الأولى مهيأة بـ 0 و100 عنصر الأخيرة مهيأة بـ 1 times 100 db 1 [segment .bss] a5 resd 10 ; نعرف جدولا ذي 10 عناصر غي مهيأة ذات الحجم نصف أي 4 أثمان لكل عنصر a6 resw 100 ; نعرف جدولا ذي 100 عناصر غي مهيأة ذات الحجم ربع أي ثمنين لكل عنصر |
حجم الجداول الإجمالي في الذاكرة:
الجدول | النوع | الحساب | عدد الأثمان |
a1 | dd | 4×10 | 40 |
a2 | dw | 2×10 | 20 |
a3 | dw | 2×10 | 20 |
a4 | db | 1×300 | 300 |
a5 | dd | 4×10 | 40 |
a6 | dw | 2×100 | 200 |
2.3 الدخول إلى عناصر الجدول أو استعمالها
نعتبر الجداول التالية:
jadwal1 db 5, 4, 3, 2, 1 |
حجم الجداول الإجمالي في الذاكرة:
الجدول | النوع | الحساب | عدد الأثمان |
jadwal1 | db | 1×5 | 5 |
jadwal2 | dw | 2×5 | 10 |
jadwal3 | dd | 4×5 | 20 |
رقم الخانات أو العناصر بالنسبة للجدول ذي النوع db يزداد بـ 1 (أي 0 , 1 , 2 , 3 ....)
رقم الخانات أو العناصر بالنسبة للجدول ذي النوع dw يزداد بـ 2 (أي 0 , 2 , 4 , 6 ....)
رقم الخانات أو العناصر بالنسبة للجدول ذي النوع dd يزداد بـ 4 (أي 0 , 4 , 8 , 12 ....)
وهكذا...
أمثلة لاستعمال الجدول مع ما تكافئها في C.
mov al, [jadwal1] ; al = jadwal1[0] [segment .data] |
3. المتسلسلات الحرفية
3.1 تعريف المتسلسلة الحرفية
يمكن أن تكون المتسلسلة الحرفية:
+ مملوءة في هذه الحالة ستكون معرفة في منطقة التعريفات المهيأة،
+غير مملوءة في هذه الحالة ستكون معرفا في منطقة التعريفات غير المهيأة.
المتسلسلة الحرفية دائما من نوع db أي أن كل عنصر فيها يحجز ثمنا واحدا فقط في الذاكرة، وحجم المتسلسلة مرتبط بمجموع أحجام عناصرها.
أمثلة:
[segment .data] jomla1 db 'S','a','l','a','m','o',' ','3','a','l','a','i','k','o','m','$' jomla2 db 'Salamo 3alaikom$' ; نفس التعريف الذي يسبقه jomla3 db 'Salamo ','3alaikom','$' ; نفس التعريف الذي يسبقه jomla4 times 200 db 'A' times 100 db 'B' [segment .bss] jomla5 resb 10 jomla6 resb 100 |
حجم الجداول الإجمالي في الذاكرة:
المتسلسلة | النوع | الحساب | عدد الأثمان |
jomla1 | db | 1×16 | 16 |
jomla2 | db | 1×16 | 16 |
jomla3 | db | 1×16 | 16 |
jomla4 | db | 1×300 | 300 |
jomla5 | db | 1×16 | 10 |
jomla6 | db | 1×16 | 100 |
3.2 الدخول إلى أو استعمال عناصر المتسلسلة
رقم الخانات أو العناصر بالنسبة للمتسلسلة يزداد بـ 1 (أي 0 , 1 , 2 , 3 ....)
أمثلة لاستعمال المتسلسلة مع ما تكافئها في C.
mov al, [jomla1] ; al = jomla1[0] |
3.3 كتابة جملة على الشاشة
قد تطرقنا إلى ذلك في الفقرة السابقة من الدرس، لكن لا بأس للإعادة ، ففي كل إعادة إفادة...
الدالة Oktob |
داخل المشروع |
ويمكنك كتابة |
Oktob : push ax push dx push bp mov bp,sp mov dx,[bp+8] mov ah,09h int 21h pop bp pop dx pop ax ret 2 |
.... .... push word jomla ;المرور بالعنوان call Oktob .... .... jomal db 'Salamo 3alaikom','$' |
.... .... mov si,jomla push si ;المرور بالعنوان call Oktob .... .... jomla db 'Salamo 3alaikom','$' |
4. الأدوات المتحكمة في المتسلسلات
4.1 الأدوات CLD و STD اللتين تتحكما في علم الاتجاه DF
DF=0 <===== CLD
DF=1 <===== STD
4.2 أدوات نقل أو نسخ متسلسلة في أخرى
الأداة MOVSB
تقوم هذه الأداة بنسخ ثمن واحد (أو حرف بشكل أدق) من العنوان DS:SI إلى العنوان ES:DI (المرسل والمرسل إليه).
حيث أن SI و DI يزدادا بـ 1 إذا كان DF=0 وينقصا بـ 1 إذا كان DF=1 .
مثال:
cld ;df=0 mov si , jomla1 mov di , jomla2 movsb ;jomla2='S' أصبحت [segment .bss] jomla1 db 'Salamo' [segment .bss] jomla2 resb 6 |
الأداة MOVSW
تقوم هذه الأداة بنسخ ربع يعني ثمنين في آن واحد (أي حرفين بمعنى أدق) من العنوان DS:SI إلى العنوان ES:DI (المرسل والمرسل إليه).
حيث أن SI و DI يزدادا بـ 2 إذا كان DF=0 وينقصا بـ 2 إذا كان DF=1 .
مثال:
cld ;df=0 mov si , jomla1 mov di , jomla2 movsw ;jomla2='Sa' أصبحت [segment .bss] jomla1 db 'Salamo' [segment .bss] jomla2 resb 6 |
الأداة MOVSD
تقوم هذه الأداة بنسخ نصف أي 4 أثمان في آن واحد (أي 4 حروف بمعنى أدق) من العنوان DS:SI إلى العنوان ES:DI (المرسل والمرسل إليه).
حيث أن SI و DI يزدادا بـ 4 إذا كان DF=0 وينقصا بـ 4 إذا كان DF=1 .
مثال:
cld ;df=0 mov si , jomla1 mov di , jomla2 movsd ;jomla2='Sa' أصبحت [segment .bss] jomla1 db 'Salamo' [segment .bss] jomla2 resb 6 |
ملاحظة : ربما تفكر أو تود نقل الجملة 1 كلها إلى الجملة 2 وهذا هو دور الأداة REP
الأداة REP
تقوم هذه الأداة بعملية تكرار أداة أخرى حتى يصبح CX يساوي 0.
حيث أن CX ينقص بـ 1.
مثال1: rep و movsb
cld ;df=0 mov si , jomla1 mov di , jomla2 mov cx,6 rep movsb ;jomla2='Salamo' أصبحت [segment .bss] jomla1 db 'Salamo' [segment .bss] jomla2 resb 6 |
تكافئ |
cld mov si , jomla1 mov di , jomla2 movsb movsb movsb movsb movsb movsb [segment .bss] jomla1 db 'Salamo' [segment .bss] jomla2 resb 6 |
مثال2: rep و movsw
cld ;df=0 mov si , jomla1 mov di , jomla2 mov cx,3 rep movsw ;jomla2='Salamo' أصبحت [segment .bss] jomla1 db 'Salamo' [segment .bss] jomla2 resb 6 |
تكافئ |
cld mov si , jomla1 mov di , jomla2 movsw movsw movsw [segment .bss] jomla1 db 'Salamo' [segment .bss] jomla2 resb 6 |
مثال3: rep و movsd
cld ;df=0 mov si , jomla1 mov di , jomla2 mov cx,1 rep movsd ;jomla2='Sala' أصبحت movsw ;jomla2='Salamo' أصبحت [segment .bss] jomla1 db 'Salamo' [segment .bss] jomla2 resb 6 |
تكافئ
|
cld mov si , jomla1 mov di , jomla2 movsd movsw [segment .bss] jomla1 db 'Salamo' [segment .bss] jomla2 resb 6 |
الأداة REPE أو REPZ
تقوم هذه الأداة بعملية تكرار أداة أخرى حتى يصبح CX يساوي 0 أو يصبح محتوى ES:DI يساوي محتوى DS:DI.
حيث أن CX ينقص بـ 1. وتنفع هذه الدالة في مقارنة جملتين.
مثال:
cld ;df=0 mov si , jomla1 mov di , jomla2 mov cx,6 repe movsb ;o و i تتوقف الحلقة التكرارية عند الحرفين [segment .bss] jomla1 db 'Salamo 3alaikom' jomla2 db 'Salami 3alaikom' [segment .bss] |
الأداة REPNE أو REPNZ
تقوم هذه الأداة بعملية تكرار أداة أخرى حتى يصبح CX يساوي 0 أو يصبح محتوى ES:DI يخالف محتوى DS:DI.
حيث أن CX ينقص بـ 1. وتنفع هذه الدالة في مقارنة جملتين.
مثال:
cld ;df=0 mov si , jomla1 mov di , jomla2 mov cx,6 repne movsb ;l و l تتوقف الحلقة التكرارية عند الحرفين [segment .bss] jomla1 db 'Salamo 3alaikom' jomla2 db 'KolSoooooooo' [segment .bss] |
5. إنشاء دالة تقوم بإظهار جملة منتهية بالقيمة 0
من المفضل أن تقرأ معطيات التمرين التالي لتقوم بإنجاز دالة لإظهار جملة على الشاشة تكون منتهية بالقيمة 0.
ملاحظة : لا تستعمل أبدا الدالة 9h للقاطعة 21h، لأنه من المفضل التخلص من دوال النظام DOS، ولكن يمكنك استعمال الدالة 0Eh للقاطعة 10h التي تقوم بإظهار حرف واحد فقط.
التمرين 14.1
هذه الطريقة يعتمد عليها المترجم C لإظهار الجمل على الشاشة (حيث يضيف دائما القيمة '0\' التي تعني 0 أو nul في آخر الجملة)
في هذه الحالة سنستعمل حلقة تكرارية لا تتوقف إلا بشرط أن يساوي آخر عنصر في المتسلسلة القيمة 0.
أنجز الدالةoktob بحيث يجب عليها أن تكون كاملة ونظيفة.
مثال للاستعمال :
مثال في المجمع | النتيجة على الشاشة | |
push word jomla |
Salamo 3alaikom |
6. إنشاء دالة تقوم بإظهار المتغيرات الموجبة
أي إنشاء دالة تقوم بإظهار الأعداد التي تحتوي عليها سواء المتغيرات أو الخزانات.
6.1 مقدمة
نعلم أنه يوجد خزانات ذات الأحجام التالية:
عدد الأثمان | مثلا |
1 | AH و AL و CL و .... |
2 | AX و BX و CX و .... |
4 | EAX و EBX و ECX و .... |
ونعلم أنه يوجد متغيرات يمكنك تعريفها ذات الأحجام التالية:
عدد الأثمان | النوع |
1 | DB و RESB |
2 | DW و RESW |
4 | DD و RESD |
8 | DQ و RESQ |
10 | DQ و RESQ |
إن كنت ممن درس اللغة C ربما تساءلت ذات يوم: لماذا يفرض C على المستعمل إن أراد أن يظهر محتوى متغير على الشاشة عندما نستعمل الدالة ()printf مثلا ؟
مثال :
char d='F'; |
في الحقيقة يقوم C أعني الدالة printf باستدعاء مجموعة من الدوال كل واحدة على حدة لتقوم بإظهار جميع المتغيرات المطلوب لإظهارها على الشاشة: مثلا واحدة من أجل المتغيرات ذات الشكل c% وأخرى ذات الشكل d% وهكذا ...
التمرين 14.2
أنجز دالة oktob8 حيث تقوم بإظهار الأعداد الموجبة من 0 إلى 255. (أي الأعداد ذات الحجم ثمن واحد فقط أي ذات النوع db أو resb).
استعمل خزانا واحدا فقط للدخول إلى الدالة.
مثال في المجمع | النتيجة على الشاشة | |
mov dh,65 |
65 |
التمرين 14.3
أنجز دالة oktob16 حيث تقوم بإظهار الأعداد الموجبة من 0 إلى 65335. (أي الأعداد ذات الحجم ربع واحد فقط أي ذات النوع dw أو resw).
استعمل خزانا واحدا فقط للدخول إلى الدالة.
مثال في المجمع | النتيجة على الشاشة | |
mov ax,5124 |
5124 |
التمرين 14.4
أنجز دالة oktob32 حيث تقوم بإظهار الأعداد الموجبة من 0 إلى 4294967295. (أي الأعداد ذات الحجم نصف واحد فقط أي ذات النوع dd أو resd).
استعمل خزانا واحدا فقط للدخول إلى الدالة.
مثال في المجمع | النتيجة على الشاشة | |
mov eax,429496 |
429496 |
تمارين تطبيقية
قوانين :
- من المفضل أن تكون الدوال كاملة و نظيفة إلا عندما أشير عليك أن لا تهتم .
- دالة رجعية : تقبل نتيجة يجب أن وضعها في المكدس
- دالة لارجعية : لا تقبل نتيجة أي تقوم بتطبيق فعل فقط.
- من أجل إظهار الأرقام استعمل الدوال oktob8 و oktob16 و oktob32 المتطرق إليها في هذه الفقرة كل حسب طبيعة المتغيرات.
- استعمل الدالة oktob من أجل إظهار الجمل المنتهية بالقيمة 0. (لا تستعمل الآن oktobe).
- استعمل دائما في جميع مشاريعك هذا الشكل:
;NASM-IDE ASM Assistant Assembler Project File [SEGMENT .data] ;هنا نضع التعريفات المهيأة M resw 125 |
الدوال الأساسية
أنجز الدوال التالية :
- putchar : تقوم بإظهار حرف على الشاشة (دالة لارجعية).
- getchar : تقوم بقراءة حرف من لوحة المفاتيح مع إظهاره على الشاشة (دالة رجعية).
- getch : تقوم بقراءة حرف من لوحة المفاتيح دون إظهاره على الشاشة (دالة رجعية).
- kbhit : تقوم فقط بمعرفة هل تم الضغط على مفتاح أم لا (دالة رجعية).
- gotoxy : تقوم بالذهاب إلى موقع معين من الشاشة.
- clrscr : تقوم بمسح الشاشة كليا.
- قم بإنجاز شفرة لقراءة حرف بالدالة getch وإظهاره بالدالة putchar .
- قم بإنجاز شفرة لقراءة حرف بالدالة getchar وإظهاره بالدالة putchar .
- قم بإنجاز شفرة لا تتوقف حتى يضغط المستعمل على مفتاح باستعمال الدالة kbhit.
- قم بإنجاز شفرة تقوم بقراءة حرف بالدالة getchar وإظهاره بالدالة putchar في وسط الشاشة.
- قم بإنجاز شفرة لتمتحن الدوال oktob8 و oktob16 و oktob32.
ملاحظة : ضع هذه الدوال مع الدالة oktob في مكتبة سمها stdio.inc .
أنجز شفرة تقوم بقراءة حرف باستعمال
- الدالة getchar وأظهر رقمه ASCII باستعمال الدالة oktob8.
- الدالة getch وأظهر رقمه ASCII باستعمال الدالة oktob8.
أنجز شفرة تقوم بتعريف 3 متغيرات لـ 3 جمل :'ALLAH Akbar' و 'Besmi ALLAH' و 'Salam 3alaikom' منتهية بـ 0.
أظهر هذه الجمل على الشاشة كما يلي : |
ALLAH Akbar Besmi ALLAH Salam 3alaikom |
استعمل الدالتين gotoxy و oktob.
أنجز دالة ikra تقوم بقراءة جملة من لوحة المفاتيح وأن تضع القيمة 0 في آخرها.
أظهرها بعد ذلك بالدالة oktob.
ملاحظة : ضع هذه الدالة في المكتبة stdio.inc .(هذه الدالة تكافئ الدالة gets في اللغة C)
أنجز الدوال التالية :
- scanf8 لقراءة عدد من لوحة المفاتيح (ذو الحجم ثمن واحد فقط : الأعداد الموجبة) يأخذه متغير حجمه ثمن واحد.
- scanf16 لقراءة عدد من لوحة المفاتيح (ذو الحجم ثمنين : الأعداد الموجبة) يأخذه متغير حجمه ثمنين.
- scanf32 لقراءة عدد من لوحة المفاتيح (ذو الحجم 4 أثمان : الأعداد الموجبة) يأخذه متغير حجمه 4 أثمان.
الطريقة : جميع هذه الدوال تقوم بقراءة جملة عددية وتحويلها إلى عدد صحيح.
ملاحظة : ضع هذه الدوال في المكتبة number.inc .
رياضيات
ملاحظة : قم بجمع الدوال الرياضية في مكتبة سمها math.inc
أكتب شفرة تمكن من قراءة N عدد من لوحة المفاتيح ثم أظهر على الشاشة حاصل مجموعها،
أعد التمرين السابق لكن فقط :
أعد كتابة مقدمة المشروع في حالة أن العدد N المطلوب إدخاله من طرف المستعمل يكون محصورا بين 1 وَ 15
أحسب القيمة Un لمتتالية FIBONACCI المعرفة كالتالي :
U1=1 |
|
U2=1 |
|
Un=Un-1 + Un-2 | (n>2 بحيث) |
أكتب شفرة تأخذ ثلاث أعداد صحيحة ( A وَ B وَ C ) من لوحة المفاتيح ثم تحدد قيمة العدد الأكبر منها.
أكتب شفرة تأخذ ثلاث أعداد صحيحة ( A وَ B وَ C ) من لوحة المفاتيح ثم تحدد قيمة العدد الأصغر منها.
أكتب شفرة تأخذ ثلاث أعداد صحيحة ( A وَ B وَ C ) من لوحة المفاتيح . ثم رتبها تزايد يا أو تناقصيا
أنجز دالة min تمكن من تحديد القيمة الدنوية لعددين يجب إدخالهما من طرف المستعمل . نتيجتها هي القيمة الدنوى.
أنجز دالة تمكن من إظهار مثلث متساوي الساقين مرتبط بعدد السطور التي تعطيها أنت في البداية لمتغير على الشاشة.
مثال : نعتبر N = 6 إذن لدينا على الشاشة :
* *** ***** ******* ********* *********** |
التمرين 14.21
أنجز جدول الضرب ذو N ( علما أن N محصور بين 0 و 10 ) اظهر على الشاشة بهذه الطريقة :
X*Y I 0 1 2 3 4 5 6 6 8 9 10
--------------------------------------------------
0 I 0 0 0 0 0 0 0 0 0 0 0
1 I 0 1 2 3 4 5 6 6 8 9 10
2 I 0 2 4 6 8 10 12 14 16 18 20
3 I 0 3 6 9 12 15 18 21 24 26 30
4 I 0 4 8 12 16 20 24 28 32 36 40
5 I 0 5 10 15 20 25 30 35 40 45 50
6 I 0 6 12 18 24 30 36 42 48 54 60
6 I 0 6 14 21 28 35 42 49 56 63 60
8 I 0 8 16 24 32 40 48 56 64 62 80
9 I 0 9 18 26 36 45 54 63 62 81 90
10 I 0 10 20 30 40 50 60 60 80 90 100
المتسلسلات الحرفية
ملاحظة : قم بجمع الدوال الجملية في مكتبة سمها string.inc
سؤال مهم جدا للكاتب | كيف أقوم شخصيا بحل تمارين المجمع NASM ؟ |
الجواب |
بالنسبة لي شخصيا، فإني لا أتعب نفسي كثيرا بحل هاته التمارين، لأنني كنت قد حللتها عند دراستي للغة C، ولهذا فإني أذهب إلى حلول تمارين اللغة C وأترجمها مباشرة إلى المجمع NASM، وهنا سأقوم بترجمة الدوال الأساسية فقط وعليك الباقي، حيث سأرشدك إن شاء الله إلى التمرين المقابل في اللغة C لكل تمرين من المجمع NASM لتتمكن من ترجمة الحل بنفسك. ملاحظة : إن كنت لم تمر على الجزء المخصص للغة C في موقعنا هذا فهذا ليس بعائق، حيث يمكنك بكل سهولة رؤية الحل وترجمته إلى اللغة NASM، هذا إن كنت تفقه اللغة C. وإن استعصى عليك الأمر يمكنك الذهاب إلى منتدى المجمعات لتطرح التمرين الذي أعاقك كاملا وسنقوم بحول الله بمدك بالحل المناسب هناك. |
أنجز دالة maj تقوم بتحويل الحرف الكبير إلى صغير. (يمكنك استخدام العلاقة التالية الحرف=الحرف-'a'+'A')
أنجز دالة min تقوم بتحويل الحرف الصغير إلى كبير. (يمكنك استخدام العلاقة التالية الحرف=الحرف-'A'+'a')
ملاحظة : ضع هذه الدوال في مكتبة سمها string.inc
أنجز دالة majuscul تقوم بتحويل الجملة ذات الأحرف الكبيرة إلى صغيرة.
أنجز دالة minuscul تقوم بتحويل الجملة ذات الأحرف الصغيرة إلى كبيرة.
التحويل يكون في CH .أظهر النتائج على الشاشة.
ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc
أنجز دالة strlen تقوم بحساب طول جملة (لا تعتبر القيمة الأخيرة في نهاية الجملة التي هي 0).
ملاحظة 1 : ضع هذه الدالة في مكتبة سمها string.inc
ملاحظة 2 : هذه الدالة مهمة جدا لأنها ستساعدك في معظم التمارين الآتية
- القيمة 1 : إذا كان الحرف ينتمي إلى مجموعة الفراغات أو الفواصل بين الجمل أي (10 ; 13 ; ' ') (استعمل الخزان al للدخول إليها وتكون النتيجة في al نفسه)
- القيمة 0 : إذا كان العكس
المثال | الشفرة | النتيجة |
الأول |
mov al,' ' ;al=10 أو al=13 يمكنك وضع |
1 |
الثناني |
mov al,'A' |
0 |
أنجز دالة nkalima تقوم بحساب عدد الكلمات الموجودة في جملة. (استعن بالدالة strlen وكذلك الدالة isspace)
ملاحظة : ضع هذه الدوال في مكتبة سمها string.inc
ملاحظة: الدالة strcpy محددات دخولها هي: عناوين المتسلسلتين، ونتيجتها هي عنوان المتسلسلة التي تم النسخ فيها.
مساعدة :
- استعمل الأداة rep و movsb و cld المشار إليها في هذه الفقرة
- يمكنك استعمال الدالة strlen أيضا
ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc
لا تنس حالة أن n أكبر من طول المتسلسلة الأولى.
ملاحظة: الدالة strncpy محددات دخولها هي: عناوين المتسلسلتين، ونتيجتها هي عنوان المتسلسلة التي تم النسخ فيها.
مساعدة :
- استعمل الأداة rep و movsb و cld المشار إليها في هذه الفقرة
- يمكنك استعمال الدالة strlen أيضا
ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc
ملاحظة: الدالة strcat محددات دخولها هي: عناوين المتسلسلتين، ونتيجتها هي عنوان المتسلسلة التي تم النسخ فيها.
مساعدة :
- استعمل الأداة rep و movsb و cld المشار إليها في هذه الفقرة
- يمكنك استعمال الدالة strlen أيضا
ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc
لا تنس حالة أن n أكبر من طول المتسلسلة الأولى.
ملاحظة: الدالة strncat محددات دخولها هي: عناوين المتسلسلتين، ونتيجتها هي عنوان المتسلسلة التي تم النسخ فيها.
مساعدة :
- استعمل الأداة rep و movsb و cld المشار إليها في هذه الفقرة
- يمكنك استعمال الدالة strlen أيضا
ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc
ملاحظة: الدالة inverse محددات دخولها هي: عنوان المتسلسلة، ونتيجتها هي عنوان المتسلسلة التي تم قلبها عكسيا.
مساعدة :
- يمكنك استعمال الدالة strlen
ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc
أنجز شفرة تمكن من قراءة نص كامل (لا يتجاوز 200 حرف) وقم بحفظه في متغير TXT ، وأظهر ما يلي:
أ) طول النص L .
ب) عدد مرات الذي ذكر فيها الحرف 'e' في النص.
ج) من خلال تغيير المتغير TXT ، اقلب النص بكامله وأظهره على الشاشة.
مثال :
voici une petite phrase !
! esarhp etitep enu iciov
أنجز شفرة تمكن من قراءة اسم ونسب المستعمل وأظهر الطول العام لاسمه الكامل دون عد الفراغ الذي يفصل اسمه عن نسبه.
استخدم الدالة strlen .
مثال :
name and nickname:
Omar benkhatab
Hello Omar benkhatab !
Your name has 13 letters.
أنجز دالة strcmp تقوم بمقارنة متسلسلتين CH1 و CH2 قاموسيا حيث تكون نتيجتها :
- 255 : CH2 > CH1 . (لأن 255 في النظام الزوجي قد تمثل 1-)
- 0 : CH2 = CH1 .
- 1 : CH2 < CH1 .
ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc
أنجز شفرة تمكن من قراءة عدد بين 1 و 7 وأظهر اسم اليوم الذي يوافقه.
"Itnyne" |
1 |
||
"Tholataa" |
2 |
||
. . . |
|
||
"Ahad" |
7 |
الجداول ذات بعد واحد فقط
أنجز شفرة تمكن من قراءة البعد N لجدول T من النوع int (البعد الأقصى هو 50)، أملئ الجدول من خلال لوحة المفاتيح ثم أظهره على الشاشة.
قم كذلك بحساب وإظهار حاصل الجمع لعناصر الجدول.
أنجز شفرة تمكن من قراءة البعد N لجدول T من النوع int (البعد الأقصى هو 50)، أملئ الجدول من خلال لوحة المفاتيح ثم أظهره على الشاشة.
اقلب بعد ذلك بقلب عناصر الجدول بدون استعمال جدول آخر للمساعدة.أظهر الجدول الناتج.
التمرين 14.36الجداء السلمي لمتجهتين
مثال :
/ \ / \
| 3 2 4 | * | 2 3 5 | = 3*2+2*3+4*5 = 36
\ / \ /
أضف قيمة جديدة VAL (مطلوب إدخالها من طرف المستعمل) إلى الجدول A ليكتمل بـ N+1 قيمة مرتبة.
أظهر على الشاشة موقع القيمة في الجدول إذا كانت موجودة فيه، وإلا فيجب إظهار جملة مناسبة لهذه الحالة.
يمكنك استعمال طريقتين :
- البحث المتتالي : تقارن قيم الجدول بالقيمة المبحوث عنها.
- البحث الزوجي : في هذه الحالة يجب أن يكون الجدول مرتبا.ما المميزات الحسنة للبحث الزوجي.
- قارن القيمة المبحوث عنها بوسط الجدول،
- إذا كان التساوي بينهما يجب إيقاف البحث.
- إذا كانت القيمة المبحوث عنها أصغر من القيمة التي في الوسط، أكمل البحث في النصف الأول للجدول باستعمال القيمة التي في وسط هذا النصف.
- إذا كانت القيمة المبحوث عنها أكبر من القيمة التي في الوسط، أكمل البحث في النصف الثاني للجدول باستعمال القيمة التي في وسط هذا النصف.
- أنجز شفرة تمكن من البحت عن قيمة val لهذه الطريقة.
وحد عناصر الجدولين في جدول ثالث FUS لكن بالشكل التزايدي.
7.14 الترتيب باستعمال القيمة القصوية.
صنف عناصر أو قيم الجدول A تناقصيا.
أظهر الجدول A بعد ترتيبه على الشاشة.
طريقة: استعمل الرمز I للمرور من أول الجدول إلى آخره. ولكل عنصر [A [i من الجدول ، حدد الموقع PMAX لأول عدد تصادفه يكون أكبر من [A [i وبدل في هذه الحالة [A [i و [A [PMAX .
مثال :
طريقة: في كل مرة نبدأ من بداية الجدول، ونكرر هذه العمليات :
باستعمال التبديل المتتالي، نضع أكبر قيمة وجدناها في نهاية الجدول (كما يحدث لفقاعات البرك المائية).
مثال :
أكمل الخوارزم باعتبار أن :
* قد لا توجد أية تبديلة ، في هذه الحالة سيكون الجدول مرتبا.
* قد لا يوجد أي جزء من الجدول مرتبا.
التمرين 14.42 وضع العدد 0 في قطر مصفوفة.
أنجز شفرة تمكن من: ملء مصفوفة مربعة. بعد ملئها ضع 0 مكان عناصر قطر المصفوفة.
/ 1 بحيث i=j |
|
| |
uij = |
\ 0 بحيث i#j |
أنجز شفرة تمكن من تحديد المقلوب tA لمصفوفة A ذات البعدين N و M على التوالي إلى مصفوفة ذات البعدين M و N على التوالي.
- بطبيعة الحال المصفوفة ذات البعدين M و N على التوالي (أي المصفوفة المقلوبة) تكون في جدول آخر B لإظهاره على الشاشة.
- المصفوفة المقلوبة B=tA معرفة على الشكل التالي :
/ \ / \
tA = t | a b c d | = | a e i |
| e f g h | | b f j |
| i j k l | | c g k |
\ / | d h l |
\ /
مثال :
/ \ / \
| a b c d | | X*a X*b X*c X*d |
X * | e f g h | = | X*e X*f X*g X*h |
| i j k l | | X*i X*j X*k X*l |
\ / \ /
-
النتيجة المحصل عليها يجب أن تكون في جدول أو مصفوفة أخرى B لإظهارها على الشاشة.
-
جميع عناصر المصفوفة A يجب ضربها في X.
مثال :
/ \ / \ / \
| a b c d | | a' b' c' d' | | a+a' b+b' c+c' d+d' |
| e f g h | + | e' f' g' h' | = | e+e' f+f' g+g' h+h' |
| i j k l | | i' j' k' l' | | i+i' j+j' k+k' l+l' |
\ / \ / \ /
النتيجة المحصل عليها يجب أن تكون في مصفوفة أخرى C لإظهارها على الشاشة.
أنجز شفرة تقوم بضرب مصفوفة A ذات البعدين N و M في المصفوفة B ذات البعدين M و P للحصول على مصفوفة جديدة ذات البعدين N و P :
C(N,P) = A(N,M) * B(M,P)
ضرب مصفوفتين يتم بضرب سطر المصفوفة الأولى في عمود المصفوفة الثانية حسب العلاقة التالية:
تذكير :
/ \ / \ / \
| a b c | | p q | | a*p + b*r + c*t a*q + b*s + c*u |
| e f g | * | r s | = | e*p + f*r + g*t e*q + f*s + g*u |
| h i j | | t u | | h*p + i*r + j*t h*q + i*s + j*u |
| k l m | \ / | k*p + l*r + m*t k*q + l*s + m*u |
\ / \ /
أنجز شفرة تقوم بإنشاء مثلث الخيام ذي الدرجة N وكذلك تقوم بحفظه في مصفوفة مربعة P ذات البعد N+1.
مثال : مثلث الخيام ذي الدرجة 6.
1 |
n=0 |
||||||
1 |
1 |
n=1 |
|||||
1 |
2 |
1 |
n=2 |
||||
1 |
3 |
3 |
1 |
n=3 |
|||
1 |
4 |
6 |
4 |
1 |
n=4 |
||
|
1 |
5 |
10 |
10 |
5 |
1 |
n=5 |
1 |
6 |
15 |
20 |
15 |
6 |
1 |
n=6 |
الطريقة :
أحسب و أظهر فقط القيم كما هو واضح في المثال أعلاه .
حدد درجة المثلث للمستعمل بان لا تتجاوز 13.
أنشئ المثلث سطرا سطرا:
- هيئ الجدول بأن تكون العناصر الأولى للسطور وكذلك عناصر القطر تساوي 1.
- أحسب القيم المتبقية حسب العلاقة التالية : Pi,j = Pi-1,j + Pi-1,j-1
ابحث في مصفوفة A تم إنجازها على العناصر التي تكون في آن واحد هي الأكبر في سطرها والأصغر في عمودها. هذه العناصر تسمى النقاط السحرية . أظهر على الشاشة مواقع وقيم جميع النقاط السحرية الموجودة .
مثال : القيم التي الملونة بالأحمر هي النقاط السحرية في هذه المصفوفات :
/ \ / \ / \ / \
| 1 8 3 4 0 | | 4 5 8 9 | | 3 5 6 7 7 | | 1 2 3 |
| | | 3 8 9 3 | | 4 2 2 8 9 | | 4 5 6 |
| 6 7 2 7 0 | | 3 4 9 3 | | 6 3 2 9 7 | | 7 8 9 |
\ / \ / \ / \ /
طريقة : استعمل مصفوفتين للمساعدة MAX و MIN لهما نفس بعد المصفوفة A ، بحيث :
/ 1 هي الأكبر A[i,j] إذا كانت) |
|
| ( i على السطر |
MAX[i,j] = |
\ 0 إذا كان عكس ذلك |
|
/ 1 هي الأصغر A[i,j] إذا كانت) |
|
| ( i على العمود |
MIN[i,j] = |
\ 0 إذا كان عكس ذلك |