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

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

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

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    [​IMG]
    حتما با ثابتها در زبانهائی مثل پاسکال آشنائی دارید . بعنوان مثال با جمله Const MaxLen=1024; ، ثابتی بنام MaxLen تعریف شده و مقدار آن برابر ۱۰۲۴ قرار قرار میگیرد . پس از آن کامپایلر در هرجا که MaxLen را مشاهده کند عدد ۱۰۲۴ را بجای آن قرار میدهد .
    در زبان اسمبلی برای تعریف یک ثابت از معرفه EQU به شکل زیر استفاده میکنیم:



    مقدار EQU نام ثابت

    مثلا : MaxLen EQU 1024
    به این ترتیب اسمبلر همیشه بجای MaxLen عدد ۱۰۲۴ را قرار میدهد . بهمین دلیل ثابتهای برنامه را باید قبل از جمله CODE. بنویسیم . مثال :

    . MODEL SMALL
    SECTORS EQU 18
    SIDES EQU 2
    . CODE
    :
    :
    به این خاطر ثابتها را قبل از CODE. تعریف میکنیم که در برنامه کامپایل شده اثری از نام ثابت نبوده بلکه مقدار هر ثابت در جای لازم قرار گرفته است .
    مثال :

    . MODEL SMALL
    BELL EQU 7
    . CODE
    ORG 100H
    MOV AH/0EH
    MOV AL/BELL
    INT 10H
    INT 20H
    END
    متغیرها
    از متغیرها برای نگهداری موقتی داده ها استفاده میکنیم . مثلا در زبان پاسکال میتوانیم با عبارت Var یک متغیر تعریف کنیم مثل Var Buffer:Byte; و در زبان سی مثل unsigned char Buffer; .
    متغیرها در زبان اسمبلی باید حتما در داخل قطعه داده (DS) تعریف بشوند و در برنامه های COM. هم از آنجائی که قطعه داده ها و کد یکی است میتوانیم در قطعه کد نیز تعریف کنیم .
    برای تعریف یک متغیر باید بعد از نام آن یکی از عبارات ..DB/DW/DD/ را بیاوریم . DB مشخصه نوع بایت ،DW مشخصه نوع Word (دوبایتی ) و DD مشخصه نوع (Double Word) 4 بایتی است .
    مثلا :

    . CODE
    SIZE DW 1024
    BELL DB 7
    در این مثال Size یک متغیر دو بایتی بوده و مقدار اولیه ان ۱۰۲۴ است و BELL نیز یک متغیر تک بایتی با مقدار ۷ میباشد .
    اگر نمیخواهیم به متغیر مقدار اولیه بدهیم ، میتوانیم از علامت (?) بجای مقدار استفاده کنیم مانند :

    maxlen dw?
    برای تعریف یک رشته کاراکتری از معرفه DB استفاده کرده و محتوای رشته را داخل (”) یا (”") قرار میدهیم . مثلا :
    MSG DB “ASSEMBLY / A QUICK LOOK ! “
    در این مثال MSG یک متغیر کاراکتری است . در اسمبلی میتوانیم از کد اسکی کاراکتر ها نیز استفاده کنیم . مثلا اگر در تعریف DB بخواهیم کدهای اسکی ۱۳و ۱۰ را به MSG اضافه کنیم میتوانیم با کاما این کار را انجام دهیم :
    MSG DB “ASSEMBLY / A QUICK LOOK ! “/13/10
    یا : MSG DB “ASSEMBLY / A QUICK LOOK ! “/0Ah/0Dh
    یا حتی : MSG DB “ASSEMBLY / A QUICK LOOK ! “/0Ah/0Dh/’$’

    این ترکیبها همه یک رشته کاراکتری معرفی میکنند .
    برای تعریف آرایه ها نیز از روشی مشابه و به شکل زیر استفاده میکنیم :
    (مقدار اولیه )DUP تعداد عناصر DB/DW/DD نام متغیر مانند:
    که ارایه ای یک کیلوبایتی تعریف کرده و همه عناصر آن را با ۰ پر میکند.
    اگر نخواهیم مقدار اولیه ای در نظر گرفته شود از ? استفاده میکنیم .
    مانند:

    BUFFER DB 1024 DUP (? )
    و برای تعریف یک آرایه حرفی باید با یک حرف یا عبارت آن را پر کنیم :
    BUFFER DB 1024 DUP(”A(”
    و حتی :
    گفتیم که متغیرها همیشه (در برنامه های COM.) در قطعه کد و بعد از CODE. نوشته میشوند ، بنا براین اسمبلر همیشه سعی خواهد کرد که آنها را بصورت یک کدماشین قابل اجرا تفسیر کند. به همین دلیل همیشه بایک دستور JMP از روی آنها پرش میکنیم . مثال :
    . MODEL SMALL
    RDISK EQU 2
    . CODE
    ORG1 100H
    START :
    JMP MAIN
    BUFFER DB 512 DUP(0 )
    MSG DB “DISK DUP.”/13/10/’$’
    MAIN :
    مجموعه کدهای اجرایی برنامه ;

    : END START
    همانطور که میبینید با دستور JMP MAIN از قسمت تعریف داده ها پرش کرده ایم .
    BUFFER DB 1024 DUP(”STACK(”
    BUFFER DB 1024 DUP (0)