دوست عزیز، به سایت علمی نخبگان جوان خوش آمدید

مشاهده این پیام به این معنی است که شما در سایت عضو نیستید، لطفا در صورت تمایل جهت عضویت در سایت علمی نخبگان جوان اینجا کلیک کنید.

توجه داشته باشید، در صورتی که عضو سایت نباشید نمی توانید از تمامی امکانات و خدمات سایت استفاده کنید.
نمایش نتایج: از شماره 1 تا 10 , از مجموع 81

موضوع: آموزش جامع زبان اسمبلی - Assembly

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #11
    کـــــــاربر فــــعال
    رشته تحصیلی
    کامپیوتر(مهندسی نرم افزار)
    نوشته ها
    18,304
    ارسال تشکر
    4,182
    دریافت تشکر: 19,008
    قدرت امتیاز دهی
    220
    Array

    پیش فرض پاسخ : آموزش جامع زبان اسمبلی - Assembly

    در اين قسمت نحوه دسترسي به مقادير متغير ها را ياد ميگيريم .
    ے وقتي كه ميخواهيم مقدار يك متغير را به يك متغير يا ثبات ديگر منتقل كنيم بايد
    ے به اندازه آن توجه داشته باشيم . مثلا اگر متغيري بصورت LOCATE DB 10 تعريف كرده
    ے باشيم ، به دليل تك بايتي بودن ، نميتوانيم آن را به يك ثبات كامل مثل AX يا
    متغير دوبايتي كه با DW تعريف شده است ارسال كنيم .
    ے اما انتقال آن به يك نيم ثبات مثل ALيا AHا و ... مجاز است مانند . MOV BH/LOCATE


    ے از متغيرها بيشتر براي نگهداري موقت داده ها استفاده ميشود . مثلا وقتي كه
    ے برنامه اي براي كار با قطاعهاي ديسك مينويسيم ، بايد يك محل موقتي براي ذخيره
    ے محتواي قطاع هاي خوانده شده ايجاد كنيم . در اين موقع يك متغير به شكل (ترجيحا)
    آرايه تعريف ميكنيم .
    ے وقتي به اين شكل با متغيرها برخورد ميشود، به دانستن آدرس آن نياز پيدا ميكنيم
    فرض كنيد ميخواهيم جمله A QUICK START TO ASSEMBLY PROGRAMMING را چاپ كنيم .
    در قدم اول بايد متغيري تعريف كرده و اين جمله را داخل آن قرار دهيم .
    پس : MSG DB 'A QUICK START TO ASSEMBLY PROGRAMMING'/13/10/'$'


    ے اعداد 13وَ10 انتهاي رشته براي انتقال مكان نما به سطر بعد هستند و كاراكتر '$'
    ے از اين جهت وجود دارد كه تابع چاپ رشته انتهاي رشته كاراكتري را با بودن $
    تشخيص ميدهد.
    ے براي چاپ رشته كاراكتري راه هائي وجود دارد كه يكي از آنها استفاده از تابع 9h
    مربوط به INT 21h ميباشد .
    براي فراخواني آن بايد به اين صورت رجيستر ها را پر كنيم : AH=09H

    آدرس رشته كاراكتري DS:DX = INT 21H

    ے عبارت DS:DX نشان ميدهد كه مقدار قطعه (Segment) رشته كاراكتري ، يعني آن قطعه
    ے اي كه متغير تعريف شده در آن قرار گرفته است ، را بايد در DS قرار بدهيم . به
    همين صورت نيز مقدار آفست (Offset) آن را به DX انتقال ميدهيم .
    براي بدست آوردن شماره قطعه يك متغير از عملگر SEG استفاده ميكنيم .
    ے مثلا براي بدست آوردن شماره قطعه MSGاز MOV AX/Seg MSGز استفاده ميكنيم . اين
    دستور شماره سگمنت MSG را پيدا كرده و در AX قرار ميدهد .
    براي بدست آوردن شماره آفست هم از OFFSET استفاده ميكنيم مثلا MOV DX/OFFSET MSG
    پس براي چاپ رشته MSG بايد به اين صورت عمل كنيم :


    MOV AH/09H
    MOV DX/OFFSET MSG
    INT 21H



    ے اين قطعه كاري كه ما ميخواهيم را انجام ميدهد و اگر دقت كنيد متوجه ميشويد كه
    ے اصلا شماره قطعه (Segment) را محاسبه نكرده ايم . علت اينست كه متغير ما به دليل
    ے COM. بودن برنامه در Code Segment ( كه با CODE. مشخص ميشود) تعريف شده پس خود
    ے بخود DS حاوي مقدار سگمنت آن هست . ( باز هم ياد آوري ميكنيم كه CS حاوي شماره
    ثبات كد و DS حاوي ثبات داده ها است و در برنامه هاي COM. مقدار برابر دارند)

    ے يك دستور خلاصه براي بدست آوردن عدد آفست وجود دارد بنام LEA .كل كاري كه اين
    ے دستورالعمل انجام ميدهد اينست كه ديگر احتياج به نوشتن OFFSET نخواهد بود . به
    عنوان مثال MOV DX/OFFSET MSGبا LEA DX/MSGا برابر است .
    با اين تفاسير كل برنامه به اين شكل خواهد بود .

    . MODEL SMALL
    . CODE
    ORG 100H
    START :
    JMP MAIN ; skip to main codes
    MSG DB 'A QUICK START TO ASSEMBLY PROGRAMMING'/13/10/'$'
    MAIN :
    LEA DX/MSG ; get MSG offset
    MOV AH/09 ; write string function
    INT 21H ; call interrupt 21h
    INT 20H ; terminate program
    END START



    تمرين :
    ے براي اينكه تمرين بهتري داشته باشيم ، ميخواهيم خودمان و فقط با استفاده از وقفه
    ے مربوط به چاپ كاراكتر همين جمله را چاپ كنيم . قبلا گفتيم كه تابع 0Eh از وقفه
    ے 10h يك كاراكتر را در محل مكان نما چاپ كرده و مكان نما را يك خانه به راست
    انتقال ميدهد. ميخواهيم رشته كاراكتري بالا را تا رسيدن به علامت $ چاپ كنيم .
    ے بهترين كار اينست كه عدد آفست را در BX قرار بدهيم . در اينموقع آفست اولين
    ے كاراكتر در BX است . مقدار داخل اين آفست را بصورت MOV al/[bx] به ثبات AL
    ے منتقل كرده و بعد چاپ ميكنيم . براي كاراكتر بعدي يكواحد به BX اضافه ميكنيم و
    ے دوباره همان كارهاي قبلي ... . اين عمليات را بايد تا رسيدن به كاراكتر '$' ادامه
    بدهيم .
    ے ** اين برنامه را خودتان و بدون توجه به راه حل ارائه شده بنويسيد و فايل COM.
    آن را بسازيد.


    . MODEL SMALL
    . CODE
    ORG 100H
    START :
    JMP MAIN ; jump to MAIN
    MSG DB 'A QUICK START TO ASSEMBLY PROGRAMMING'/13/10/'$'
    MAIN :
    LEA BX/MSG ; get MSG offset
    MOV AH/0EH ; write char function
    LOOP :_
    MOV AL/[BX] ; move [BX] to AL: charactre code
    CMP AL/'$' ; if al is equal with '$'
    JE END _; then jump to END _
    INT 10H ; otherwise call interrupt 10h
    INC BX ; BX=BX+1
    JMP LOOP _; jump to next caharcter
    END :_
    INT 20H ; terminae program
    END START
    شنبه : یارب العالمین 1شنبه : یا ذاالجلال والاکرام
    2شنبه : یا قاضی الحاجات 3شنبه : یاارحم الراحمین
    4شنبه : یا حی یاقیوم 5شنبه : لا اله الا الله الملک الحق المبین
    جمعه : اللهم صل علی محمد وال محمد وعجل فرجهم

  2. کاربرانی که از پست مفید آبجی سپاس کرده اند.


اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

موضوعات مشابه

  1. مقاله: یادگیری الکترونیکی
    توسط آبجی در انجمن بخش مقالات وب و اینترنت
    پاسخ ها: 0
    آخرين نوشته: 21st February 2010, 10:59 PM
  2. مقاله: آموزش و پرورش در اسپانیا
    توسط *مینا* در انجمن علوم تربیتی
    پاسخ ها: 0
    آخرين نوشته: 20th November 2009, 10:49 PM
  3. گذری بر تاریخچه خط در ايران زمين
    توسط Admin در انجمن ایران شناسی
    پاسخ ها: 1
    آخرين نوشته: 15th March 2009, 07:24 PM

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •