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

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

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

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    [​IMG]
    تا اینجا یاد گرفتیم که چطور مقادیر را بین ثباتها منتقل کنیم : با فرمان MOV.
    با همین دستور میتوانیم مقادیر را از محلهای حافظه خوانده یا در آنجا بنویسیم .



    برای کار با حافظه دوحالت ممکن است وجود داشته باشد :
    ۱- آدرس مورد نظر در سگمنت جاری باشد . در برنامه های COM. کل برنامه (غالبا)
    از یک سگمنت تشکیل میشود .
    ۲- آدرس مورد نظر خارج از سگمنت جاری باشد .

    ثبات DS همیشه به قطعه ای اشاره میکند که داده های مورد نیاز برنامه در آن هستند . این قطعه در برنامه های EXE. یک قطعه مستقل است ولی در برنامه های COM . ، قطعه داده های و قطعه کد برنامه در یک سگمنت هستند . بنا براین مقدار ثبات DS در یک برنامه COM. ثابت است .
    در حالت کلی آدرس یک محل از حافظه بصورت DS:address مشخص میشود. DS حاوی آدرس سگمنت داده ها بوده و address آفست را مشخص میکند . چون همانطور که گفتیم DS در برنامه های COM. ثابت است ، پس در صورتی که آدرس مورد نظر در همین قطعه باشد از نوشتن DS صرفنظر میکنیم .
    به عنوان مثال اگر قطعه داده های برنامه ما ۹۰۰۰h باشد و ما بخواهیم آفست ۲۴h ام در همین قطعه را بدست بیاوریم ، میتوانیم از یکی از دو شکل زیر استفاده کنیم :

    DS:24h
    or
    24h
    البته چون اسمبلر منظور ما از نوشتن عدد ۲۴h را نخواهد فهمید شکل دوم یک خطای هنگام ترجمه تولید خواهد کرد ولی ما روش صحیح را هم خواهیم گفت .
    ما آدرس ها (یا اشاره گرها) را برای این میخواهیم که بتوانیم به یک خانه از حافظه دسترسی پیدا کنیم . برای اینکه نشان بدهیم منظور ما از عدد مشخص شده ، آدرس است نه خود عدد (مثل ۲۴h در مثال قبلی ) آن عدد را داخل [] قرار میدهیم . بنا براین :
    mov ah/24h عدد ۲۴h را به AX منتقل میکند ولی …. mov ah/[24h] محتوای آفست ۲۴h را به AX منتقل میکند .

    در شکل دوم هر مقداری که در آفست ۲۴h ام سگمنت جاری موجود باشد به ثبات Ah منتقل میگردد.
    به همین صورت میتوانیم یک مقدار را به یک خانه از حافظه منتقل کنیم : mov [24h]/ah : محتوای ثبات AH را به آفست ۲۴h ام منتقل میکند .
    اگر آدرس مورد نظر خارج از محدوده سگمنت جاری بوده و در قطعه ای جدا قرار داشته باشد ، میتوانیم از DSیا ESا (ترجیحا) برای دستیابی به حافظه استفاده کرد:
    مثال :


    [​IMG]
    به این ترتیب ما به آفست ۸۹h از سگمنت ۹۰۰۰h دسترسی پیدا میکنیم .
    البته دستورات فوق مارا به مقصودمان میرسانند ولی ما نمیتوانیم به دلخواه خودمان DS را تغییر دهیم چون همانطور که گفتیم DS به قطعه داده های برنامه اشاره میکند و برنامه ، داده ها و مقادیر متغیر ها را از سگمنتی که با DS مشخص شده میخواند .
    بنا براین ما نباید مقدار DS را تغییر بدهیم مگر اینکه آن را دوباره به حالت اول برگردانیم . برای ذخیره و بازیابی محتوای رجیسترها، یک روش ساده و عمومی وجود دارد که به زودی خواهیم گفت ولی در این مثال ما میتوانستیم مقدار قبلی DS را در یک رجیستر دیگر مثل CX نگهداریم :

    انتقال محتوای dsبه AX mov ax/ds
    انتقال محتوای AXبه CX mov cx/ax
    دادن مقدار۹۰۰۰hبه AX mov ax/9000h
    انتقال محتوای AXبه DS mov ds/ax
    خواندن آدرس mov ah/ds:[89h]
    بازیابی مقدار DS mov ax/cx mov ds/ax

    اگر بخواهیم آفست آدرس را با یک رجیستر مشخص کنیم باید به نکات زیر توجه کنیم :
    ۱- اگر آدرس سگمنت با DS مشخص شده ، یا آدرس در سگمنت جاری باشد ، باید مقدار آفست را در ثبات BX قرار دهیم .
    مثلا:


    [​IMG]
    ۲- اگر از ES به عنوان مقدار سگمنت استفاده میشود باید از DI به عنوان آفست استفاده کنیم مثل mov cx/es:[di] .
    چون ما با برنامه های COM. سرو کار داریم ، پس از شکل اول و BX استفاده خواهیم کرد .