أنت هنا:برمجها»المجمع NASM»الدرس 14: المتسلسلات الحرفية
الدرس 14: المتسلسلات الحرفية الدرس 14: المتسلسلات الحرفية
قيم الموضوع
(1 تصويت)
 
 وصولك إلى هذه المرحلة من تعلم البرمجة باستعمال المجمع يعني أنك قد عرفت الكثير لحد الآن مما سبق. تجاوز لهذه الفقرة سيجعلك قادرا على التعامل مع ما هو أصعب في البرمجة باستعمال المجمع. نتطرق هنا إلى ما يسمى المتسلسلات الحرفية.

ملاحظات

»» إذا تجاوزت هذه الفقرة فلا تخف أبدا من المجمع، كما أن تمارين هذه الفقرة تمكنك من التفكير في كيفية صنع أسس لغات البرمجة كـ C أو Pascal.
»»وكذلك ستبتعد عن قواطع DOS حتى لا تكون مرتبطا به ليِؤدي بك التفكير في كيفية إنشاء نظام تشغيل جديد كـ DOS أو UNIX..
»»هذه الفقرة بالذات مرتبطة مع جميع الفقرات التي مررت بها، لهذا فيجب أن تقوم بمراجعتها كلها وخصوصا فقرة العنونة والمكدس والدوال.


1. مقدمة

الجداول عبارة عن مجموعة من العناصر أو متغيرات لها نفس النوع.

المتسلسلات الحرفية عبارة عن جمل أو كلمات وبمعنى أدق عبارة عن جداول متكونة من حروف.

ولربما رأيت أننا تطرقنا في الفقرات السابقة إلى معرفة دور بعض الخزانات المؤشرة كـ :

  1. IP  : مؤشر الأوامر حيث من خلاله يتم أخد عنوان الأمر الذي يجب تنفيذه من الذاكرة.
  2. SP : مؤشر المكدس الذي يراقب عمليات الإدخال في المكدس.
  3. BP : مؤشر القاعدة الذي يراقب عمليات التغيير والقراءة في المكدس.
  4. وبقي لنا المؤشرين  SI و DI ..

رغم أننا قد تطرقنا للمؤشرين SI و DI لكن ليس بكيفية متعمقة. ففي هذه الفقرة سنستعملهما بشكل واسع...

  • SI  : يسمى بمؤشر المرسل.
  • DI : يسمى بمؤشر المستقبل (أو المرسل إليه).

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


2. الجداول


2.1 مميزات الجدول

عند التعامل مع الجداول يجب أن تتعرف على ما يلي :

  1. عنوان أول عنصر للجدول.

  2. عدد الأثمان التي يحجزها كل عنصر.

  3. رقم الخانة التي ينتمي إليها كل عنصر. (رقم أول خانة أو أول عنصر هو 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
jadwal2      dw   5, 4, 3, 2, 1
jadwal3      dd    5, 4, 3, 2, 1

حجم الجداول الإجمالي في الذاكرة:

الجدول النوع الحساب عدد الأثمان
jadwal1   db 1×5 5
jadwal2   dw 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]
mov al, [jadwal1 + 1]   
 ; al = jadwal1[1]
mov [jadwal1 + 3], al   
 ; jadwal1[3] = al
mov ax, [jadwal2]         
; ax = jadwal2[0]
mov ax, [jadwal2 + 2]  
 ; ax = jadwal2[1] ( jadwal2[2] ليس )
mov [jadwal2 + 6], ax   
; jadwal2[3] = ax
mov ax, [jadwal2 + 1]  
 ; ax = ??  لا ينصح أن تفعل هذا
mov eax, [jadwal3]      
 ; eax = jadwal3[0]
add eax, [jadwal2 + 4]  
; eax += jadwal3[1]
mov ebx, [jadwal2 + 8]
 ; ebx = jadwal3[2]

[segment .data]
jadwal1      db    5, 4, 3, 2, 1
jadwal2      dw   5, 4, 3, 2, 1
jadwal3      dd    5, 4, 3, 2, 1


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]
mov ah,0eh                   ;إظهار أول حرف على الشاشة
int 10h

mov al, [jomla1+5]          
; al = jomla1[5]

mov ah,0eh                   ;إظهار الحرف الخامس على الشاشة
int 10h

mov al, jomla2          
mov ah,09h                   ;  إظهار الجملة 2  على الشاشة
int 21h


mov al, jomla2+7          
mov ah,09h                   ;  إظهار النصف الأخير للجملة 2  على الشاشة
int 21h

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.

ملاحظة : لا تستعمل أبدا الدالة 9للقاطعة 21h، لأنه من المفضل التخلص من دوال النظام DOS،  ولكن يمكنك استعمال الدالة 0Eh للقاطعة 10h التي تقوم بإظهار حرف واحد فقط.

 


التمرين 14.1

هذه الطريقة يعتمد عليها المترجم C لإظهار الجمل على الشاشة (حيث يضيف دائما القيمة '0\' التي تعني 0 أو nul في آخر الجملة)

في هذه الحالة سنستعمل حلقة تكرارية لا تتوقف إلا بشرط أن يساوي آخر عنصر في المتسلسلة القيمة 0.

أنجز الدالةoktob بحيث يجب عليها أن تكون كاملة ونظيفة.

مثال للاستعمال :

مثال في المجمع   النتيجة على الشاشة

push word jomla
call oktob

[SEGMENT .data]
jomla   db   'Salamo 3alaikom',0  ;منتهية بالصفر

 

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';
char c=13;
int  x=320;
float  y=580.68;

printf("%c %d %i %f",d,c,x,y);

في الحقيقة يقوم C أعني الدالة printf باستدعاء مجموعة من الدوال كل واحدة على حدة لتقوم بإظهار جميع المتغيرات المطلوب لإظهارها على الشاشة: مثلا واحدة من أجل المتغيرات ذات الشكل c% وأخرى ذات الشكل d% وهكذا ...


التمرين 14.2

أنجز دالة oktob8  حيث تقوم  بإظهار الأعداد الموجبة من 0 إلى 255. (أي الأعداد ذات الحجم ثمن واحد فقط أي ذات النوع db أو resb).

استعمل خزانا واحدا فقط للدخول إلى الدالة.

مثال في المجمع   النتيجة على الشاشة

mov dh,65
call oktob8

 

65


التمرين 14.3

أنجز دالة oktob16 حيث تقوم  بإظهار الأعداد الموجبة من 0 إلى 65335. (أي الأعداد ذات الحجم ربع واحد فقط أي ذات النوع dw أو resw).

استعمل خزانا واحدا فقط للدخول إلى الدالة.

مثال في المجمع   النتيجة على الشاشة

mov ax,5124
call oktob16

 

5124


التمرين 14.4

أنجز دالة oktob32  حيث  تقوم  بإظهار الأعداد الموجبة من 0 إلى 4294967295. (أي الأعداد ذات الحجم نصف واحد فقط أي ذات النوع dd أو resd).

استعمل خزانا واحدا فقط للدخول إلى الدالة.

مثال في المجمع   النتيجة على الشاشة

mov eax,429496
call oktob32

 

429496


تمارين تطبيقية

قوانين :

  1. من المفضل أن تكون الدوال كاملة و نظيفة إلا عندما أشير عليك أن لا تهتم .
  2. دالة رجعية : تقبل نتيجة يجب أن وضعها في المكدس
  3. دالة لارجعية : لا تقبل نتيجة أي تقوم بتطبيق فعل فقط.
  4. من أجل إظهار الأرقام استعمل الدوال oktob8 و oktob16  و oktob32 المتطرق إليها في هذه الفقرة كل حسب طبيعة المتغيرات.
  5. استعمل الدالة oktob من أجل إظهار الجمل المنتهية بالقيمة 0. (لا تستعمل الآن oktobe).
  6. استعمل دائما في جميع مشاريعك هذا الشكل:

                 ;NASM-IDE ASM Assistant Assembler Project File
[BITS 16]        ;في النظام الحقيقي
[ORG 0x0100]     ;.COM الملف التنفيذي من نوع

[SEGMENT .data]   ;هنا نضع التعريفات المهيأة
N  db   20      
%include "...inc"   ;والاستدعاءات أيضا

[SEGMENT .bss]   ;هنا نضع التعريفات غير المهيأة

M resw  125     

[SEGMENT .text]   ;هنا نضع الشفرة أو المشروع                 

mov ax,4c00h     ;لإنهاء المشروع
int 21h


الدوال الأساسية


التمرين 14.5

أنجز الدوال التالية :

  • putchar : تقوم بإظهار حرف على الشاشة (دالة لارجعية).
  • getchar : تقوم بقراءة حرف من لوحة المفاتيح مع إظهاره على الشاشة (دالة رجعية).
  • getch    : تقوم بقراءة حرف من لوحة المفاتيح دون إظهاره على الشاشة (دالة رجعية).
  • kbhit    : تقوم فقط بمعرفة هل تم الضغط على مفتاح أم لا (دالة رجعية).
  • gotoxy : تقوم بالذهاب إلى موقع معين من الشاشة.
  • clrscr   : تقوم بمسح الشاشة كليا.
  1. قم بإنجاز شفرة لقراءة حرف بالدالة getch وإظهاره بالدالة putchar .
  2. قم بإنجاز شفرة لقراءة حرف بالدالة getchar وإظهاره بالدالة putchar .
  3. قم بإنجاز شفرة  لا تتوقف حتى يضغط المستعمل على مفتاح باستعمال الدالة kbhit.
  4. قم بإنجاز شفرة تقوم بقراءة حرف بالدالة getchar وإظهاره بالدالة putchar  في وسط الشاشة.
  5. قم بإنجاز شفرة لتمتحن الدوال  oktob8 و oktob16 و oktob32.

ملاحظة : ضع هذه الدوال مع الدالة oktob في مكتبة سمها stdio.inc .


التمرين 14.6

أنجز شفرة تقوم بقراءة حرف باستعمال

  1. الدالة getchar وأظهر رقمه ASCII باستعمال الدالة oktob8.
  2. الدالة getch وأظهر رقمه ASCII باستعمال الدالة oktob8.

التمرين 14.7

أنجز شفرة تقوم بتعريف 3 متغيرات لـ 3 جمل :'ALLAH Akbar' و 'Besmi ALLAH' و 'Salam 3alaikom' منتهية بـ 0.

أظهر هذه الجمل على الشاشة  كما يلي :

ALLAH Akbar

                         Besmi ALLAH

Salam 3alaikom

 استعمل الدالتين gotoxy و oktob.


التمرين 14.8 (المرور عن طريق العنوان)

أنجز دالة ikra  تقوم بقراءة جملة من لوحة المفاتيح وأن تضع القيمة 0 في آخرها.

أظهرها بعد ذلك بالدالة oktob.

ملاحظة : ضع هذه الدالة في المكتبة stdio.inc .(هذه الدالة تكافئ الدالة gets في اللغة C)


التمرين 14.9(المرور عن طريق العنوان)

أنجز الدوال التالية :

  1. scanf8 لقراءة عدد من لوحة المفاتيح (ذو الحجم ثمن واحد فقط : الأعداد الموجبة) يأخذه متغير حجمه ثمن واحد.
  2. scanf16  لقراءة عدد من لوحة المفاتيح (ذو الحجم ثمنين : الأعداد الموجبة) يأخذه متغير حجمه ثمنين.
  3. scanf32  لقراءة عدد من لوحة المفاتيح (ذو الحجم 4 أثمان : الأعداد الموجبة) يأخذه متغير حجمه 4 أثمان.

الطريقة : جميع هذه الدوال  تقوم بقراءة جملة عددية وتحويلها إلى عدد صحيح.

ملاحظة : ضع هذه الدوال في المكتبة number.inc .


رياضيات

ملاحظة : قم بجمع الدوال الرياضية في مكتبة سمها math.inc


التمرين 14.10 (دالة رجعية)
أنجز دالة somme  تمكن من جمع قيمتي متغيرين مطلوب إدخالهما من طرف المستعمل. ونتيجتها يأخذها متغير آخر يجب إظهاره على الشاشة.

التمرين 14.11

أكتب شفرة تمكن من قراءة N عدد من لوحة المفاتيح ثم أظهر على الشاشة حاصل مجموعها،


التمرين 14.12

أعد التمرين السابق لكن فقط :

أعد كتابة مقدمة المشروع في حالة أن العدد  N المطلوب إدخاله من طرف المستعمل يكون محصورا بين 1 وَ  15


التمرين 14.13 (دالة رجعية)
أنجز دالة fact  تمكن من حساب العامل  n! = n(n-1)(n-2)...321  لعدد صحيح طبيعي n  مع اعتبار أن  1=!0 .(استعمل loop)

التمرين 14.14

أحسب القيمة  Un  لمتتالية FIBONACCI  المعرفة كالتالي :

U1=1

 

U2=1

 
Un=Un-1 + Un-2        (n>2   بحيث)

التمرين 14.15

أكتب شفرة تأخذ ثلاث أعداد صحيحة ( A وَ B وَ C ) من لوحة المفاتيح ثم تحدد قيمة العدد الأكبر منها.


التمرين 14.16

أكتب شفرة تأخذ ثلاث أعداد صحيحة ( A وَ B وَ C ) من لوحة المفاتيح ثم تحدد قيمة العدد الأصغر منها.


التمرين 14.17

أكتب شفرة تأخذ ثلاث أعداد صحيحة ( A وَ B وَ C ) من لوحة المفاتيح . ثم رتبها تزايد يا أو تناقصيا


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

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


التمرين 14.19 (باستعمال المرور عن طريق العنوان)
أنجز دالة Abdel  تمكن من إبدال قيمتي متغيرين.

التمرين 14.20

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

مثال : نعتبر 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.
في حالة لم تكن تعرف اللغة C ، فهنا يجب عليك أن تحل التمارين بنفسك مباشرة.

وإن استعصى عليك الأمر يمكنك الذهاب إلى منتدى المجمعات لتطرح التمرين الذي أعاقك  كاملا وسنقوم بحول الله بمدك بالحل المناسب هناك.


التمرين 14.22(باستعمال المرور عن طريق العنوان)
قم بإنجاز شفرة تقوم بقراءة حرف و:

أنجز دالة maj  تقوم بتحويل الحرف الكبير إلى صغير. (يمكنك استخدام العلاقة التالية الحرف=الحرف-'a'+'A')

أنجز دالة min  تقوم بتحويل  الحرف الصغير إلى كبير. (يمكنك استخدام العلاقة التالية الحرف=الحرف-'A'+'a')

ملاحظة : ضع هذه الدوال في مكتبة سمها string.inc


التمرين 14.23  (باستعمال المرور عن طريق العنوان)
قم بإنجاز شفرة تقوم بقراءة جملة CH  و:

أنجز دالة majuscul  تقوم بتحويل الجملة ذات الأحرف الكبيرة إلى صغيرة.

أنجز دالة minuscul  تقوم بتحويل  الجملة ذات الأحرف الصغيرة إلى كبيرة.

التحويل يكون في CH .أظهر النتائج على الشاشة.

ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc


التمرين 14.24(دالة رجعية)

أنجز دالة strlen  تقوم بحساب طول جملة (لا تعتبر القيمة الأخيرة في نهاية الجملة التي هي 0).

ملاحظة 1 : ضع هذه الدالة في مكتبة سمها string.inc

ملاحظة 2 : هذه الدالة مهمة جدا لأنها ستساعدك في معظم التمارين الآتية


التمرين 14.24.01(دالة رجعية)
أنجز دالة isspace التي تكون نتيجتها هي :
  • القيمة 1 : إذا كان الحرف ينتمي إلى مجموعة الفراغات أو الفواصل بين الجمل أي (10 ; 13 ; '  ') (استعمل الخزان al للدخول إليها وتكون النتيجة في al نفسه)
  • القيمة 0 : إذا كان العكس
المثال الشفرة النتيجة

الأول

mov al,' '        ;al=10 أو al=13   يمكنك وضع
call isspace
mov dh,al
call oktob8

1

الثناني

mov al,'A'       
call isspace
mov dh,al
call oktob8

0

أنجز دالة nkalima  تقوم بحساب عدد الكلمات الموجودة في جملة. (استعن بالدالة strlen  وكذلك الدالة isspace)

ملاحظة : ضع هذه الدوال في مكتبة سمها string.inc


التمرين 14.25  (دالة رجعية + المرور بالعناوين)
أنجز دالة strcpy  تقوم بنسخ متسلسلة في  متسلسلة أخرى (لهما نفس البعد أي نفس عدد الخانات) .

ملاحظة: الدالة strcpy محددات دخولها هي: عناوين المتسلسلتين، ونتيجتها هي عنوان المتسلسلة التي تم النسخ فيها.

مساعدة :

  • استعمل الأداة rep و movsb و cld المشار إليها في هذه الفقرة
  • يمكنك استعمال الدالة strlen أيضا

ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc


التمرين 14.26  (دالة رجعية + المرور بالعناوين)
أنجز دالة strncpy  تقوم بنسخ n حرف الأولى من متسلسلة في  متسلسلة أخرى (لهما نفس البعد أي نفس عدد الخانات) .

لا تنس حالة أن n أكبر من طول المتسلسلة الأولى.

ملاحظة: الدالة strncpy  محددات دخولها هي: عناوين المتسلسلتين، ونتيجتها هي عنوان المتسلسلة التي تم النسخ فيها.

مساعدة :

  • استعمل الأداة rep و movsb و cld المشار إليها في هذه الفقرة
  • يمكنك استعمال الدالة strlen أيضا

ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc


التمرين 14.27  (دالة رجعية + المرور بالعناوين)
أنجز دالة strcat  تقوم بإضافة متسلسلة إلى نهاية متسلسلة أخرى (عدد الخانات هذه الأخيرة أكبر من الأولى) .

ملاحظة: الدالة strcat  محددات دخولها هي: عناوين المتسلسلتين، ونتيجتها هي عنوان المتسلسلة التي تم النسخ فيها.

مساعدة :

  • استعمل الأداة rep و movsb و cld المشار إليها في هذه الفقرة
  • يمكنك استعمال الدالة strlen أيضا

ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc


التمرين 14.28  (دالة رجعية + المرور بالعناوين)
أنجز دالة strncat  تقوم بإضافة n حرف الأولى من متسلسلة إلى نهاية متسلسلة أخرى (عدد الخانات هذه الأخيرة أكبر من الأولى) .

لا تنس حالة أن n أكبر من طول المتسلسلة الأولى.

ملاحظة: الدالة strncat  محددات دخولها هي: عناوين المتسلسلتين، ونتيجتها هي عنوان المتسلسلة التي تم النسخ فيها.

مساعدة :

  • استعمل الأداة rep و movsb و cld المشار إليها في هذه الفقرة
  • يمكنك استعمال الدالة strlen أيضا

ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc


التمرين 14.29  (المرور بالعناوين)
أنجز دالة inverse  تقوم بقلب خانات متسلسلة.(الحروف الأخيرة تصبح هي الحروف الأولى والعكس صحيح).

ملاحظة: الدالة inverse  محددات دخولها هي: عنوان المتسلسلة، ونتيجتها هي عنوان المتسلسلة التي تم قلبها عكسيا.

مساعدة :

  • يمكنك استعمال الدالة strlen

ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc


التمرين 14.30

أنجز شفرة تمكن من قراءة  نص كامل (لا يتجاوز 200 حرف) وقم بحفظه في متغير TXT ، وأظهر ما يلي:

أ) طول النص L .

