فصل دهم
ساير حالتهاي آدرس دهي
دستورالعمل int و جدول بردار وقفهها
بعضي مواقع از فراخواني معمولي
روالها استفاده ميشود. ولي DOS و بسياري از سيستمعاملهاي ديگر از نوع بخصوص فراخواني روال
استفاده ميکنند؛ يک وقفه نرمافزاري که بعضي مواقع آن را يک تله يا يک استثناء ميگويند.
براي فعال کردن يک وقفه ميتوان
از دستورالعمل int
استفاده نمود.
بعلاوه، بعضي وقفههاي توسط خود
سختافزار PC
توليد ميشوند.
ساير حالتهاي آدرس دهي
حالتهای آدرس دهی به اختصار در شکل زیر آمده است
حالتهاي آدرسدهي
عملوندهاي دستورالعملها، به سه گروه عمده تقسيم ميشوند.
فصل ششم
روال ها
روالها
کلمه روال در زبان پاسکال و ساير زبانهاي برنامهنويسي سطح بالا براي بيان زير برنامهاي که تقريباً يک واحد کاملي ميباشد، بکار ميرود.
آرگومانها بايستي متناظر با پارامترهاي مجازي روال مزبور باشند. در زبان پاسکال نوع ديگري از زير برنامه به نام تابع وجود دارد. يک تابع در زبان پاسکال شبيه يک روال ميباشد بجز اينکه آن را در داخل يک عبارتي با ذکر نام و آرگومانهاي مربوطه در داخل پرانتز، فراخواني ميکنيم. يک تابع مقداري را بر ميگرداند که اين مقدار در عبارت مربوطه مورد استفاده قرار ميگيرد.
آدرس برگشت به برنامه فراخواننده زير برنامه روي پشته ذخيره ميشود ميتوان مقادير ثباتها در زمان فراخواني يک زيربرنامه را روي پشته ذخيره نموده و در زمان برگشت به برنامه فراخواننده مقادير ثباتها را با استفاده از پشته بازسازي نمود، با استفاده از پشته ميتوان آرگومانها را به يک زيربرنامه انتقال داده و يا مقاديري را از يک زيربرنامه فراخواننده انتقال داد، و حتي ميتوان فضاي لازم براي متغيرهاي محلي را روي پشته تخصيص داد.
فصل پنجم
انشعاب و حلقه
پرشهاي غير شرطي
Jmp statement_label
که در آن statemaet_label متناظر با فيلد اسم دستور اسمبلي ديگري ميباشد.
دستور JMP شبيه به goto در پاسکال يا بيسيک است.
اگر شرايط مختلفي وجود داشته باشد که تحت آن شرايط برنامه بايد خاتمه پيدا کند، ميتوان به يک دستور اجرايي که به وسيله برچسب quit: مشخص شده است و محل اختتام برنامه ميباشد، پرش نمود.
فرمهاي درون سگمنتي وقتي توليد ميشوند که مقصد در درون سگمنت جاري قرار داشته باشد، اين فرمها در بين انواع ديگر از همه رايجتر ميباشند.
پرشهاي بين سگمنتي که به عبارتي به يک سگمنت کد ديگر پرش ميکنند، به ندرت مورد نياز ميباشند.
پرشهاي غيرمستقيم مقدار جابجايي خود از دستورالعمل مقصد را، از يک ثبات يا از يک کلمه در حافظه به دست ميآورند.
پرشهاي درون سگمنتي نسبي، از انواع ديگر معمولتر بوده و بيشتر مورد استفاده قرار ميگيرند.
فصل چهارم
دستورالعمل هاي اساسي
انتقال داده ها بين مكانهاي مختلف حافظه
كارايي زمان و فضا (حافظه ) دو مفهوم اساسي اين فصل مي با شند .
دستورالعملmov در زبان اسمبلي براي كپي كردن داده ها از محلي به محل ديگر مورد استفاده قرار مي گيرد.
دستورالعمل xchg ، دستور مفيد ديگري است كه درزبان اسمبلي براي تعويض داده هاي منبع ومقصد كاربرد دارد.
نكته : مي توان اندازه ي داده ي مورد نظر را از يك كلمه به يك بايت و يا بالعكس تغيير داد.
....
فصل سوم
استفاده از اسمبلر
دستورالعملهاي زبان اسمبلي
هر دستورالعمل زبان اسمبلي در روي يک خط فايل کد منبع وارد ميشود. يک خط ميتواند حداکثر 128 کاراکتر داشته باشد.
وجود خطوط خالي مجاز است و استفاده از آنها براي جدا کردن بخش هاي مختلف کد برنامه مفيد است.
توضيحات براي مستندسازي و فهم بيشتر برنامه به کار ميروند و ميتوانند در هر جايي از برنامه وجود داشته باشند. هر توضيحي با کاراکتر ';' شروع ميشود و تا انتهاي خط ميتواند ادامه داشته باشد.
حالت های آدرس دهی
بلاواسطه
ثبات
مستقیم
دارای مبنا
دارای اندیس
دارای مبنا و اندیس
زبان اسمبلي داراي سه نوع دستور ميباشد:
دستورالعمل
دستور اسمبلر
ماکرو
دستورالعمل: به وسيله اسمبلر به کد هدف ترجمه ميگردد و اين کدها هستند که در زمان اجرا، اجرا ميگردند.
دستور اسمبلر: به اسمبلر ميگويد که عملي را انجام دهد. و اغلب هيچ اثري بر روي کد هدف ندارد.
ماکرو: نوعي دستورالعمل است که در آن تعدادي دستورالعملها، دستورات اسمبلر يا حتي ماکروهاي ديگر قرار گرفتهاند.
يک دستورالعمل ميتواند شامل عناصر زير باشد:
توضيحات عملوند(ها) نام دستورالعمل اسم
[;comment] [operand(s)] mnemonic [name]
يک کاربرد فيلم اسم آن است که ميتوان آدرس دستورالعملي را به صورت نمادي بعد از اسمبل و لينک شدن برنامه با يک برچسب نشان داد. دستورالعملهاي ديگر به راحتي ميتوانند به دستورالعمل مزبور رجوع کنند.
دستورالعملهاي داراي برچسب ميتوانند مقصد يک دستورالعمل پرش در زبان اسمبلي باشند.
ساختار حلقه در زبان اسمبلي وجود ندارد، اما ميتوان حلقهها را با استفاده از jmp و يا دستورالعملهاي ديگر پيادهسازي کرد.
برچسب نميتواند به وسيله عدد شروع شود. و اگر نقطه استفاده شود، حتماً بايد اولين کاراکتر باشد.
بغيراز اعداد و نقطه، کاراکترهاي ديگر ميتوانند در هر موقعيتي استفاده شوند.
فقط 31 کاراکتر اول اسم مورد استفاده قرار خواهد گرفت.
مقادير عددي در دستورات زبان اسمبلي، دهدهي فرض ميشوند و فقط زماني اين فرض کنار گذاشته ميشود که در برنامه منبع حالت ديگري خواسته شده باشد.
يک مقدار شانزده شانزدهي بايد با يک عدد بغير از اعداد شانزدهشانزدهي «a» تا «f»، شروع شود تا اسمبلر بتواند آنها را از يک اسم تشخيص دهد.
شکل کلی برنامه
START
STACK _ SEG SEGMENT
اندازه پشته.
STACK _ SEG ENDS
DATA _ SEG SEGMENT
متغیر ها
DATA _ SEG ENDS
EXTRA _ SEG SEGMENT
متغیرهای رشته ها
EXTRA _ SEG ENDS
CODE _ SEG SEGMENT
دستورالعمل های برنامه
CODE _ SEG ENDS
END START
يک برنامه از قسمتهاي مختلفي تشکيل شده است: هر کدام از اين قسمتها با دستورات اسمبلر SEGMENTو ENDS شروع شده و خاتمه يافتهاند:
Segment_name SEGMENT
.
.
Segment_name ENDS
دستور ENDS هيچ وقت داراي عملوند نيست؛ ولي دستور SEGMENT در بعضي کاربردها با عملوند به کار ميرود.
آخرين دستور برنامه، دستور اسمبلر زير است:
start END
دستور END به اسمبلر ميگويد که پردازش دستورات کد منبع را خاتمه دهد.
در يک برنامه منبع فقط يک دستور END وجود دارد و آن آخرين دستور است.
عملوند start مشخص کننده اولين دستور برنامه است که بايد اجرا شود. زماني که برنامه بار ميشود، سيستمعامل ثبات سگمنت کد را با سگمنتي که حاوي اين دستورالعمل است مقداردهي کرده و ثبات اشارهگر دستورالعملها، IP را با آفست اين دستورالعمل از ابتداي سگمنت مزبور شروع مينمايد.
Number1 DW ?
Number2 DW ?
هرکدام يک کلمه را در سگمنت داده ذخيره ميکنند.
علامت سؤال به اسمبلر ميگويد که هيچ مقدار اوليهاي به اين دو کلمه نسبت داده نشود.
هر کدام از دستورات 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 100 DUP(?)
Pointer DW OFFSET 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 است.
نمونه كد ماشين
0000 000A a dw 10
0002 00 b db ?
.code
0000 8B DF mov bx,di
0002 8A F9 mov bh,cl
0004 8B 1E 0000 R mov bx,a
0008 8A 26 0002 R mov ah,b
000C 8B 12 mov dx,[si][bp]
000E A0 0002 R mov al,b
0011 8A 26 0002 R mov ah,b
0015 BB 0003 mov bx,3
0018 B1 03 mov cl,3
001A C7 06 0000 R 0064 mov a,100
0020 C6 06 0002 R FF mov b,255
زبانهای ماشين و برنامه سازی سيستم
فهرست
مطالب
فصل اول : نمایش داده ها در کامپیوتر
فصل دوم : قسمت های یک سیستم کامپیوتری
فصل سوم : استفاده از اسمبلر
فصل چهارم : دستورالعملهای اساسی
فصل پنجم : انشعاب و حلقه
فصل ششم : روال ها
فصل هفتم : عملیات رشته ها
فصل هشتم : سایر حالت های آدرس دهی
فصل نهم : دستکاری بیت ها
فصل دهم : وقفه و ورودی / خروجی
فصل یازدهم : پردازش اسمبلی
فصل دوازدهم : ماکرو ها و اسمبلی شرطی
فصل سیزدهم : مثال نمونه
نمايش داده ها در كامپيوتر
اعداد دودویی و شانزده شانزدهی
کد های کارکتری
نمایش مکمل 2 برای اعداد صحیح علامت دار
جمع و تفريق اعداد مكمل 2
سيستم هاي
ديگر براي نمايش اعداد
چگونگي
نمايش دادهها در زبان اسمبلي:
اعداد دودويي و شانزدهشانزدهي
کدهاي کاراکتري
نمايش مکمل 2 براي اعداد صحيح علامتدار
سيستمهاي ديگر براي نمايش اعداد (مکمل يک-BCD-مميز شناور)