مكونات لغة الاسمبلى
تتكون لغة الاسمبلى من
- Labels
- Instructions
- Operands
- Directives
- Comments
Labels
وكما عرفنا سابقا انها عبارة عن نصوص تكون موجودة فى البرنامج للتوضيح او لتنفيذ البرامج الفرعية مثل GOTO ويجب ان تبدا بحرف او Underscore وطولها يصل الى 32 حرف ويجب ان تبدا من العمود الاول .
Instructions
وهى التعليمات وتكون معرفة من قبل الشركة المصنعة للميكرو وتسمى التعليمة فى لغات البرمجة بى syntax
Operands
وهى المعاملات التى تكون مع اى تعليمة وتكون غالبا مسجلات او متغيرات او ثوابت .
Comments
وهى كلام قام بكتابه المبرمج حتى يساعده فى تتبع الاخطاء فى البرنامج او حتى يكون من السهل على اى مبرمج أخر فهم طريقة عمل البرنامج المكتوب وتكون بعد التعليمة مباشرة ويجب ان تبدا بالعلامة الاتية ;
Directives
وهى تشبة التعليمات الى حد ما ولكن تعتمد على البرنامج نفسه وتوضح خصائص لغة الاسمبلى
مثلا LEVEL وعند كتابة هذه الكلمة يكون من المعروف ان تشير الى متغير موجود فى الذاكرة فى المكان الاتى 0Dh .
وفى الجزء الاتى نرى برنامج مع توضيح لكل جزء فيه
ونلاحظ من البرنامج السابق انه يجب وضع ال directive بعد التعليق مباشرة
وال directive الموجود مهم جدا حتى تعجل الميكرو يعمل جيدا وهو يحتوى على نوع الميكرو ونوع المذبذب
واول سطر فى البرنامج مهم جدا لاننا يجب ان نقوم بتحديد عنوان معين يبدا منه الميكرو بالتنفيذ وهو org 0x00 وفى حالة حدوث ال interrupt يبدا الميكرو من org 0x04 وسوف نعرف لاحقا ما معنى interrupt
وتكون كلمة main هى البداية الحقيقية للبرنامج
اما بالنسبة لباقى التعليمات الموجودة فى البرنامج فاعتقد انها واضحه .
Control directives
وهى
تحتوى على مجموعة من الاوامر او directives ومن امثلة ذلك
الامر
#DEFINE
ويستخدم فى تغيير مكان جزء من النص الى مكان اخر ويكون على الصيغة الاتية
#define<text> [<another text>]
ومثال على ذلك :
#define turned_on 1
#define turned_off 0
وهذا معناه انه فى كل مرة تظهر
turned_on فى البرنامج ستتغير 1 وبالمثل فى turned_off ستتغير الى صفر
الامر INCLUDE
ويستخدم فى ارفاق ملف اضافى ضمن البرنامج الموجود ويعتبر هذا الملف انه ضمن البرنامج الحالى ويتم تنفيذه على حسب مكان وجود الامر INCLUDE ويكون على الصورة الاتية
#include <file_name>
#include "file_name"
وحالة الاقواس تستخدم عندما يكون الملف للنظام System file
اما فى حالة الاقتباس فان الملف يكون للمستخدم User file
أمثلة على الامر :
#include <regs.h>
#include "subprog.asm"
الامر CONSTANT
وهو امر يقوم بتحديد قيمة عددية لاسم حرفى
وشكله كما فى الصورة الاتية
Constant <name>=<value>
ومن الامثلة على هذا الامر
Constant MAXIMUM=100
وهذا معناه انه فى كل مرة يتم ظهور كلمة MAXIMUM فى البرنامج سيتم استبدالها بالقيمة 100
الامر VARIABLE
وهو مثل الامر السابق حيث يقوم بوضع قيمة عددية لاسم حرفى وصورته كما يلى
Variable<name>=<value>
والفرق بينه وبين CONSTANT ان قيمته من الممكن ان تتغير اثناء البرنامج ومن الامثلة على هذا الامر
variable level=20
variable time=13
الامر SET
وهو مشابه ايضا للامران السابقان ولكن يستخدم فى تعريف متغيرات المترجم assembler
Defining assembler variable
و يكون شكله العام كما يلى :
<name_variable>set<value>
وهذا يعنى انه يقوم القيمة value فى المتغير name_variable
ومن الامثلة على استخدام الامر
length set 12
الامر EQU
ويستخدم فى تعريف ثوابت الاسمبلر
Defining assembler constant
ويكون على الصورة الاتية
<name_constant> equ <value>
ومثال على ذلك :
five equ 5
اى يقوم باضافة القيمة 5 الى الاسم five
الامر ORG
يقوم بتعرف العنوان الذى سيكون بداية لتخزين البرنامج فى ذاكرة الميكروكنترولر ويكون على الصورة الاتية
<label>org<value>
ومثال على هذا الامر
Start org 0×00
movlw 0xFF
movwf PORTB
اى يقوم الميكرو بتخزين التعليمتين ابتدا من العنوان 00
الامر END
ويكون على الصورة الاتية
end
وهذا الامر مهم جدا للدلالة على نهاية البرنامج
التعليمات الشرطية Conditional instructions
وهى تعليمات شائعة فى اغلب لغات البرمجة وتستخدم فى تحويل مسارات البرنامج
الامر IF
وصورته العامة كما يلى
if<conditional_term>
ومثال على ذلك :
if
level=100
goto FILL
else
goto
DISCHARGE
endif
وهذا معناه ان الميكرو يقوم باختبار الشرط level=100 فاذا كان صحيح فانه يقوم يقوم بالذهاب الى FILL واذا كان الشرط غير صحيح فانه يذهب الى DISCHARGE ثم يستكمل باقى البرنامج .
وقد لاحظنا استعمال الامر
ELSE
وهو كما عرفنا يستخدم كحل بديل اذا كان الشرط الموجود فى جملة IF غير صحيح
اما الامر
ENDIF
فانه يستخدم فى انهاء الفقرة الشرطية .
الامر WHILE
وصورته العامة كما يلى
while<condition>
.
.
.
endw
وهنا يقوم الميكرو بتنفيذ التعليمات الموجود بين WHILE و endw طالما ان الشرط الموجود فى جملة WHILE متحقق واذا كان الشرط غير متحقق فان الميكرو يقوم بتنفيذ endw والخروج من جملة while
ويمكن ان تصل عدد تعليمات البرنامج الموجودة بين WHILE و endw الى 100 تعليمة مع 256 مره تنفيذ
مثال على ذلك فى البرنامج الاتى
While i<10
i=i+1
endw
الامر IFDEF
وفائدة هذا الامر انه يقوم بتنفيذ مجموعة تعليمات البرنامج فى حالة اذا تم تعريف رمز معين باستخدام الامر DEFINE
وصورته العامة كما يلى :
ifdef<designation>
ومثال على الامر :
#define test
test هل تم تعريف الرمز
ifdef test ;
سيتم تنفيذ هذه التعليمات اذا تم تعريف الرمز
......;
endif
الامر IFNDEF
وهو عكس الامر السابق ويقوم بتنفيذ مجموعة من تعليمات البرنامج
فى حالة اذا لم يتم تعريف رمز معين
وصورته العامة كما يلى
ifndef<designation>
ويستخدم غالبا اذا كان الرمز غير معرف او تم مسح تعريفه بواسطة الامر
#UNDEFINE
وهو عكس الامر DEFINE ومثال على ذلك
#define test
..........
#undefine test ;لالغاء تعريف الرمز
..........
ifndef test ;هل الرمز غير معرف
..... .; هذه التعليمات سيتم تعريفها لان الرمز غير معرف
endif
تعليمات البيانات Data Directives
الامر CBLOCK
ويقوم بتعريف بلوك معين ليحتوى على مجموعة من الثوابت وصورته العامة كما يلى :
Cblock [<term>]
<label>[:<increment>], <label>[:<increment>]......
endc
وهذا الامر يقوم بوضع القيمة الموجودة فى العبارة termكقيمة ابتدائية الى اول ثابت label ويقوم بالزيادة بمقدار واحد للثابت الذى يليه مع اضافى قيمه الزيادة increment ان وجدت
وايضا القيمة الابتدائية ان لم تكن موجوده فيتم اعتبارها تساوى صفر
والمثال الاتى يوضح هذا :
Cblock 0x02
First, second, third ;first=0x02, second=0x03,third=0x04
endc
وهنا نلاحظ عدم وجود increment فتم اعتبارها تساوى واحد.
ونلاحظ فى هذا المثال وجود increment فلذلك تم اضافتها الى الثابت
cblock 0x02
first : 4, second : 2, third ;first=0x06, second=0x08,third=0x09
endc
الامر endc
ويستخدم فى انهاء بلوك تعريف الثوابت وموضحة فى الامثلة السابقة
الامر DB
يستخدم فى تعريف بيانات بايت واحد
وصورته العامة كما يلى
[<label>]db <term> [, <term>,.....,<term>]
ووظيفته يقوم بحجز بايت فى ذاكرة البرنامج واذا كان الامر يحتوى على اكثر من متغير يتطلب لكل منها بايت خاص فان الميكرو يقوم بحجز البايت الاول ثم الذى يليه
والمثال الاتى يوضح هذا :
db 't', 0×0f, 'e', 's', 0×12
الامر DE
وهو مشابه تماما للامر السابق ولكن يقوم بحجز البيت فى الذاكرة EEPROM وليس ذاكرة البرنامج وصورته العامة كما يلى :
[<term>] de <term> [, <term>,....., <term>]
ومثال على ذلك :
org H'2100'
de "Version 1.0" , 0
الامر DT
وظيفة هذا الامر هى تعريف جدول بيانات وصورته العامة كما يلى :
[<label>] dt <term> [, <term>,........., <term>]
ومثال على ذلك :
dt "Message", 0
dt first, second, third
حيث يقوم بتوليد مجموعة من تعليمات RETLW لكل term
اذن المثال السابق يصبح كما يلى :
RETLW Message
RETLW 0
RETLW first
RETLW second
RETLW third
وهذا المثال يقوم بعمل جدول يحتوى على الثوابت الموجود امام RETLW والتى تكون مخزنه فى المسجل W
Configurational directives
وهى الاوامر التعريفية للميكروكنترولر
ومن اهم هذه الاوامر الامر
_CONFIG
وصورته العامة كما يلى
_ _config<term> or_ _config<address>,<term>
ويكون كما فى المثال الاتى :
_CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC
ويستخدم فى تعريف المذبذب وال Watchdog ودائرة الريسيت ويجب مراعاه تعريف نوع الميكروكنترولر المستخدم قبل استخدام هذ الامر
الامر PROCESSOR
تستخدم فى تعريف نوع الميكرو المستخدم
وهو على الصورة الاتية :
Processor <microcontroller_type>
وبالنسبة للميكرو الخاص بنا يكون الامر كما يلى :
processor 16F84
Assembler arithmetic operators
هى مجموعة من العلامات والرموز الخاصة التى يستخدم الاسمبلى
وهى موضحة فى الجدول الاتى مع استخدام كل منهما