Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

‫جامعة تعز‬

‫كلية العلوم التطبيقية‬

‫قسم علوم الحاسوب‬

‫ر‬ ‫ر‬
‫(عمل)‬
‫ي‬ ‫محاضات يف لغة التجميع‬

‫لطالب المستوى ر‬
‫الثان علوم حاسوب‬
‫ي‬

‫أستاذ المقرر‪/‬أمجد عبدهللا‬


‫ر‬
‫أساسيات يف لغة التجميع‬
‫برنامج لغة التجميع ‪ x86‬يمكن تقسيمه إىل ثالثة أقسام رئيسية‪:‬‬

‫قسم البيانات ‪ (data section):‬يستخدم هذا القسم لتعريف البيانات المبدئية أو الثوابت‪ .‬هذه‬ ‫•‬

‫الينامج‪ .‬يمكنك تعريف قيم ثابتة مختلفة‪ ،‬أو أسماء ملفات‪ ،‬أو أحجام‬
‫تتغي أثناء تشغيل ر‬
‫البيانات ال ر‬
‫ه‪:‬‬
‫مخازن‪ ،‬إلخ يف هذا القسم‪ .‬صيغة تعريف قسم البيانات ي‬

‫‪section .data‬‬

‫تتغي أثناء‬
‫المتغيات ر‬
‫ر‬ ‫متغيات‪ .‬هذه‬
‫المتغيات ‪ (bss section):‬يستخدم هذا القسم لتعريف ال ر‬
‫ر‬ ‫قسم‬ ‫•‬

‫ه‪:‬‬
‫المتغيات ي‬
‫ر‬ ‫الينامج‪ .‬صيغة تعريف قسم‬
‫تشغيل ر‬

‫‪section .bss‬‬

‫الفعل‪ .‬يجب أن يبدأ هذا القسم‬ ‫قسم النص ‪ (text section):‬يستخدم هذا القسم لوضع الكود‬ ‫•‬
‫ي‬
‫الينامج‪ .‬صيغة تعريف قسم النص ي‬
‫ه‪:‬‬ ‫بتعريف‪ ، global main‬والذي يحدد نقطة بدء تنفيذ ر‬

‫‪section .text‬‬
‫‪global main‬‬
‫‪main:‬‬

‫التعليقات‪(comments):‬‬
‫تبدأ التعليقات بلغة التجميع بعالمة الفاصلة المنقوطة (;)‪.‬‬ ‫•‬

‫يمكن أن تحتوي التعليقات عل أي حرف قابل للطباعة بما يف ذلك المسافة‪.‬‬ ‫•‬

‫يمكن أن تظهر ف سطر مستقل‪ .‬مثل‪; This program displays a message on screen :‬‬ ‫•‬
‫ي‬
‫ويمكن أن تظهر ف نفس السطر اىل جوار تعليمة ما مثل‪add eax ,ebx ; adds ebx to eax :‬‬
‫ي‬

‫‪2‬‬
‫‪Lecture 2‬‬ ‫‪Assembly‬‬ ‫‪By:Amjed Abdullah‬‬

‫تعليمات لغة التجميع تتكون برامج لغة التجميع من ثالثة أنواع من التعليمات‪:‬‬

‫التعليمات القابلة للتنفيذ أو التعليمات الفعلية(‪ :)executable instructions‬ر‬


‫تخي المعالج ما‬ ‫•‬

‫يجب القيام به‪ .‬تتكون كل تعليمة من رمز العملية ‪ (opcode).‬وتولد كل تعليمة قابلة للتنفيذ‬
‫تعليمة واحدة بلغة اآللة‪.‬‬

‫للميجم أو العمليات الظاهرية(‪ :)Assembler directives‬تخي ر‬


‫الميجم عن‬ ‫التوجيهات ر‬ ‫•‬
‫ر‬
‫ُ‬
‫جوانب مختلفة من عملية التجميع‪ .‬هذه التوجيهات ر‬
‫غي قابلة للتنفيذ وال تولد تعليمات لغة‬
‫اآللة‪.‬‬

‫•‬
‫الماكروهات(‪ :)Macros‬ي‬
‫ه آلية تستخدم لتعريف تعليمات مخصصة تستبدل بتعليمات‬
‫أخرى أو سالسل نصية قبل عملية التجميع الفعلية‪.‬‬

