الدرس السابع : مكونات لغة الاسمبلى

مكونات لغة الاسمبلى

تتكون لغة الاسمبلى من

  1. Labels
  2. Instructions
  3. Operands
  4. Directives
  5. 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

هى مجموعة من العلامات والرموز الخاصة التى يستخدم الاسمبلى
وهى موضحة فى الجدول الاتى مع استخدام كل منهما