ب) عدد مرات الذي ذكر فيها الحرف 'e'  في النص.

ج) من خلال تغيير المتغير TXT ، اقلب النص بكامله وأظهره على الشاشة.

مثال :

            voici une petite phrase !
            ! esarhp etitep enu iciov

التمرين 14.31

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

استخدم الدالة strlen .

مثال :

name and nickname:
Omar benkhatab
Hello Omar benkhatab !
   Your name has 13 letters.

التمرين 14.32

أنجز دالة strcmp  تقوم بمقارنة متسلسلتين CH1  و CH2 قاموسيا حيث تكون نتيجتها :

  • 255 :  CH2  > CH1 . (لأن 255 في النظام الزوجي قد تمثل 1-)
  • 0     :  CH2  = CH1 .
  • 1     :  CH2  < CH1 .

ملاحظة : ضع هذه الدالة في مكتبة سمها string.inc


التمرين 14.33

أنجز شفرة تمكن من قراءة عدد بين 1 و 7 وأظهر اسم اليوم الذي يوافقه.

 

"Itnyne"

 

 1

 

"Tholataa"

 

 2

 

. . .

 

 

 

"Ahad"

 

 7


 

 

الجداول ذات بعد واحد فقط


التمرين 14.34

أنجز شفرة تمكن من قراءة البعد N لجدول T من النوع int (البعد الأقصى هو 50)، أملئ الجدول من خلال لوحة المفاتيح ثم أظهره على الشاشة.

