1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

آموزش اسمبلی(2)

شروع موضوع توسط hector2141 ‏15/10/12 در انجمن Assembly

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    [​IMG]
    خوب ، رجیسترها را دیدیم و آشنائی کلی با آنها پیدا کردیم .
    حالا میخواهیم به رجیتسرها مقدار بدهیم و آنها را بخوانیم و … . ما معمولا در زبانهای دیگـــــر از علامت =(یا =ا:) برای مقدار دهی استفاده میکنیم ولی در زبان
    اسمبلی این کار ممکن نیست . در عوض از دستورالعمل MOV کمک میگیریم . با MOV میتوانیم داده ها را بین رجیسترها یا خانه های حافظه انتقال بدهیم . به این صورت MOV in_it/Value


    در اینجا In_it به معنای یک رجیستر، نام یک متغیر، یا آدرس یک مکان از حافظه است و Value هم یک مقدار عددی یا حرفی ، نام یک رجیستر و … میباشد .
    مانند MOV AX/200 که عدد ۲۰۰ دسیمال را به رجیستر AX منتقل میکند . (همیشه از سمت راست به چپ ) .
    در زبان اسمبلی ما میتوانیم با مبناهای ۲وَ۱۰وَ۱۶ کار کنیم . اعداد به طور پیش فرض مبنای ۱۰ هستند . برای نشان دادن عدد هگزا (مبنای ۱۶) در انتهای عدد یک حرف H ( یا h ) و در انتهای اعداد باینری علامت (b) قرار میدهیم . مثلا برای نشان دادن عدد AC1 مبنای ۱۶ باید حتما آن را بصورت AC1h بنویسیم . به همین ترتیب عدد۱۱۰b همان عدد ۶ خودمان است .
    با این تفاسیر برای دادن مقدار ۴Ch به رجیستر AX از دستور زیر استفاده میکنیم :
    mov ax/4Ch

    به همین شکل میتوانیم به نیم ثباتها هم مقدار بدهیم . مثلا میتوانیم برای مقدار دهی AH بنویسیم : mov ah/20h . در این حالت مقدار نیم ثبات AL ثابت بوده و محتوای AH برابر ۲۰h میشود . چون نیم ثباتها تک بایتی هستند ما نمیتوانیم عدد خارج از محدوده ۰ تا ۲۵۵ یا ۱۲۸- تا ۱۲۷ به آنها ارسال کنیم . در مورد اعداد منفی هم باید از طریق تبدیل به مکمل دو عمل کنیم که به زودی آن روش را توضیح خواهیم داد .
    مثلا ما نمیتوانیم mov ah/100h را انجام دهیم چون ۱۰۰h برابر ۲۵۶ بوده و از محدوده تعریف شده خارج است .
    به همین شکل میتوانیم محتوای ثباتها را هم منتقل کنیم . مثلا برای کپی کردن محتوای ثبات CXبه DX میتوانیم بنویسیم : mov dx/cx ، یعنی مقدار داخل Cx را به Dx کپی کن .
    باز هم باید به یک یا دوبایتی بودن ثباتها توجه کنیم . به عبارت دیگر ما نمیتوانیم مقدار یک ثبات تک بایتی را به یک ثبات کامل دوبایتی منتقل کنیم .
    مثلا عبارت 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

    به این ترتیب مقدار ۲۰hبه DS انتقال پیدا میکند ( گرچه تغییر دادن DS ایده خوبی نیست !)
    حالا مطالب گفته شده را تمرین میکنیم . ما میتوانیم با DEBUG اسمبلی بنویسیم و حتی برنامه های COM. درست کنیم . بنا براین در DOS، DEBUG، را اجرا کنید .
    D:LNGASM> DEBUG

    یک خط تیره به صورت - ظاهر میشود . این خط تیره اعلان DEUBG برای وارد کردن دستورات است .
    حرف A (به معنی شروع وارد کردن دستورات اسمبلی ) را وارد کرده و Enter را بزنید .
    عددی بصورت xxxx:0100 ظاهر میشود . این عدد برای شما (فعلا) مهم نیست ، پس به آن توجه نکنید .
    حالا میتوانید دستورات زیر را وارد کنید :

    MOV AX/100
    MOV BX/AX
    MOV ES/AX

    بعد از وارد کردن خط آخر یکبار دیگر کلید Enter را بزنید تا اعلان (-) دوباره ظاهر شود .
    در سطر اول ما عدد ۱۰۰h ( پیش فرض اعداد در Debug هگزا است ) را به AX منتقل کردیم . بعد مقدار AXبه BX و سپس مقدار AXبه ES منتقل شده . به این ترتیب همه ثباتهای AX/BX/ES باید در نهایت برابر ۱۰۰h باشند .
    برای دیدن صحت این مطلب دستور T ( به معنای Trace) را وارد کنید .
    با هر بار اجرای این دستور یکی از سطرهای برنامه اجرا میشود . بعلاوه شما میتوانید محتوای رجیسترها را هم ببینید .
    با اولین فرمان T ، سطر اول اجرا میشود . بازهم فرمان T را وارد کنید . الان مقدار۱۰۰h به BX داده شد و اگر به محتوای رجیستر AX توجه کنید خواهید دید که مقدار آن (همانطور که انتظار داشتیم ) برابر ۱۰۰h است . دوبار دیگر هم فرمان T را صادر کنید و در نهایت مقدار ثباتهای AX/BX/ES را ببینید . هر سه ثبات (حالا) برابر ۱۰۰h هستند .
    برای خارج شدن از Debug هم فرمان Q به معنی Quit را وارد کنید .