‫بناء التعليمات ر يف لغة التجميع ‪:‬‬

‫• يتم بإدخال تعليمات لغة التجميع عل سطر واحد لكل تعليمة‪.‬‬

‫• تتبع كل تعليمة التنسيق ي‬


‫التاىل ‪: [label] mnemonic [operands] [;comment].‬الحقول‬
‫داخل األقواس المربعة اختيارية‪.‬‬

‫تحتوي التعليمة األساسية عل جزآين‪ ،‬األول هو اسم التعليمة (أو االختصار) الذي يجب تنفيذه‪،‬‬ ‫•‬
‫والثان هو العمليات أو المعامالت لألمر‪.‬‬
‫ي‬

‫‪loop_start:‬‬ ‫‪; Label‬‬

‫)‪mov eax, 10 ; Mnemonic and operands (Move the value 10 to the register eax‬‬

‫)‪add ebx, ecx ; Operand (Add the value of register ecx to register ebx‬‬

‫‪; This comment is ignored during the assembly process‬‬

‫‪3‬‬
Lecture 2 Assembly By:Amjed Abdullah

:‫ ر يف لغة التجميع‬Hello World ‫برنامج‬

section .text
global main ;must be declared for linker (ld)
main: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ;our dear string
len equ $ - msg ;length of our dear string

:‫رشح الكود‬

section .text

.‫ حيث يتم كتابة التعليمات التي سيتم تنفيذها‬،‫هذا يُعلن عن بداية قسم الكود‬

global main

‫ وهو البرنامج الذي يجمع األكواد المختلفة لينتج‬، (linker) ‫ متاحة للرابط‬main ‫هذا يجعل الدالة‬
ً ‫برنام ًجا‬
.‫قابًل للتنفيذ‬

main:

.‫ وهي نقطة الدخول للبرنامج حيث يبدأ التنفيذ‬،main ‫هذا يُعلن عن بداية تعريف الدالة‬

mov edx, len

‫يستخدم عادة ً لتخزين‬ edx ‫ السجل‬edx. ‫ إلى السجل‬،‫ وهي طول الرسالة‬،len ‫هذه التعليمة تنقل قيمة‬
.‫اإلخراج‬/‫الطول في عمليات اإلدخال‬

mov ecx, msg

‫ يستخدم عادة ً لتخزين العناوين في‬ecx ‫ السجل‬ecx. ‫ إلى السجل‬msg ‫هذه التعليمة تنقل عنوان الرسالة‬
.‫اإلخراج‬/‫عمليات اإلدخال‬

4
‫‪Lecture 2‬‬ ‫‪Assembly‬‬ ‫‪By:Amjed Abdullah‬‬

‫‪mov ebx, 1‬‬

‫هذه التعليمة تنقل الرقم ‪ 1‬إلى السجل ‪ ،ebx‬والذي يمثل معرف الملف لإلخراج القياسي‪(stdout).‬‬

‫‪mov eax, 4‬‬

‫هذه التعليمة تنقل رقم نداء النظام للكتابة )‪ (sys_write‬إلى السجل ‪eax.‬ا لسجل ‪ eax‬يستخدم لتحديد‬
‫نداء النظام الذي سيتم تنفيذه‪.‬‬

‫‪int 0x80‬‬

‫هذه التعليمة تستدعي النواة لتنفيذ النداء النظامي المحدد في ‪ ،eax‬وفي هذه الحالة‪ ،‬هو نداء الكتابة إلى‬
‫اإلخراج القياسي‪.‬‬

‫‪mov eax, 1‬‬

‫هذه التعليمة تنقل رقم نداء النظام للخروج )‪ (sys_exit‬إلى السجل ‪eax.‬‬

‫‪int 0x80‬‬

‫هذه التعليمة تستدعي النواة مرة أخرى لتنفيذ الخروج من البرنامج‪.‬‬

‫‪section .data‬‬

‫هذا يُعلن عن بداية قسم البيانات‪ ،‬حيث يتم تخزين البيانات الثابتة مثل النصوص واألرقام‪.‬‬

‫‪msg db 'Hello, world!', 0xa‬‬

‫هذه التعليمة تُعرف النص ”!‪ “Hello, world‬متبو ً‬


‫عا بحرف السطر الجديد)‪ ، (0xa‬وتخزنه في الذاكرة‪.‬‬

‫‪len equ $ - msg‬‬

‫هذه التعليمة تُحسب طول النص ‪ msg‬باستخدام العنوان الحالي ‪ $‬منقو ً‬


‫صا منه عنوان النص ‪،msg‬‬
‫وتخزن النتيجة في ‪len.‬‬

‫بهذه الطريقة‪ ،‬يقوم البرنامج بطباعة الرسالة ”!‪ “Hello, world‬على الشاشة ومن ثم ينهي التنفيذ‪.‬‬

‫‪5‬‬
‫‪Lecture 2‬‬ ‫‪Assembly‬‬ ‫‪By:Amjed Abdullah‬‬

‫أقسام الذاكرة‪:‬‬
‫ر‬
‫والت يتم‬
‫يقوم نموذج الذاكرة المجزأة بتقسيم ذاكرة النظام إىل مجموعات من األقسام المستقلة‪ ،‬ي‬
‫مؤشات موجودة يف سجالت األقسام‪ُ .‬يستخدم كل قسم الحتواء نوع محدد‬ ‫اإلشارة إليها بواسطة ر‬

‫من البيانات‪ُ .‬يستخدم قسم واحد الحتواء أوامر التعليمات‪ ،‬ويحتوي قسم آخر عل عنارص البيانات‪،‬‬
‫التاىل‪:‬‬
‫نامج‪ ،‬يمكننا تحديد مختلف أقسام الذاكرة عل النحو ي‬
‫الي ر ي‬
‫ويحتفظ القسم الثالث بالمكدس ر‬

‫قسم البيانات‪ :‬يُمثل( بقسم ‪ data.‬وقسم ‪).bss.‬‬

‫ُ‬
‫• يستخدم قسم ‪ data.‬لتعريف منطقة الذاكرة حيث يتم تخزين عنارص البيانات ر‬
‫للينامج‪.‬وال‬
‫الينامج‪.‬‬ ‫ر‬ ‫ً‬
‫يمكن توسيع هذا القسم بعد تعريف عنارص البيانات‪ ،‬ويظل ثابتا طوال فية تشغيل ر‬
‫ر‬ ‫ً‬ ‫ً‬ ‫ً‬ ‫ُ‬
‫• ويعد قسم ‪ bss.‬أيضا قسما ثابتا للذاكرة يحتوي عل مساحات للبيانات ي‬
‫الت سيتم تعريفها‬
‫ً‬
‫الينامج‪ .‬تكون هذه الذاكرة المؤقتة مملوءة بالصفر‪.‬‬
‫الحقا يف ر‬

‫قسم الكود‪ُ :‬يمثل (بقسم ‪ُ (.text.‬يحدد هذا القسم منطقة يف الذاكرة تخزن فيها أوامر التعليمات‪ .‬هذا‬
‫ً‬
‫القسم أيضا ثابت‪.‬‬
‫ر‬
‫قسم المكدس‪:‬يحتوي هذا القسم عل قيم البيانات ي‬
‫الت يتم تمريرها إىل الدوال واإلجراءات داخل‬
‫الينامج‪.‬‬
‫ر‬
‫مسجالت التجميع)‪: (Assembly Registers‬‬
‫تجهي البيانات‪ .‬يمكن تخزين هذه البيانات يف الذاكرة والوصول‬
‫ر‬ ‫تتضمن عمليات المعالجة بالمعالج‬
‫إليها من هناك‪ .‬ومع ذلك‪ ،‬فإن قراءة البيانات من الذاكرة وتخزين البيانات فيها يؤدي إىل بطء عمل‬
‫المعالج‪ ،‬حيث يحتوي ذلك عل عمليات معقدة إلرسال طلب البيانات إىل وحدة تخزين الذاكرة‬
‫والحصول عل البيانات من خالل نفس القناة‪.‬‬
‫ر ُ‬
‫والت تسىم‬
‫ي‬ ‫لترسي ع عمليات المعالجة‪ ،‬يتضمن المعالج بعض مواقع التخزين الداخلية للبيانات‪،‬‬
‫مسجالت‪.‬‬
‫تخزن المسجالت عنارص البيانات للمعالجة دون الحاجة إىل الوصول إىل الذاكرة‪ .‬حيث يتم بناء عدد‬
‫محدود من المسجالت يف رقاقة المعالج‪.‬‬

‫‪6‬‬
Lecture 2 Assembly By:Amjed Abdullah

: ‫مثال يوضح المسجالت‬

section .text
global main ;must be declared for linker (ld)
main: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel

mov edx,9 ;message length


mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel

section .data
'Displaying 9 stars',0xa ;a message
len equ $ - msg ;length of message
s2 times 9 db '*'

:‫رشح الكود‬

section .text:

‫ر‬
.‫الت سيتم تنفيذها‬ ُ
‫ حيث يتم كتابة التعليمات ي‬،‫يعلن عن بداية قسم الكود‬
global main:

ً ‫ وهو الينامج الذي يجمع األكواد المختلفة لينتج بر‬، (linker)‫ متاحة للرابط‬main ‫يجعل الدالة‬
‫نامجا‬ ‫ر‬ ‫ا‬
.‫قابًل للتنفيذ‬

main:

.‫للينامج حيث يبدأ التنفيذ‬ ُ


‫وه نقطة الدخول ر‬
‫ ي‬،main ‫يعلن عن بداية تعريف الدالة‬
mov edx, len:

7
‫‪Lecture 2‬‬ ‫‪Assembly‬‬ ‫‪By:Amjed Abdullah‬‬

‫ا‬
‫وه طول الرسالة‪ ،‬إىل السجل ‪ edx.‬السجل ‪ edx‬يستخدم عادة لتخزين الطول يف‬‫ينقل قيمة ‪ ،len‬ي‬
‫عمليات اإلدخال‪/‬اإلخراج‪.‬‬

‫‪mov ecx, msg:‬‬


‫ا‬
‫ينقل عنوان الرسالة ‪ msg‬إىل السجل ‪ ecx.‬السجل ‪ ecx‬يستخدم عادة لتخزين العناوين يف عمليات‬
‫اإلدخال‪/‬اإلخراج‪.‬‬

‫‪mov ebx, 1:‬‬

‫القياس‪(stdout).‬‬
‫ي‬ ‫ينقل الرقم ‪ 1‬إىل السجل ‪ ،ebx‬والذي يمثل معرف الملف لإلخراج‬

‫‪mov eax, 4:‬‬

‫ينقل رقم نداء النظام للكتابة )‪ (sys_write‬إىل السجل ‪ eax.‬السجل ‪ eax‬يستخدم لتحديد نداء النظام‬
‫الذي سيتم تنفيذه‪.‬‬

‫‪int 0x80:‬‬

‫وف هذه الحالة‪ ،‬هو نداء الكتابة إىل اإلخراج‬


‫النظام المحدد يف ‪ ،eax‬ي‬
‫ي‬ ‫يستدع النواة لتنفيذ النداء‬
‫ي‬
‫القياس‪.‬‬
‫ي‬
‫‪mov edx, 9:‬‬

‫ينقل القيمة ‪ 9‬إىل السجل ‪ ،edx‬وهو طول الرسالة الثانية‪.‬‬

‫‪mov ecx, s2:‬‬

‫ينقل عنوان الرسالة الثانية ‪ s2‬إىل السجل ‪ecx.‬‬

‫‪mov ebx, 1:‬‬

‫ينقل مرة أخرى الرقم ‪ 1‬إىل السجل ‪ebx.‬‬

‫‪mov eax, 4:‬‬

‫ينقل مرة أخرى رقم نداء النظام للكتابة )‪ (sys_write‬إىل السجل ‪eax.‬‬

‫‪int 0x80:‬‬

‫النظام‪.‬‬
‫ي‬ ‫يستدع النواة مرة أخرى لتنفيذ النداء‬
‫ي‬
‫‪mov eax, 1:‬‬

‫ينقل رقم نداء النظام للخروج )‪ (sys_exit‬إىل السجل ‪eax.‬‬

‫‪8‬‬
‫‪Lecture 2‬‬ ‫‪Assembly‬‬ ‫‪By:Amjed Abdullah‬‬

‫‪int 0x80:‬‬

‫الينامج‪.‬‬
‫يستدع النواة مرة أخرى لتنفيذ الخروج من ر‬
‫ي‬
‫‪section .data:‬‬

‫ُيعلن عن بداية قسم البيانات‪ ،‬حيث يتم تخزين البيانات الثابتة مثل النصوص واألرقام‪.‬‬

‫‪9‬‬

You might also like