قم كذلك بحساب وإظهار حاصل الجمع لعناصر الجدول.


التمرين 14.35

أنجز شفرة تمكن من قراءة البعد N لجدول T من النوع int (البعد الأقصى هو 50)، أملئ الجدول من خلال لوحة المفاتيح ثم أظهره على الشاشة.

اقلب بعد ذلك بقلب عناصر الجدول بدون استعمال جدول آخر للمساعدة.أظهر الجدول الناتج.


التمرين 14.36الجداء السلمي لمتجهتين
أكتب شفرة تمكن من حساب الجداء السلمي لمتجهتين U و V (لهما نفس الدرجة).

مثال :

   /          \   /          \
   | 3  2  4  | * | 2  3  5  | = 3*2+2*3+4*5 = 36
   \          /   \          /

التمرين 14.37 إضافة قيمة إلى جدول مرتب
جدول ذي البعد N+1  يحتوي  على N  من الأعداد الصحيحة مرتبة تزايديا،  القيمة (N+1) غير معرفة.

أضف قيمة جديدة VAL (مطلوب إدخالها من طرف المستعمل) إلى الجدول A ليكتمل بـ N+1 قيمة مرتبة.


*التمرين 14.38  البحث عن قيمة داخل جدول
أنجز شفرة تمكن من البحت عن قيمة val ( مطلوب إدخالها من طرف المستعمل)  داخل جدول A للأعداد الصحيحة.

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

