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

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

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

  1. کاربر ارشد

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


    Byte Ptr : برای دست یابی به یک بایت
    Word Ptr: برای دستیابی به یک کلمه (۲بایت )
    Dword Ptr: برای دست یابی به یک مقدار ۴ بایتی


    این پیشوند ها را باید قبل از آدرس مورد نظر قرار دهیم .
    به عنوان مثال برای خواندن یک بایت از آفست ۱۰h میتوانیم بنویسیم :

    [​IMG]
    و برای خواندن دو بایت بصورت : mov ax/byte ptr ds:[10h] .
    میتوانیم از همین روش استفاده کرده و مقداری را به حافظه انتقال دهیم . مثلا میخواهیم یک کلمه دوبایتی را به آفست ۳۴h (در سگمنت برنامه ) منتقل کنیم . کافی است بنویسیم :

    mov word ptr [34h]/1FCAh .

    مثال :

    mov bx/34h
    mov ax/ds
    mov cx/ax
    mov ax/00h
    mov ds/ax
    mov ax/word ptr ds:[bx]
    mov ax/cx
    mov ds/ax

    جمع و تفریق
    بحث ما در مورد روشهای دستیابی و انتقال داده ها (فعلا) به پایان میرسد . حالا میخواهیم ببینیم که چطور عمل جمع و تفریق ، و بعدا ضرب و … ، را روی مقادیر انجام دهیم .
    دستورالعمل ADD به میزان خواسته شده به محتوای یک رجیستر یا متغیر اضافه میکند .
    مثلا ADD AH/20 عدد ۲۰ را به AH اضافه کرده و مجددا در AH قرار میدهد . اگر مقدار فعلی AH برابر ۳۰ باشد بعد از اجرای آن دستور برابر ۵۰ میشود . باید توجه کنیم که حاصل بدست آمده از محدوده مجاز تجاوز نکند . در این مثال اگر حاصل جمع عدد ۲۰ با محتوای AH بزرگتر از ۲۵۵ باشد ، خطای سرریز (Over Flow) رخ میدهد .
    مثال : این دستورات را در دیباگ وارد کنید :

    mov ax/5
    add ax/4
    int 20
    (به معنی سطر آخر توجه نکنید) . حالا یکبار دیگر Enter را بزنید تا خط اعلان Debug ظاهر شود . حرف G را بزنید تا برنامه شما اجرا شود . حالا فرمان آشنای R را برای دیدن محتوای رجیسترها وارد کنید و مقدار AX را ببینید .
    دستورالعمل SUB برعکس ADD بوده و به مقدار خواسته شده از محتوای یک ثبات یا متغیر کم میکند . مثلا SUB AX/100h به اندازه ۲۵۶ (۱۰۰h) از AX کم کرده و نتیجه را دوباره در AX قرار میدهد .
    مثال :
    mov bbx/100h SUB bx/50
    در این مثال حاصل bx را از ۱۰۰ به ۵۰ کاهش داده ایم .
    فرمان INC یک حالت خاص از ADD بوده و تنها یکواحد به محتوای ثبات اضافه میکند مثلا inc cx یعنی یک واحد به cx اضافه کن .
    و برعکس این ، دستور dec یکواحد از محتوای ثبات کم میکند . مانند : dec cx .
    باید توجه کنیم که این دستورات تنها روی ثباتهای همه منظوره DX.AX.D قابل استفاده هستند .