دستورهاي اجرايي اسمبلي
حالا ميخواهيم به رجيتسرها مقدار بدهيم و آنها را بخوانيم و ... . ما معمولا در
زبانهاي ديگر از علامت =(يا =ا

براي مقدار دهي استفاده ميكنيم ولي در زبان
اسمبلي اين كار ممكن نيست . در عوض از دستورالعمل MOV كمك ميگيريم . با MOV
ميتوانيم داده ها را بين رجيسترها يا خانه هاي حافظه انتقال بدهيم . به اين صورت :
MOV D/S
مقاديري كهDميتوانند بگيرنند يك رجيستر، نام يك متغير، يا آدرس يك مكان از حافظه است و مقاديري كهS ميتواند بگيردهم يك مقدار عددي يا حرفي ، نام يك رجيستر و ... ميباشد .(cte=مقدار ثابت)
registe <r----> register
register ---> memory
memory ---> register
register --->cte
memory --->cte
segment register ---> general register
general register --->segment register
حالت هاي غير ممكن:
segment register --->segment register
segment register ---> cte
؟ ‹--- ثابت
باز هم بايد به يك يا دوبايتي بودن ثباتها توجه كنيم . به عبارت ديگر ما
نميتوانيم مقدار يك ثبات تك بايتي را به يك ثبات كامل دوبايتي منتقل كنيم .
مثلا عبارت mov DX/AL قابل قبول نيست چون AL يك بايتي بوده و DX دوبايتي است .
به عبارت ساده و كامل تر دو طرف عملوند MOV بايد از نظر اندازه
برابر باشند.
بنابر اين :
MOV DL/AL
و MOV CL/BHوM درست ولي MOV DS/AH نادرست است .
به علاوه ما فقط ميتوانيم ثباتهاي همه منظوره AXتا DX را به اين صورت مقدار دهي
كنيم . در صورتي كه بخواهيم ثباتهائي مثل ..DS/ES/ را مقدار دهي كنيم بايد از
رجيستر AX به عنوان واسطه استفاده كرده و مقدار را از طريق آن انتقال دهيم .
مثلا:
نميتوانيم بنويسيم mov ds/20h
ولي ميتوانيم داشته باشيم :
mov ax/20h
mov ds/ax
به اين ترتيب مقدار 20hبه DS انتقال پيدا ميكند ( گرچه تغيير دادن DS ايده خوبي
نيست !)
حالا مطالب گفته شده را تمرين ميكنيم . ما ميتوانيم با DEBUG اسمبلي بنويسيم و
حتي برنامه هاي COM. درست كنيم . بنا براين در DOS، DEBUG، را اجرا كنيد .
D:\LNG\ASM> DEBUG
يك خط تيره به صورت - ظاهر ميشود . اين خط تيره اعلان DEUBG براي وارد كردن
دستورات است .
حرف A (به معني شروع وارد كردن دستورات اسمبلي ) را وارد كرده و Enter را بزنيد .
عددي بصورت xxxx:0100 ظاهر ميشود . اين عدد براي شما (فعلا) مهم نيست ، پس به
آن توجه نكنيد .
حالا ميتوانيد دستورات زير را وارد كنيد :
MOV AX/100
MOV BX/AX
MOV ES/AX
بعد از وارد كردن خط آخر يكبار ديگر كليد Enter را بزنيد تا اعلان (-) دوباره ظاهر
شود .
در سطر اول ما عدد 100h ( پيش فرض اعداد در Debug هگزا است ) را به AX منتقل
كرديم . بعد مقدار AXبه BX و سپس مقدار AXبه ES منتقل شده . به اين ترتيب همه
ثباتهاي AX/BX/ES بايد در نهايت برابر 100h باشند .
براي ديدن صحت اين مطلب دستور T ( به معناي Trace) را وارد كنيد .
با هر بار اجراي اين دستور يكي از سطرهاي برنامه اجرا ميشود . بعلاوه شما ميتوانيد
محتواي رجيسترها را هم ببينيد .
با اولين فرمان T ، سطر اول اجرا ميشود . بازهم فرمان T را وارد كنيد . الان مقدار100h
به BX داده شد و اگر به محتواي رجيستر AX توجه كنيد خواهيد ديد كه مقدار آن
(همانطور كه انتظار داشتيم ) برابر 100h است . دوبار ديگر هم فرمان T را صادر
كنيد و در نهايت مقدار ثباتهاي AX/BX/ES را ببينيد . هر سه ثبات (حالا) برابر 100h
هستند .
براي خارج شدن از Debug هم فرمان Q به معني Quit را وارد كنيد .
حالا فرض كنيد با اين آدرس روبرو شديد MOV [200H]/70H
اين دو از حافظه هستند پس چه جوري بايد مقدار را منتقل كنيم؟؟
خيلي راحت با استفاده از دستورPTR؛ براي اينكه آدرس يك متغير بيان كننده نوع آن متغير نميباشد(يعني چند بايتي است) از عملگر PTR استفاده ميشود.
BYTE PTR [......]
WORD PTR [......]
DWORD PTR [......]
MOV BYTE [200H]/70H.
مثال) كداميك از دستورات زير درست ميباشد؟
1) MOV BYTE PTR[DI]/BL
MOV BYTE PTR[SI]/300(2
MOV BYTE PTR[SI]/BYTE PTR[DI] (3
MOV [300H]/ BX (4
حل:
گزينه 2و3 غلطه؛چرا
2- چون 300 بيشتر از يك بايت است
3- انتقال از حافظه امكان ندارد
تا بعد كه بقيه رو بگم