يمكنك استعمال طريقتين :

  1. البحث المتتالي : تقارن قيم الجدول بالقيمة المبحوث عنها.
  2. البحث الزوجي : في هذه الحالة يجب أن يكون الجدول مرتبا.ما المميزات الحسنة للبحث الزوجي.
    • قارن القيمة المبحوث عنها بوسط الجدول،
    • إذا كان التساوي بينهما يجب إيقاف البحث.
    • إذا كانت  القيمة المبحوث عنها أصغر من القيمة التي في الوسط، أكمل البحث في النصف الأول للجدول باستعمال القيمة التي في وسط هذا النصف.
    • إذا كانت  القيمة المبحوث عنها أكبر من القيمة التي في الوسط، أكمل البحث في النصف الثاني للجدول باستعمال القيمة التي في وسط هذا النصف.
    • أنجز شفرة تمكن من البحت عن قيمة val  لهذه الطريقة.

التمرين 14.39 اتحاد جدولين مرتبين
نعتبر جدولين A و B  (ذي البعدين N و M على التوالي)، مرتبين تزايديا.

وحد عناصر الجدولين في جدول ثالث FUS لكن بالشكل التزايدي.


*التمرين 14.40

7.14  الترتيب باستعمال القيمة القصوية.

صنف عناصر أو قيم الجدول A تناقصيا.

