کاربران تگ شده

+ پاسخ به موضوع
صفحه 1 از 2 1 2 آخرینآخرین
نمایش نتایج: از شماره 1 تا 10 , از مجموع 13

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

  1. #1


    محل سکونت
    اینجا
    رشته تحصیلی
    نرم افزار
    نوشته ها
    1,210
    پسندیده
    2,426
    تشکر شده
    1,693 بار در 816 پست
    Mention شده
    در 0 پست
    تگ شده
    در 0 تاپیک

    grad آموزش زبان اسمبلی

    نمايش اطلاعات در كامپيوتر:
    در كامپيوتر از سيستم اعداد باينري (Binary) كه از رقم هاي صفر و يك تشكيل شده است ، استفاده مي شود كه هر يك از اين ارقام را يك بيت (BIT) يا يك رقم باينري مي نامند و مبناي اين اعداد 2 مي باشد. چون كار با سيستم ده دهي براي انسانها آسان تر است بنا بر اين در اين قسمت به تبديل مبناي دو به ده و ده به دو مي پردازيم و همچنين چون در كامپيوتر ها از مبناي 16 هم زياد استفاده مي شود ، تبديل مبناهاي فوق به مبناي 16 و برعكس را نيز بيان مي كنيم و در نهايت به چگونگي جمع و تفريق در مبناي دو و 16 خواهيم پرداخت.

    تبديل اعداد ده دهي به اعداد باينري:
    اعداد باينري يا دودويي از دو رقم 0 و 1 تشكيل شده اند. براي تبديل اعداد در مبناي 10 به مبناي دو ابتدا عدد را بر 2 تقسيمات متوالي مي كنيم و باقيمانده ها را تا زماني كه خارج قسمت صفر شود در نظر مي گيريم به عنوان مثال عدد 23 در مبناي ده برابر عدد 11101 در مبناي 2 است.

    23/2 = 11 باقيمانده 1
    11 / 2 = 5 باقيمانده1
    5 / 2 = 2 باقيمانده1
    2 / 2 = 1 باقيمانده0
    1/2=0 باقيمانده1
    ------------------------------
    2(11101)

    براي تبديل قسمت اعشاري نيز با ضرب آن قسمت در 2 و برداشتن قسمت صحيح و ادامه دادن ضربها تا زماني كه قسمت كسري برابر صفر شود ، قسمت اعشاري در مبناي دودويي را بدست مي آوريم. به عنوان مثال عدد 23.6875 برابر است با 2(11101.1011):

    0.6875 * 2 = 1.3750
    0.3750 * 2 = 0.7500
    0.7500 * 2 = 1.5000
    0.5000 * 2 = 1.0000
    ---------------------------
    2(0.1011)

    تبديل اعداد دودويي به دهدهي:
    براي تبديل اعداد دودويي به دهدهي هر بيت را شماره گذاري كرده و سپس اعداد درون بيت را در 2 به توان آن شماره ضرب مي كنيم. براي مثال عدد دودويي 2(1001.1101) برابر عدد ۹.۸۱۲۵ در مبناي ده است:

    3 2 1 0 . -1 -2 -3 -4
    --------------------------------------
    1 0 0 1 . 1 1 0 1
    --> (1*23) + (0*22) + (0*21) + (1*20) + (1*2-1) + (1*2-2) + (0*2-3) + (1*2-4) = 9.8125

    بايت، كلمه ، كلمه مضاعف:

    8 بيت را يك بايت گويند. با 8 بيت ميتوان اعداد 0000 0000 تا 1111 1111 را نمايش داد يعني اعداد 0 تا 255. همچنين اين 256 تركيب را مي توان ، نشانه ايي از يك كاراكتر در نظر گرفت. به عنوان مثال بايت 00101010 نمايش علامت ستاره (*) ميباشد. اگر در صفحه كليد علامت * فشرده شود كد فوق توليد مي گردد ولي اگر ما بخواهيم عدد باينري 00101010 را توليد كنيم بايد آن بصورت زير بنويسسم:

    00101010B

    در كامپيوترهاي شخصي تعداد دو بايت را يك كلمه نامند و تعداد چهار بايت را كلمه ي مضاعف گويند.

    اعداد مبناي 16 (Hexadecimal):
    سيستم اعداد مبناي 16 از ارقام 0 تا 9 بعلاوه رقم هاي A وB وC وD وE وF تشكيل شده است، كه رقم A معادل 10، رقم B معادل 11، رقم C معادل 12، رقم D معادل 13، رقم E معادل 14 و رقم F معادل 15 ميباشد. در كامپيوتر يك عدد مبناي 16 را با قرار دادن كاراكتر Hدر سمت راست آن عدد مشخص مي كنند مانند:
    56F2H

    تبديل اعداد مبناي 16 به مبناي 10 و برعكس:
    براي اين كار مانند تبديل در مبناي 2 عمل مي شود ولي بايد تقسيمات و يا ضرب كردنها به جاي 2 در 16 انجام پذيرد. همچنين براي تبديل از مبناي 16 به مبناي 10 نيز پايه ي توان هر بيت بجاي 2 ، 16 خواهد بود.
    تبديل اعداد مبناي دو به مبناي 16:
    ابتدا عدد دودويي را 4بيت4بيت از راست جدا كرده و سپس معادل مبناي 16 هر قسمت را مي نويسيم. با كنار هم قرار دادن رقم ها عدد مورد نظر در مبناي 16 به دست مي آيد به عنوان مثال عدد 2(1010110111) برابر 16(2B7) است:

    0010 1011 0111
    ------- ------- -------
    2 B 7

    تبديل اعداد مبناي 16 به مبناي دو:
    براي اين كار ابتدا هر رقم مبناي 16 را جدا كرده و معادل آن را در مبناي دو به دست مي آوريم. و با قرار دادن ارقام در كنار هم عدد در مبناي 2 به دست مي آيد. براي مثال 16(9E6) برابر 2(100111100110) است:

    9 E 6
    ------- ------- -------
    1001 1110 0110

  2. کاربر زیر به خاطر این پست مفید از WIN32 تشکر کرده است:

    f-n-sh (08-31-2010)

  3. #2


    محل سکونت
    اینجا
    رشته تحصیلی
    نرم افزار
    نوشته ها
    1,210
    پسندیده
    2,426
    تشکر شده
    1,693 بار در 816 پست
    Mention شده
    در 0 پست
    تگ شده
    در 0 تاپیک

    grad آموزش زبان اسمبلی2

    در ابتدا اين سوال مطرح ميشود اسمبلي چيست ؟
    زبانهاي برنامه نويسي كامپيوتر عموما به دو دسته زبانهاي سطح بالا و زبانهاي سطح پايين تقسيم ميشوند . برخي اين زبانها را به صه دسته تقسيم بندي كرده اند . زبانهاي سطح بالا و زبانهاي سطح پايين و زبانهاي سطح مياني . زبان برنامه نويسي اسمبلي جز زبانهاي سطح پايين است .
    زبان سطح پايين به زباني گفته ميشود كه از لحاض ساختاري و ترجمه بسيار به زبان ماشين نزديك است . يعني قابليت فهم ان براي ماشين بهتر و راحتتر است . اما زبانهاي سطح بالا با كاربر رابطه بهتري دارند و كاربر يا برنامه نويس با اين زبان راحتتر ارتباط برقرار ميكند .
    در زبان اسمبلي به سبب پايين بودن سطح ان ويژگيهايي نهفته است كه در هيچ يك از زبانهاي ديگر اين ويژگيها را نميتوان يافت : يكي از ويژگيهاي مهم اين زبان باز گذاشتن دست كاربر در كنترل سخت افزار بويژه CPU است . در واقع كاربر ميتواند با جز به جز پردازشگر و سخت افزار كامپيوتر ارتباط برقرار كند . بنابراين سرعت اينگونه برنامه ها نسبت به زبانهاي سطح بالا بسيار بالاتر است .
    البته اين زبان داراي مشكلاتي نيز هست . كه از جمله مهمترين انها زياد بودن تعداد دستوراتي است كه كاربر بايد براي انجام عملي خاص از انها استفاده كند .
    برنامه نويس براي برنامه نويسي بايد بر ارشيتكت ساخت CPU ‌مسلط باشد .
    سورس اين برنامه ها اصولا خطوط زيادي دارد .
    اين برنامه ها بسته به ماشين عمل ميكنند . يعني اگر ساختار اصلي ماشين تغيير كند . اين برنامه ها قابليت اجرا ندارند .
    اسمبلر چيست ؟
    براي تبديل زبان اسمبلي به زبان ماشين بايد از اين مترجم استفاده كرد . در واقع زبان اسمبلي از طريق اسمبلر به زبان ماشين كه صفر و يك است ترجمه ميشود .
    هر خط از زبان اسمبلي معادل يك خط است در زبان ماشين . اين ويژگي خاص دستورات اسمبلي است و در زبانها سطح بالا چنين اتفاقي نمي افتد .

    براي اسمبل كردن يك برنامه توسط اسمبلي بايد به يك اسمبلر دسترسي داشت . كه اين كار را ميتوان توسط يك نرم افزار ويژه انجام داد كه عموما از اسمبلرهاي TASM ‌يا MASM استفاده ميكنند . كه اولي محصول شركت turbo و دومي محصول مايكروسافت است . كه نسخه جديد MASM نرم افزاري است به نام ML ‌كه كار كردن با ان نسبت به دو نرم افزار بالايي بسيار ساده تر است .
    با استفاده از TASM ‌يا MASM سورس برنامه اي كه در فايلي با پسوند asm نوشته ايد را به يك فايل obj تبديل ميكنيد . سپس با يك لينكر TLINK ميتوانيد فايل را به فايل اجرايي تسوط كامپيوتر تبديل كنيد كه پسوند exe دارد .
    براي نوشتن سورس برنامه كافيست يك ويرايشگر متن داشته باشيد كه تمامي كامپيوتر ها چنين چيزي را اصولا دارند . اگر از سيتسم عامل ويندوز استفاده ميكنيد ميتوانيد از notepad استفاده كنيد اگر از word استفاده ميكنيد يادتان باشد كه تغييرات اتوماتيك انرا براي تصحيح كلمات از كار بياندازيد . پس از انكه سورس برنامه را نوشتيد كافيست انرا با پسوند asm ذخيره كنيد براي اينكار از منوي file ميتوانيد گزينه save as ‌را انتخاب كنيد و نام فايل را با پسوند asm در دو جفت كوتيشن قرار ميدهيد :
    “parsx.asm” سپس به پرامپت داس ميرويد .
    براي رفتن به محيط داس اگر از سيستم عامل win98 ‌و نسخه هاي 9X استفاده ميكنيد كافيست در منوي استارت گزينه run را انتخاب كنيد و سپس بنويسيد command و اگر از ويندوزهاي با نسخه بالاتر استفاده ميكنيد ميتوانيد در منوي run بنويسيد cmd و ازانجا به محيط داس برويد و به ادرسي كه اسمبلر شما و فايل asm شما قرار دارد برويد . براي رفتن به اين مسير ها بايد كمي بر داس مسلط باشيد .
    اما براي تغيير دايركتوري بدانيد كه ميزنيد cd namefolder و براي بيرون رفتن از ان ميزنيد cd\ و براي تغيير درايو نام درايو را بهمراه دو نقطه مينويسيد : c: به همين سادگي .
    اگر از نرم افزار MASM استفاده ميكنيد . كافيست تايپ كنيد MASM ‌و سپس نام فايل سورس را بنويسيد و ترتيب را ادامه دهيد تا فايل obj ‌شما ساخته شود . سپس LINK ‌را مينويسيد و نام فايلي كه ساخته ايد و پسوند obj ‌بان اختصاص داده شده است را مينويسيد . مراتب را ادام ميدهيد .
    اگر از ml استفاده ميكنيد . كافيست نام فايل asm ‌را جلوي ml بنويسيد . يعني مينويسيد ml parsx.asm و سپس برنامه شما به exe تبديل ميشود .
    براي استفاده از turbo assembler هم كافيست نام فايل را جلوي tasm بنويسيد تا obj شما ساخته شود و سپس با tlink نام فايل با پسوند obj فايل exe رابسازيد .

    tasm parsx.asm
    tlink parsx.obj

    و بدين ترتيب فايل شما ساخته ميشود .
    البته روش ديگري براي ساخت فايلهاي اسمبلي نيز وجود دارد . كه داراي محدوديتهاي زيادي است . كافيست در اعلان داس در هر مسيري كه هستيد تايپ كنيد debug تا وارد محيط debug ‌شويد .
    براي ورود دستورات اسمبلي كليد a ‌را ميزنيد و enter ميزنيد و براي خروج از محيط دستورات كافيست بدون نوشتن چيزي دكمه اينتر را بزنيد . براي خروج از محيط ديباگ نيز كافيست دكمه q را بزنيد و اينتر را بعد از ان بزنيد . و براي اجراي دستورات g را بزنيد . كه كار كردن با اين محيط اموزش ويژه اي را ميطلبد.

  4. کاربر زیر به خاطر این پست مفید از WIN32 تشکر کرده است:

    f-n-sh (08-31-2010)

  5. #3


    محل سکونت
    اینجا
    رشته تحصیلی
    نرم افزار
    نوشته ها
    1,210
    پسندیده
    2,426
    تشکر شده
    1,693 بار در 816 پست
    Mention شده
    در 0 پست
    تگ شده
    در 0 تاپیک
    اميدوارم به مبناها تسلط داشته باشيد ولي براي اونايي كه بلد نيستن مقداري توضيح ميدم
    از اونجايي كه زبان ماشين 0و1 هست هر عددي كه به ما ميدن بايد به اين دوعدد تبديل بشه.
    مبناي اعداد:2-8-10-16
    كه معمولاً اعداد رو در مبناي 10 به كار ميبريم.مثل 12؛45,67895
    حالا ميخوايم يك عدد مبناي 10 رو به مبناي 2 تبديل كنيم
    1-تقسيمهاي متوالي كه همتون بلدين ديگه؟؟؟

    35=(100011) ‌‌‌‹در مبناي دو›

    2-اين راه خيلي آسونتره و اگه يك عدد بزرگ دادن خيلي زودتر ميشه به جواب رسيد(عدد مورد نظر را به توانهاي 2 عدد تجزيه ميكنيم تا عدد مورد نظر يا استفاده از توانهاي 2 ساخته شود.به جاي عددهايي كه داريم 1 ميگذاريم)
    35=32(5^2)+3
    0^2 1^2 2^2 3^2 4^2 5^2
    1 1 0 0 0 1 = 35

    حالا اين سوال پيش مياد كه اعداد منفي رو چه جوري بايد به مبناي 2 برد؟؟؟
    ابتدا توضيح مختصري درباره ي Bit وByte بدم.


    به هر كدام از اين مربع ها يك بيت گفته ميشود با 0 و 1 پر ميشود.پس 8^2=256 حالت براي پر شدن اين مربع ها وجود دارد.
    8bit=1byte 16bit=1Word
    32bit=1Dw 64bit=Qw

    پس باتوجه به اين جدول بازه بايت(براي اعداد مثبت)‍[0,255]=
    براي اعداد منفي اين مقادير قرينه نميشود بلكه با استفاده از قانون مكمل2 اعداد رو منفي ميكنيم.


    نكته:با عوض كردن بيت علامت عدد منفي نميشود
    Byte= [-128,127]
    مكمل1 = جاي 1و0 عوض ميشود (0به جاي1 و برعكس)
    مكمل2 = از سمت راست به اولين يك رسيديم بدون تغيير مينويسيم ولي بقيه 0و1 ها عوض ميشود.
    براي اينكه بيشتر متوجه بشيد يك مثال ميزنم
    عدد 10- را به مبناي 2 ببريد؟
    حل:ابتدا عدد 10 را به مبناي دو ميبريم (00001010)= 10
    توجه كنيد كه اين مسئله در 8بيت حل ميشود و بايد صفرهاي پشت عدد حتماً نوشته شود
    طبق قانون مكمل2 از سمت راست عددها را ميخونيم.0 و1 (به يك رسيد اعداد عوض ميشود)1و0و1و1و1و1.
    (11110110)=10- در مبناي دو
    با يك سوال اين مبحث رو تموم ميكنم
    10000000 در مبناي دو برابر چه عدد يا عددهايي است؟

  6. کاربر زیر به خاطر این پست مفید از WIN32 تشکر کرده است:

    f-n-sh (08-31-2010)

  7. #4


    محل سکونت
    اینجا
    رشته تحصیلی
    نرم افزار
    نوشته ها
    1,210
    پسندیده
    2,426
    تشکر شده
    1,693 بار در 816 پست
    Mention شده
    در 0 پست
    تگ شده
    در 0 تاپیک
    در ابتدا جواب سوالي رو كه در پست قبلي كرده بودم رو بدم
    عدد 10000000=128- يا 128+ است.اين عدد تنها عددي است كه اگر بيت علامت عوض شود عدد قرينه ميشود.
    ادامه درس:
    در ادامه مبحث مبناها به بررسي مبناي 8 و 16 ميپردازيم.
    مبناي 8:
    اعداد 0و1و...و7 را قبول ميكند.
    111=2^8*1+1^8*5+0^8*7=157(در مبناي 8)

    تبديل مبناي 10 يه 8:
    روش تقسيمهاي متوالي


    مبناي 16:
    اعداد 0و1و2و...و9وf=15,14=e,13=d,12=c,11=b,10=a
    3a(در مبناي 16)=1^16*3+0^16*10=58

    تبديل مبناي 10 به 16:
    استفاده از تقسيمهاي متوالي.فكر نكنم ديگه لازم باشه توضيح بدم.

    براي اينكه مبناي اعداد را نشان بدهند؛راه ديگري هم وجود داره.يعني به جاي اينكه مبنا رو در زير پرانتز در كنير اعداد بنويسند.ميتوانيم از حروف استفاده كنيم:
    B: مبناي2
    o: مبناي 8
    d: مبناي 10
    h: مبناي 16

    تا اينجا هر تبديلي كه خونده بوديم براي مبناي 10 بود حالا تبديل اعداد به مبناي 2 رو ميگم كه كاربرد بيشتري داره
    تبديل از مبناي 8 به 2 و برعكس:
    براي تبديل اعداد از مبناي 8 به مبناي 2 در هررقم مبناي8 معادل سه رقم در مبناي2 ميشود.
    52o=5(101),2(010( پس 52o=101010
    از مبناي 2 به 8:
    از سمت راست رقمها را سه تا سه تا جدا ميكنيم.هر سه رقم درمبناي2 معادل يك رقم در مبناي8 است.
    011 011 101=
    335
    تبديل از مبناي 16 به2 و برعكس:
    مانند مبناي8 است فقط ارقام به چهار دسته تقسيم ميشود.

    سوال:2003h-5 معادل چه عددي است؟

  8. کاربر زیر به خاطر این پست مفید از WIN32 تشکر کرده است:

    f-n-sh (08-31-2010)

  9. #5


    محل سکونت
    اینجا
    رشته تحصیلی
    نرم افزار
    نوشته ها
    1,210
    پسندیده
    2,426
    تشکر شده
    1,693 بار در 816 پست
    Mention شده
    در 0 پست
    تگ شده
    در 0 تاپیک
    يكي ديگر از مبحث هايي كه در زبان اسمبلي شما خيلي استفاده ميكنيد جمع و تفريق مبناها است.

    جمع:
    مثل جمع كردن معمولي هست وزياد فرق نميكنه.
    0+0=0 1+0=1 1+1=10 0+1=1
    مثال:23o+110111b=?h
    حل:23 در مبناي 8=010011
    010011+110111=1001010=4ah

    تفريق:
    0-1=1 0-0=0 1-1=0 1-0=2(تو تفريق معمولي وقتي يه عدد كوچكتر رو ميخواستيم از يه عدد بزرگتر كم كنيم از عدد بعديش غرض ميگرفتيم.در اينجا هم به همين صورت عمل ميكنيم.با اين تفاوت كه مبناي عدد بايد توجه كنيم.مثلاً اگر در مبناي 2 باشه در موقع غرض گرفتن 2واحد به عدد اضاقه ميكنيم واگر مبناي 16 باشد 16 واحد)
    مثال:202h-76d=?b
    حل:
    202h=1000000010 , 76d=000011110

  10. کاربر زیر به خاطر این پست مفید از WIN32 تشکر کرده است:

    f-n-sh (08-31-2010)

  11. #6


    محل سکونت
    اینجا
    رشته تحصیلی
    نرم افزار
    نوشته ها
    1,210
    پسندیده
    2,426
    تشکر شده
    1,693 بار در 816 پست
    Mention شده
    در 0 پست
    تگ شده
    در 0 تاپیک
    درباره رجيسترها چند مطلب ديگه هم مانده كه در اينجا ميگم.
    از پردازنده هاي 386 به بعد(+386) ثباتهاي عمومي به صورت زير معرفي ميشوند كه 36 بيتي ميباشند:
    EAX, EBX, ECX, EDX
    در ثباتهاي اشاره گر به صورت:
    EDI, ESI, ESP, EBP, EIP
    در ثباتهاي سگمنت به صورت:
    FS, GS

    براي ديدن رجيسترها در DEBUG ,DOSرا اجرا كنيد و فرمان R را صادر كنيد :

    D:\MASM>DEBUG
    -R
    AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
    DS=17AA ES=17AA SS=17AA CS=17AA IP=0100 NV UP EI PL NZ NA PO NC
    17AA:0100 0F
    حافظه و آدرس دهي

    هر كامپيوتر مبتني بر 8086 داراي حداقل 640 كيلوبايت حافظه است . اين 640
    كيلوبايت به قطعات 64 كيلوبايتي تقسيم شده و ما اين قطعات را "قطعه " يا Segment
    ميناميم . هر سگمنت هم به خانه هاي تك بايتي ديگري تقسيم شده است .

    براي بدست آوردن مقدار يك بايت مشخص از حافظه ما بايد عدد مربوط به سگمنت و
    همچنين شماره آن بايت در سگمنت ( كه آفست Offset ناميده ميشود-چندمين خانه از شروع سگمنت ) را بدانيم .
    مثلا اگر مقدار مورد نظر در قطعه 0030h( يعني عدد در مبناي 16 است ) و آفست 13C4h
    باشد ما بايد قطعه اي كه شماره آن 0030h است را بيابيم و بعد در همان قطعه
    مقدار بايت شماره 13C4 را بخوانيم .
    براي نمايش اين حالت بين عدد سگمنت و آفست علامت ( : ) قرار ميدهيم . يعني
    ابتدا عدد مربوط به قطعه را نوشته و سپس عدد آفست را مي آوريم :
    Segment: Offset
    هميشه در آدرس دهي ها از اعداد مبناي 16 استفاده ميكنيم .
    مثال:1234H:5678H
    براي به دست آوردن آدرس فيزيكي جلوي آدرسBase يك صفر ميگذاريم و با آفست جمع ميزنيم.

    12340+5678=179B8H

  12. کاربر زیر به خاطر این پست مفید از WIN32 تشکر کرده است:

    f-n-sh (08-31-2010)

  13. #7


    محل سکونت
    اینجا
    رشته تحصیلی
    نرم افزار
    نوشته ها
    1,210
    پسندیده
    2,426
    تشکر شده
    1,693 بار در 816 پست
    Mention شده
    در 0 پست
    تگ شده
    در 0 تاپیک
    اگه بخایم کاملتر ثباتها رو مورد بررسی قرار بدیم:
    الف) همه منظوره :
    1. AX
    2. BX
    3. CX
    4. DX
    ب) ثبات های قطعه :
    1. CS
    2. DS
    3. ES
    4. SS
    ج) ثبات های شاخص :
    1. SI
    2. DI
    د) ثبات های پشته :
    1. BP
    2. SP
    ی) ثبات های اشاره گر دستورالعمل: IP
    و) ثبات پرچم

    پردازنده 8086 دارای 14 ثبات 16بیتی برنامه نویسی است. ثبات های دیگری نیز وجود دارد که از دید برنامه نویس پنهان است.

    الف) همه منظوره
    General Purpose Register :

    ثبات
    AX (انباره Accumulator):
    نزدیک ترین ثبات به قسمت ALU است، به همین دلیل سرعت محاسباتی نسبت به بقیه ثبات ها بیشتر است، اکثر عملیات ریاضی در این ثبات انجام می گیرد، به عنوان یک انباره به طور ضمنی در عملیات ورودی و خروجی استفاده می شود.
    ADD AX,4

    ثبات
    BX (پایه BASE):
    این ثبات علاوه بر همه منظوره بودن، در برخی روش های آدرس دهی نقش ثبات پایه را بازی می کند، به غیر از عملیات ریاضی می تواند به عنوان Offset متعلق به بخش داده باشد.
    ADD BX,4 : BL=BL+4
    Mov al,[BX] : al = Value[DS*10+BX]

    ثبات
    CX (شمارنده Counter):
    به عنوان یک شمارنده در دستورالعمل های حلقه و یا پردازش رشته و همچنین دستورالعمل های دستکاری بیت ها استفاده می شود.

    ثبات
    DX (داده DATA):
    این ثبات در بعی از دستورالعمل های محاسباتی مانند ضرب و تقسیم، نگهدارنده بخشی از نتایج است.

    ب) ثبات های قطعه
    Segment Register :
    آدرس آغاز هر Segment در این ثبات ها نگهداری می شود.

    CS(Code Segment) : آدرس کد سگمنت را نگهداری می کند

    DS(Data Segment) :آدرس سگمنت داده را نگهداری می کند

    SS(Stack Segment) :آدرس سگمنت پشته را نگهداری می کند

    ES(Extra Segment) :آدرس سگمنت Extra (اضافی) را نگهداری می کند
    آدرس ها در 8086 ، 20 بیتی هستند یعنی برای نگهداری یک آدرس به 20 بیت یا 5 رقم هگز نیاز داریم، حال چگونه می توان یک آدرس 20 بیتی را در ثبات های 16 بیتی ذخیره کرد؟
    برای حل این مشکل سگمنت ها از نقاطی شروع می شوند که چهار بیت کم ارزش آدرس آن نقاط صفر باشد، به عبارت دیگر سگمنت ها از مرز پاراگراف شروع می شوند.

    مرز پاراگراف : نقاطی از حافظه که در آنها بر 10 هگز یا 16 دهدهی قابل قسمت باشند.، یعنی چهار بیت کم ارزش صفر و یا اولین رقم هگز آدرس آن نقطه صفر باشد.
    برای نگهداری آدرس سگمنت ها تنها 16 بیت با ارزشآدرس سگمنت در ثبات ها قرار گرفته و هنگام محاسبه یک صفر در مقابل این آدرس قرار می دهیم
    Real Adress = Segment * 10Hex + Offset

    نکته : مرز پاراگراف 16 بایت به 16 بایت تکرار می شود.
    مثال : آدرس واقعی مقابل را پیدا کنید
    42B7:3FDC
    42B7 * 10 + 3FDC = 46B5C

    ج) ثبات های شاخص
    Index Register :
    SI (Source Index) : به عنوان اندیس جهت دسترسی به عناصر داده های ساختاری است

    DI (Destanation Index) به عنوان اندیس جهت دسترسی به آدرس رشته ها در دستورات پردازش رشته نیز استفاده می شود.
    از این ثبات ها به منظور دسترسی به داده ها در روش آدرس دهی شاخص دار مورد استفاده قرار می گیرد.

    د) ثبات های پشته Pointer Register :

    BP (Base Pointer) از ابتدا به انتها

    SP (Stack Pointer) از انتها به ابتدا

    از این ثبات ها به منظور دسترسی به داده ها در ناحیه
    stack memory استفاده می شود.
    این ثبات ها به عنوان افست یا شاخص چهت دسترسی به فضای پشته به کار برده می شود.
    * از پشته می توان به عنوان یک قطعه داده ای نیز استفاده نمود.

    ی
    ) ثبات های اشاره گر دستورالعمل: PC/IP
    این ثبات همواره مقدار offset دستورالعمل در حال اجراست (در ناحیه Code segment)
    Real Adress = Cs * 10 Hex + IP
    PC/IP مخفف Instruction Pointer / Program Counter می باشد.

    و) ثبات پرچم (
    FLAG)
    * در بعضی کتاب ها این ثبات با نام P.W.S (Program Word Status) شناخته می شود.
    این ثبات در هر لحظه آخرین وضعیت اجرای دستورالعمل را نشان می دهد.

    CF (Carry Flag) :
    اگر دستورالعمل منجر به نتیجه ای شود که در آن رقم نقلی یک باشد، این بیت یک خواهد شد در غیر اینصورت صفر می شود.

    PF (Parity Flag) :
    از این بیت برای بالا بردن اطمینان نسبت به انتقال داده ها بین اجزاء سیستم استفاده می شود، در این صورت که همواره تعداد یک ها در یک بایت باید تعداد فردی باشد.
    PF با توجه به این موضوع مقدار می گیرد یعنی اگر نتیجه دارای تعداد فرد یک باشد بیت P مقدار صفر را می گیردو اگر تعداد زوج یک باشد بیت P، مقدار یک می گیرد.

    AF (Auxlary Flag) :
    نشان دهنده رقم نقلی تولید شده بر بیت شماره 4 هنگام پردازش است، معمولا کاربرد آن در عملیات BCD می باشد. اگر این بیت صفر باشد رقم نقلی صفر است و اگر این بیت یک باشد، رقم نقلی یک است.

    ZF (Zero Flag) :
    اگر نتیجه حاصل صفر باشد این بیت یک و اگر نتیجه حاصل غیر صفر باشد این بیت صفر می شود.

    SF (Sign Flag) :
    اگر نتیچه حاصل منفی باشد این بیت یک و اگر نتیجه حاصل مثبت شود این بیت صفر خواهد شد.

    TF (Trap Flag) :
    اگر این بیت صفر باشد پردازنده در حالت نرمال دستورات را اجرا می کند و اگر یک باشد اجرای برنامه به صورت دستور به دستور خواهد بود.

    IF (Intrupt Flag) :
    اگر پردازنده در حال پردازش یک دستور وقفه باشد این بیت یک و در صورتیکه پردازنده در حال اجرای وقفه نباشد این بیت صفر خواهد بود.

    DF (Direct Flag) :
    این بیت نشان دهنده جهت پردازش است (به خصوص در دستورالعمل های رشته ای)
    در دستورالعمل های پردازش رشته اگر این بیت صفر باشد بدین معنی است که پردازش از ابتدا به انتها (افزایشی) می باشد و اگر این بیت یک باشد بدین معنی است که پردازش از انتها به ابتدا (کاهشی) است.

    OF (Overflow Flag) :
    اگر نتیجه حاصل Over Flow باشد، این بیت یک، در غیر اینصورت صفر خواهد بود.

    ویرایش توسط WIN32 : 08-11-2010 در ساعت 03:12 PM

  14. 2 کاربر از WIN32 به خاطر این پست مفید تشکر کرده اند:

    DataBus (11-27-2010), f-n-sh (08-31-2010)

  15. #8


    محل سکونت
    اینجا
    رشته تحصیلی
    نرم افزار
    نوشته ها
    1,210
    پسندیده
    2,426
    تشکر شده
    1,693 بار در 816 پست
    Mention شده
    در 0 پست
    تگ شده
    در 0 تاپیک
    [تنها کاربران عضو شده قادر به دیدن لینک ها هستند.. ]


    هر دستور اسمبلی از سه بخش تشکیل شده :
    1. برچسب
    2. عملگر
    3. عملوندها
    1. برچسب :
    وجود برچسب الزامی نیست بلکه به منطق برنامه بستگی داشته و در صورت لزوم استفاده می کنیم.
    برچسب دنباله ای از حروف کوچک و بزرگ، اعداد و _ است به طول حداکثر 31 کارکتر که با عدد شروع نمی شود، برچسب ها با ( : ) از عملگر جدا می شود.
    2. عملگرها:
    دربردارنده نوع عملی هستند که در آن دستورالعمل اجرا می شود.
    عملگرها خود شامل سه نوع عملیاتند:
    الف) شبه دستورالعمل :
    شبه دستورالعمل ها بر روند ترجمه تاثیر می گذارند و از ترجمه آنها قالب دستورالعمل ایجاد نمی شود (op code ندارند)
    ب) خود دستورالعمل:
    ج)فراخوانی ماکرو
    مجموعه ای از دستورالعمل ها را ممکن است یکجا جمع آوری کنیم که به آن ماکرو می گوییم و در صورت لزوم این دستورات را به کمک نام ماکرو فراخوانی می کنیم.
    3. عملوندها:
    وجود عملوند ها به ماهیت عملگرها بستگی دارد
    عملوندها:
    به طور کلی عملوندها به سه دسته تقسیم می شوند:
    1) نام ثبات
    2) یک ثابت
    3) نام شناسه که در بخشی از برنامه به عنوان برچسب استفاده شده است.

    هر دستور اسمبلی از سه بخش تشکیل شده :
    1. برچسب
    2. عملگر
    3. عملوندها
    1. برچسب :
    وجود برچسب الزامی نیست بلکه به منطق برنامه بستگی داشته و در صورت لزوم استفاده می کنیم.
    برچسب دنباله ای از حروف کوچک و بزرگ، اعداد و _ است به طول حداکثر 31 کارکتر که با عدد شروع نمی شود، برچسب ها با ( : ) از عملگر جدا می شود.
    2. عملگرها:
    دربردارنده نوع عملی هستند که در آن دستورالعمل اجرا می شود.
    عملگرها خود شامل سه نوع عملیاتند:
    الف) شبه دستورالعمل :
    شبه دستورالعمل ها بر روند ترجمه تاثیر می گذارند و از ترجمه آنها قالب دستورالعمل ایجاد نمی شود (op code ندارند)
    ب) خود دستورالعمل:
    ج)فراخوانی ماکرو
    مجموعه ای از دستورالعمل ها را ممکن است یکجا جمع آوری کنیم که به آن ماکرو می گوییم و در صورت لزوم این دستورات را به کمک نام ماکرو فراخوانی می کنیم.
    3. عملوندها:
    وجود عملوند ها به ماهیت عملگرها بستگی دارد
    ویرایش توسط WIN32 : 08-11-2010 در ساعت 03:15 PM

  16. 2 کاربر از WIN32 به خاطر این پست مفید تشکر کرده اند:

    DataBus (11-27-2010), f-n-sh (08-31-2010)

  17. #9


    محل سکونت
    اینجا
    رشته تحصیلی
    نرم افزار
    نوشته ها
    1,210
    پسندیده
    2,426
    تشکر شده
    1,693 بار در 816 پست
    Mention شده
    در 0 پست
    تگ شده
    در 0 تاپیک
    [تنها کاربران عضو شده قادر به دیدن لینک ها هستند.. ]


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

    Title
    Page
    Segment
    Assume
    Proc
    end
    ends
    endp
    Org
    EQU
    Public
    Extrn
    Include

    Title:
    متنی که در مقابل این شبه دستورالعمل نوشته می شود، به عنوان تیتر در سرصفحه listing درج می شود.
    Title First Program
    Page:
    این شبه دستورالعمل 2 عدد می گیرد، مثلا 60, 80 در این صورت در listing هر صفحه شامل 60 خط و هر خط شامل 80 ستون خواهد شد.
    تعداد ستون (کارکتر) ، تعداد سطر Page
    Page 60,80
    :Segment
    این شبه دستورالعمل آغاز هر Segment را نشان می دهد.
    چون 4 ناحیه داریم، این شبه دستورالعمل حداکثر 4 بار مورد استفاده قرار می گیرد،
    نحوه استفاده:
    | پارامتر کلاس| |پارامتر ترکیب| |پارامتر تنظیم| Segment نام Segment
    پارمتر تنظیم: مرزی را که سگمنت باید از آنجا شروع شود مشخص می کند، می تواند مقادیر زیر را بگیرد.
    Byte: آدرس سگمنت می تواند از هر نقطه ای از حافظه شروع شود.
    Word: سگمنت می تواند از هر نقطه ای از حافظه که آدرس آن زوج باشد شروع شود.
    Para: آدرس سگمنت از مرز پاراگراف شروع می شود.
    Page: آدرس سگمنت می تواند از هر جایی که بر 100H (256) قابل قسمت باشد شروع شود.
    پارامتر ترکیب:

    مشخص می کند که آیا این سگمنت با سگمنت های دیگری که پس از ترجمه برنامه به آ« پیوند داده می شوند، ترکیب داده شود یا خیر و می تواند یکی از مقادیر None، Public، Stack و Comment را اختیار کند.

    پارامتر کلاس:
    به پیوند دهنده کمک می کنند تا سگمنت هایی با نام های مختلف را به هم پیوند دهد، سگمنت ها را مشخص کند و ترتیب آنها را کنترل کند.

    Assume :
    از این شبه دستورالعمل برای مرتبط کردن سگمنت ها با ثباتهایشان استفاده می شود.
    بدین معنی که آدرس ابتدای سگمنت ها را در داخل ثبات های مربوطه قرار می دهد محل استفاده این دستور در Code Seg و در داخل زیر برنامه اصلی به عنوان اولین دستورالعمل می باشد.
    Assume cs:codeseg, ds:dataseg
    Proc:
    شکل به کار گیری این دستور به صورت مقابل می باشد.
    {near,far} proc نام زیر برنامه

    در هر برنامه ای یک زیر برنامه از نوع far وجود دارد که آن زیر برنامه نشان دهنده آغاز دستورالعمل های اجرایی است مانند main() در C.
    نکته: اگر فراخوانی از سگمنت دیگر باشد فراخوانی دور و اگر فراخوانی از سگمنت برنامه باشد فراخوانی نزدیک است.

    endp, ends, end:
    هر زیر برنامه به یک endp ختم می شود که پایان دهنده تعریف یک زیر برنامه است.
    هر سگمنت به یک ends ختم می شود که پایان دهنده تعریف یک سگمنت است.
    هر سگمنت به یک end ختم می شود که پایان دهنده همه سگمنت ها است.
    ترتیب endp همانند ترتیب پرانتزهاست یعنی اولین Endp مربوط به آخرین proc است و بالعکس آخرین endp مربوط به اولین proc است.

    Org:
    این کلمه از organize به معنی سازماندهی گرفته شده است.
    این شبه دستور به اندازه operand خود از آدرس جاری، حافظه رزرو می کند.
    Add ax,20
    Org 100H
    Mov bx,4
    دستور org 100H، به اندازه 100H خانه از حافظه را رزرو می کند.
    EQU:
    این دستور همانند دستور define در C می باشد.
    EQUها می تواند تودرتو باشند ولی باید ترتیب رعایت شود.
    Max EQU 100
    Count EQU max

    Public:
    با استفاده از این شبه دستورالعمل متغیرها یا مقادیر برای دیگر برنامه ها و زیربرنامه ها به اشتراک گذاشته می شود.
    Public sum, max, sort, …

    Extrn:
    این شبه دستورالعمل به اسمبلر اعلام می کند که متغیرهای معرفی شده توسط آن به عنوان متغیرهای خارجی هستند یعنی جای دیگر تعریف شده و در اینجا استفاده می شود.


    Include:
    برای پیوند دادن فایل ها و کتابخانه های استفاده شده در برنامه به برنامه استفاده می شود.
    نام فایل یا کتابخانه ای را که عناصر آن در داخل برنامه استفاده کرده ایم بعد از آن می آوریم مثل uses در Pascal
    Included IO.h

  18. 2 کاربر از WIN32 به خاطر این پست مفید تشکر کرده اند:

    DataBus (11-27-2010), f-n-sh (08-31-2010)

  19. #10


    محل سکونت
    اینجا
    رشته تحصیلی
    نرم افزار
    نوشته ها
    1,210
    پسندیده
    2,426
    تشکر شده
    1,693 بار در 816 پست
    Mention شده
    در 0 پست
    تگ شده
    در 0 تاپیک
    عملگرهاي بيتي

    عملگرهاي بيتي مانند عملوندهاي حسابي هستند با اين تفاوت كه روي بيت ها كار
    ميكنند. اين عملگرها عبارتند از : ... AND/OR/XOR/SHR/SHL/RCL/RCR/ .

    عملگر AND : اين اپراتور بيتهاي دو عدد(متغير) را با هم AND كرده و حاصل را در
    متغير (يا ثبات ) سمت چپ قرار ميدهد . اگر فرض كنيم كه هميشه 1 بودن بيت به
    معناي Trueو 0و بودن آن به معناي False است ، AND هميشه در صورتيكه هر دوبيت
    مقايسه شونده 1 باشند، حاصل 1يا Trueا را بر ميگرداند .
    جدول ارزشي AND :
    X | Y | X and Y |

    1 | 1 | 1 |
    1 | 0 | 0 |
    0 | 1 | 0 |
    0 | 0 | 0 |


    پس وقتي ما عملوند AND را با دو رجيستر بكار ميبريم ، بصورتي كه گفته شد بيتها
    با هم مقايسه شده و حاصل مقايسه در محل متناظر بيتها در ثبات سمت چپ قرار
    ميگيرند . مثلا اگر دستور AND Ah/Dh را اجرا كنيم ، حالتي نظير شكل زير را داريم :
    AH : 01101010
    DH : 01111101

    AH :AH AND DH : 01101000


    به نتيجه بدست آمده توجه كنيد .
    هر وقت كه بخواهيم بيت هاي خاصي از يك رجيستر را 0 كنيم ، يك عدد باينري كه
    همه بيتهاي آن ، بجز بيتهاي مورد نظر 1 هستند را در نظر گرفته با رجيستر مورد نظرAND
    ميكنيم .مثلا اگر بخواهيم بيتهاي دوم و سوم ثبات AX را صفر كنيم : AND AX/11111001b

    عملگر OR :
    اين عملوند بيتهاي دو عدد را با هم مقايسه كرده و اگر يكي از آن دو 1 بود ، بيت
    متناظر در ثبات سمت چپ را 1 ميكند . مثلا با دستور OR AH/DH بيتهاي AHبا DHا
    مقايسه شده و هر دو بيت متناظر كه با هم 0 بودند ، بيت تناظر در AHهم 0 ميشود
    AH : 01101010
    DH : 01111100

    AH : AH OR DH : 01111110


    هرگاه كه بخواهيم بيت هاي خاصي از يك متغير يا رجيستر را 1 كنيم ، يك عدد
    باينري كه همه بيتهاي آن غير از بيتهاي مورد نظر 0 هستند در نظر گرفته و با ثبات
    مورد نظر OR ميكنيم . مثلا اگر بخواهيم دو بيت پائين AHرا 1ا كنيم منويسيم : OR AH/00000011b


    عملگر : XOR
    عملوند XOR تنها در صورتي نتيجه 1 ميدهد كه دو بيت مقايسه شونده غيرهم ارزش
    باشند . يعني يكي 1 و ديگري 0 باشد .
    بعنوان مثال با اجراي XOR AH/DH اين عمليات روي بيتها انجام ميشود
    AH : 01101010
    DH : 01111100

    AH : AH XOR DH : 11101001


    وقتي بخواهيم يك مقدار ثبات را برابر صفر قرار بدهيم ، معمولا از آن را با خودش XOR
    ميكنيم . مثلا XOR CX/CX محتواي ثبات CX را برابر 0 قرار ميدهد .

    عملگرهاي SHRو SHLو :

    اين عملگرها، بيتها را به راست و چپ شيفت ( انتقال ) ميدهند .
    SHR Reg.nnum و SHL Reg.nnum
    .Reg اسم يك ثبات است مثلا AXو numو معلوم ميكند كه چند بيت بايد به طرف
    راست يا چپ انتقال پيدا كند . مثلا SHR AX/6 بيتهاي AXرا 6ا واحد به راست
    انتقال داده و بيتهاي چپ را با 0 پر ميكند . AX :10100010
    AX :SHR AX/4 : 00001010

    SHL
    هم عكس اين عمل را انجام ميدهد . يعني بيتها را به چپ شيفت داده و از
    طرف راست با 0 پر ميكند . AX :10100010
    AX :SHR AX/4 : 00100000

    مثال : اگر بخواهيم كه محتواي نيم ثبات CL را به نيم ثبات CH منتقل كنيم ،
    كافيت كه CXرا 8ا بيت به سمت چپ شيفت بدهيم . يعني SHL CX/8

    CL CH | 10110100 | 00101101 |


    محتواي اوليه CX CX

    CL CH | 00101101 | 00000000 |


    محتواي CX بعد از SHL CX/8
    انتقال

  20. 2 کاربر از WIN32 به خاطر این پست مفید تشکر کرده اند:

    DataBus (11-27-2010), f-n-sh (08-31-2010)

+ پاسخ به موضوع
صفحه 1 از 2 1 2 آخرینآخرین

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

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