بعضي مواقع از فراخواني معمولي
روالها استفاده ميشود. ولي DOS و بسياري از سيستمعاملهاي ديگر از نوع بخصوص فراخواني روال
استفاده ميکنند؛ يک وقفه نرمافزاري که بعضي مواقع آن را يک تله يا يک استثناء ميگويند.
براي فعال کردن يک وقفه ميتوان
از دستورالعمل int
استفاده نمود.
بعلاوه، بعضي وقفههاي توسط خود
سختافزار PC
توليد ميشوند.
کلمه روال درزبان پاسکال و ساير زبانهاي برنامهنويسي سطح بالا براي بيان زير برنامهاي که تقريباً يک واحد کاملي ميباشد، بکار ميرود.
آرگومانها بايستي متناظر با پارامترهاي مجازي روال مزبور باشند. در زبان پاسکال نوع ديگري از زير برنامه به نام تابع وجود دارد. يک تابع در زبان پاسکال شبيه يک روال ميباشد بجز اينکه آن را در داخل يک عبارتي با ذکر نام و آرگومانهاي مربوطه در داخل پرانتز، فراخواني ميکنيم. يکتابع مقداري را بر ميگرداند که اين مقدار در عبارت مربوطه مورد استفاده قرار ميگيرد.
آدرس برگشت به برنامه فراخواننده زير برنامه روي پشته ذخيره ميشود ميتوان مقادير ثباتها در زمان فراخواني يک زيربرنامه را روي پشته ذخيره نموده ودرزمان برگشت به برنامه فراخواننده مقاديرثباتها را با استفاده ازپشته بازسازي نمود، با استفاده از پشته ميتوان آرگومانها را به يک زيربرنامهانتقال داده ويا مقاديري را ازيک زيربرنامه فراخواننده انتقال داد، وحتي ميتوان فضاي لازم براي متغيرهاي محلي را روي پشته تخصيص داد.
که در آن statemaet_labelمتناظر با فيلد اسم دستور اسمبلي ديگري ميباشد.
دستور JMPشبيه به gotoدر پاسکال يا بيسيک است.
اگر شرايط مختلفي وجود داشته باشد که تحت آن شرايط برنامه بايد خاتمه پيدا کند، ميتوان به يک دستور اجرايي که به وسيله برچسب quit:مشخص شده است و محل اختتام برنامه ميباشد، پرش نمود.
فرمهاي درون سگمنتي وقتي توليد ميشوند که مقصد در درون سگمنت جاري قرار داشته باشد، اين فرمها در بين انواع ديگر از همه رايجتر ميباشند.
پرشهاي بين سگمنتي که به عبارتي به يک سگمنت کد ديگر پرش ميکنند، به ندرت مورد نياز ميباشند.
پرشهاي غيرمستقيم مقدار جابجايي خود از دستورالعمل مقصد را، از يک ثبات يا از يک کلمه در حافظه به دست ميآورند.
پرشهاي درون سگمنتي نسبي، از انواع ديگر معمولتر بوده و بيشتر مورد استفاده قرار ميگيرند.
هر دستورالعمل زبان اسمبلي در روي يک خط فايل کد منبع وارد ميشود. يک خط ميتواند حداکثر 128 کاراکتر داشته باشد.
وجود خطوط خالي مجاز است و استفاده از آنها براي جدا کردن بخش هاي مختلف کد برنامه مفيد است.
توضيحات براي مستندسازي و فهم بيشتر برنامه به کار ميروند و ميتوانند در هر جايي از برنامه وجود داشته باشند. هر توضيحي با کاراکتر ';'شروع ميشود و تا انتهاي خط ميتواند ادامه داشته باشد.
حالت های آدرس دهی
بلاواسطه
ثبات
مستقیم
دارای مبنا
دارای اندیس
دارای مبنا و اندیس
زبان اسمبلي داراي سه نوع دستور ميباشد:
دستورالعمل
دستور اسمبلر
ماکرو
دستورالعمل: به وسيله اسمبلر به کد هدف ترجمه ميگردد و اين کدها هستند که در زمان اجرا، اجرا ميگردند.
دستور اسمبلر: به اسمبلر ميگويد که عملي را انجام دهد. و اغلب هيچ اثري بر روي کد هدف ندارد.
ماکرو: نوعي دستورالعمل است که در آن تعدادي دستورالعملها، دستورات اسمبلر يا حتي ماکروهاي ديگر قرار گرفتهاند.
يک دستورالعمل ميتواند شامل عناصر زير باشد:
توضيحاتعملوند(ها)نام دستورالعملاسم
[;comment][operand(s)]mnemonic[name]
يک کاربرد فيلم اسم آن است که ميتوان آدرس دستورالعملي را به صورت نمادي بعد از اسمبل و لينک شدن برنامه با يک برچسب نشان داد. دستورالعملهاي ديگر به راحتي ميتوانند به دستورالعمل مزبور رجوع کنند.
دستورالعملهاي داراي برچسب ميتوانند مقصد يک دستورالعمل پرش در زبان اسمبلي باشند.
ساختار حلقه در زبان اسمبلي وجود ندارد، اما ميتوان حلقهها را با استفاده از jmpو يا دستورالعملهاي ديگر پيادهسازي کرد.
برچسب نميتواندبه وسيله عدد شروع شود. و اگر نقطه استفاده شود، حتماً بايد اولين کاراکتر باشد.
بغيراز اعداد و نقطه، کاراکترهاي ديگر ميتوانند در هر موقعيتي استفاده شوند.
فقط 31 کاراکتر اول اسم مورد استفاده قرار خواهد گرفت.
مقادير عددي در دستورات زبان اسمبلي، دهدهي فرض ميشوند و فقط زماني اين فرض کنار گذاشته ميشود که در برنامه منبع حالت ديگري خواسته شده باشد.
يک مقدار شانزده شانزدهي بايد با يک عدد بغيراز اعداد شانزدهشانزدهي «a»تا «f»، شروع شود تا اسمبلر بتواند آنها را از يک اسم تشخيص دهد.
شکل کلی برنامه
START
STACK _ SEGSEGMENTPARASTACK‘STACK’
اندازه پشته.
STACK _ SEGENDS
DATA _ SEGSEGMENT PARA‘DATA’
متغیر ها
DATA _ SEGENDS
EXTRA _ SEG SEGMENTPARA‘EXTRA’
متغیرهای رشته ها
EXTRA _ SEGENDS
CODE _ SEG SEGMENTPARA‘CODE’
دستورالعمل های برنامه
CODE _ SEGENDS
ENDSTART
يک برنامه از قسمتهاي مختلفي تشکيل شده است: هر کدام از اين قسمتها با دستورات اسمبلر SEGMENTو ENDSشروع شده و خاتمه يافتهاند:
Segment_nameSEGMENT
.
.
Segment_nameENDS
دستور ENDSهيچ وقت داراي عملوند نيست؛ ولي دستور SEGMENTدر بعضي کاربردها با عملوند به کار ميرود.
آخرين دستور برنامه، دستور اسمبلر زير است:
startEND
دستور ENDبه اسمبلر ميگويد که پردازش دستورات کد منبع را خاتمه دهد.
در يک برنامه منبع فقط يک دستور ENDوجود دارد و آن آخرين دستور است.
عملوند startمشخص کننده اولين دستور برنامه است که بايد اجرا شود. زماني که برنامه بار ميشود، سيستمعامل ثبات سگمنت کد را با سگمنتي که حاوي اين دستورالعمل است مقداردهي کرده و ثبات اشارهگر دستورالعملها، IPرا با آفست اين دستورالعمل از ابتداي سگمنت مزبور شروع مينمايد.
Number1 DW ?
Number2DW ?
هرکدام يک کلمه را در سگمنت داده ذخيره ميکنند.
علامت سؤال به اسمبلر ميگويد که هيچ مقدار اوليهاي به اين دو کلمه نسبت داده نشود.
هر کدام از دستورات DBچند بايت را با مقادير اوليه داده شده ذخيره مينمايند. در هر مورد، عملوندها، مقادير اوليه را تعيين ميکنند.
سگمنت کد با دستور اسمبلر زير شروع ميشود:
ASSUME CS:Code,DS:data
اين دستور به اسمبلر ميگويد در صورتيکه يک دستورالعمل از يک برچسب که در داخل سگمنت کد قرار دارد استفاده بکند آدرس واقعي عملوند مزبور بايد به وسيله حاصلجمع ثبات سگمنت CSو آفست برچسب از ابتداي سگمنت کد محاسبه شود.
سيستمعامل وظيفه مقداردهي اوليه ثبات سگمنت کد را به واسطه عملوند موجود در دستور END به عهده دارد ولي سيستمعامل همين کار را براي ثبات سگمنت داده DSانجام نميدهد. اينکار را بايد برنامهنويس انجام دهد.
شماره واقعي سگمنت داده تا زماني که برنامه بار نشده باشد قابل تعيين نيست، در آن زمان است که اين آدرس به وسيله DOSبراي برنامه تعيين ميشود.
هيچ دستورالعملي نميتواند يک عملوند بلاواسطه را در يک ثبات سگمنت قرار دهد.
ماکروي itoaيک رشته شش کاراکتري کدهاي اسکي براي عدد مکمل دو ايجاد ميکند.
در يک سگمنت، ترتيب دستورالعملها دقيقاً ترتيب کدهاي حاصله را تعيين ميکند.
عملوندهاي دستورات DBو DW
اسمبلر، اعداد را دهدهي فرض ميکند مگر در حالتي که داراي پسوندي باشند که به معناي ديگري اشاره کند يا اينکه به وسيله دستور اسمبلر RADIXپيشفرض را تغيير داده باشيم.
يک عملوند عددي براي دستور DBميتواند در محدوده دهدهي 255- تا 255 باشد. يک عدد بدون علامت صفر تا 255 ميتواند دريک بايت ذخيره شود.
در مورددستور DW، محدوده مجاز براي عملوندياز 65535- تا 65535 ميباشد. اعداد بدون علامت صفر تا 65535 در يک کلمه جاي ميگيرند.
عملگر DUPميتواند براي توليد چندين بايت يا کلمه با مقادير اوليه معين و يا بدون مقدار اوليه، مورد استفاده قرار بگيرد. کاربرد اين عملگرد به DB، DWو دستورات اسمبلر ديگري که فضا را ذخيره ميکنند محدود ميشود.
دستور DWبه برنامهنويس اجازه ميدهد که يک مقدار اوليه را که برابر آفست قسمت ديگري از حافظه است، نسبت دهد. اينکار شبيه به داشتن يک متغير اشارهگر است که مقدار آن آدرس بلوکي از حافظه ميباشد.
دستورات
Array DB 100DUP(?)
PointerDWOFFSET array
100 بايت را براي arrayو يک کلمه را براي pointerذخيره ميکنند و pointerبا آفست arrayمقداردهي اوليه ميشود.
دستور اسمبلرDD: يک کلمه مضاعف را ذخيره ميکند
DQ: هشت بايت را ذخيره ميکند.
DT: ده بايت را ذخيره ميکند.
عملوند دستورالعملها
عملوندها داراي انواع مختلف هستند: بعضي ثابت بوده، بعضي مشخصکننده ثباتهاي CPUميباشند و برخي به حافظه رجوع مينمايند.
به طور کلي عملوند اول، مقصد عمليات را تعيين ميکند و عملوند دوم منبع عمليات را.
يک عملوند حالت بلاواسطه نميتواند بعنوان مقصد قرار گيرد.
در مواردمعدودي، برنامهنويس ممکن است يک ثبات سگمنت و يک آفست واقعي را به عنوان عملوند مستقيم بنويسد، MASMدستورالعمل زير را مجاز ميشمارد:
Mov bx,dx:0014h
اين دستورالعمل، ثبات BXرا با کلمهاي که از بيستمين بايت سگمنت داده شروع ميشود، بار مينمايد. اين آدرس قابل جابجايي نيست.
يک عملوند ثبات غيرمستقيم، از داده حافظه استفاده ميکند.
فقط چهار ثبات ميتوانند براي آدرسدهي ثبات غيرمستقيم به کار بروند:
BX
BP
SI
DI
در حالت ثبات غيرمستقيم، ثبات همانند يک متغير اشارهگر در زبانهاي سطح بالا ميباشد.
وقتي اندازه عملوند حافظه مبهم باشد، عملگر PTRبايد مورد استفاده قرار گيرد تا اندازه صحيح به اسمبلر داده شود.
اسمبلر، استفاده از عملوند شمارنده موقعيت يعني $ را مجاز ميشمارد، اين عملوند در زمان اسمبل شدن مقدار آفست يک دستورالعمل را نشان ميدهد. اين عملوند ميتواند در دستورالعملها يا دستورات اسمبلر مورداستفاده قرار بگيرد
ماکروي output، محتوي هيچ ثباتي و همينطور ثبات نشانهها را تغيير نميدهد.
ماکروي inputsفقط بر روي ناحيه مقصد و ثبات CX اثر ميگذارد، هيچ ثبات ديگري از جمله ثبات نشانههاتغيير نخواهند کرد.
ماکروي inputcداراي هيچ عملوندي نميباشد. اين ماکرو يک کاراکتر را از صفحه کليد ميخواند و کد اسکي آن را در ثبات ALذخيره مينمايد.
اگر ماکروي atoiقادر باشد که به طور موفقيتآميز يک رشته کاراکتر اسکي را تبديل کند آنگاه نشانه سرريز يعني OFصفر خواهد گرديد. در تمام موارد نشانههاي PF,ZF,SFبسته به مقداري که در AXبرگردانده ميشود به ترتيب زير تغيير خواهند کرد:
اگر عدد منفي باشد SFيک خواهد شد و در غيراينصورت صفر.
اگر عدد صفر باشد ZFيک خواهد شد و در حالت غيرصفر،صفر خواهد شد.
PFنشاندهنده توازن عدد برگردانده شده در AXاست.
نمونه كد ماشين
0000000Aa dw 10
000200b db ?
.code
00008B DFmov bx,di
00028A F9mov bh,cl
00048B 1E 0000 Rmov bx,a
00088A 26 0002 Rmov ah,b
000C8B 12mov dx,[si][bp]
000EA0 0002 Rmov al,b
00118A 26 0002 Rmov ah,b
0015BB 0003mov bx,3
0018B1 03mov cl,3
001AC7 06 0000 R 0064mov a,100
0020C6 06 0002 R FF mov b,255
+ نوشته شده در دوشنبه بیستم خرداد ۱۳۸۷ ساعت 22:58 توسط میلاد
|