أظهر الجدول A بعد ترتيبه على الشاشة.

طريقة: استعمل الرمز I  للمرور من أول الجدول إلى آخره. ولكل عنصر [A [i من الجدول ، حدد الموقع PMAX لأول عدد تصادفه يكون أكبر من [A [i  وبدل في هذه الحالة [A [i و [A [PMAX .

مثال :


*التمرين 14.41الترتيب بطريقة الفقاعات
 صنف عناصر أو قيم الجدول A تزايديا.
أظهر الجدول A بعد ترتيبه على الشاشة.

طريقة: في كل مرة نبدأ من بداية الجدول، ونكرر هذه العمليات :

باستعمال التبديل المتتالي، نضع أكبر قيمة وجدناها في نهاية الجدول (كما يحدث لفقاعات البرك المائية).

مثال :

 

أكمل الخوارزم باعتبار أن :

* قد لا توجد أية تبديلة ، في هذه الحالة سيكون الجدول مرتبا.

* قد لا يوجد أي جزء من الجدول مرتبا.


 الجداول ذات بعدين: المصفوفات

التمرين 14.42  وضع العدد  0  في قطر مصفوفة.

أنجز شفرة تمكن من: ملء مصفوفة مربعة. بعد ملئها ضع 0  مكان عناصر قطر المصفوفة.


التمرين 14.43  مصفوفة وحيدية.
أنجز شفرة تمكن من إنشاء مصفوفة مربعة وحيدية U  ذات البعد N . المصفوفة الواحدية معرفة على الشكل التالي :

/ 1 بحيث i=j

 

|

uij =

\ 0 بحيث i#j

 

 

 

 


التمرين 14.44 مقلوب مصفوفة

أنجز شفرة تمكن من تحديد المقلوب tA  لمصفوفة A  ذات البعدين N  و M على التوالي إلى مصفوفة  ذات البعدين M  و N على التوالي.

  1. بطبيعة الحال المصفوفة  ذات البعدين M  و N على التوالي (أي المصفوفة المقلوبة) تكون في جدول آخر B  لإظهاره على الشاشة.
  2. المصفوفة المقلوبة 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 |
                            \       /

التمرين 14.45 ضرب مصفوفة في عدد حقيقي
أنجز شفرة تقوم بضرب مصفوفة A  في عدد حقيقي X.

مثال :

       /         \     /                 \
       | 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 |
       \         /     \                 /
  1. النتيجة المحصل عليها يجب أن تكون في جدول أو مصفوفة أخرى B لإظهارها على الشاشة.

  2. جميع عناصر المصفوفة A يجب ضربها في X.


*التمرين 14.46  جمع  مصفوفتين
أنجز شفرة تقوم بجمع مصفوفتين A  و B لهما نفس البعدين N و M..

مثال :

/         \   /             \     /                     \
| 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 لإظهارها على الشاشة.


التمرين 14.47  ضرب  مصفوفتين

أنجز شفرة تقوم بضرب مصفوفة 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 |
	\       /                  \                                     /

*التمرين 14.48 مثلث عمر الخيام

أنجز شفرة تقوم بإنشاء مثلث الخيام ذي الدرجة 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


*التمرين 14.49البحث عن النقاط السحرية

ابحث في مصفوفة 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                   إذا كان عكس ذلك

 

 

 

 

 

 

 

 


  
مقالات أخرى من نفس الفئة « الدرس 13: الدوال الدرس 15: الملفات »

أضف تعليقا


إصنعها يريد أن يتأكد أنك لست روبوتا، لذلك أحسب ما يلي:

كود امني
تحديث