بخشی از مقاله
دستورالعمل پردازش دادههاي رشتهاي
رشته عبارتاز مجموعهاي از كاراكترهاي به هم پيوسته و متوالي است. رشته ميتواند حاوي هر كاركتر قابل چاپ باشد. مقايسه رشتهها، كپيرشتهها، جستجو در رشته و انتقال آنها نمونههاي از اعمال رشتهاي هستند.
تعريف رشتهها
براي تعريف رشتهها از شبه دستورات DB يا DW استفاده ميشود. نمونه هايي از تعريف رشته در زير آمده است.
100 dup (‘*’) Db Str1
50 dup (?) Dw Str2
75 dup (?) Dw Str3
“ abcdef ” Dd Str4
جدول حالتهاي سهگانه دستورالعملهاي رشتهاي:
دستورالعمل اصلي دستورالعمل بايت دستورالعمل كد دستورالعمل كلمه مضاعف
MOVS MOVSB MOVSW MOVSD
LODS LODSB LODSW LODSD
STOS STOSB STOSW STOSD
CMPS CMPSB CMPSW CMPSD
SCAS SCASB SCASW SCASD
معرفي دستورالعملهاي رشتهاي
اين دستورالعملها عبارتنداز movs براي كپي كردن رشتهها، lods براي باركردن رشتهها، stos براي ذخيره رشتهها، cmps براي مقايسه رشتهها، scas براي جستجوي رشتهها به كار ميروند. دستورالعملهاي رشتهاي ميتوانند بر روي بايت، كلمه يا كلمه مضاعف عمل كنند، لذا هر دستورالعمل رشتهاي سه حالت دارد : بايت ،كلمه، كلمهمضاعف. براي مثال سه حالت دستورالعمل movs عبارتنداز movsb , movsw movsd در اين حالتها حرف S به معني رشته، B به معني بايت، W به معني كلمه و D به معني كلمه مضاعف است.
ويژگيهاي دستورالعملهاي رشتهاي
دستورالعملهاي رشتهاي بر روي دو رشته عمل ميكنند براي مثال رشتهاي را در رشته ديگر كپي ميكند، رشتهاي را در ثباتي ذخيره مينمايند و يا رشتهاي را از ثبات به محلي از حافظه بار ميكند. به هر حال، دستورالعملهاي رشته دو عملوند دارند ولي عملوندها جزئي از دستورات نيستند. عملوندهاي دستورالعملهاي رشتهاي، قبل از اجراي دستورات بايد مقداردهي شوند به همين دليل، اين عملوندها را عملوندهاي ضمني گويند.
دستورالعملهاي رشتهاي معمولاً بر روي دو رشته عمل ميكنند كه يكي از آنها رشته منبع و ديگري را رشته مقصد گويند. آدرس رشته منبع بايد در ثبات SI و آدرس رشته مقصد بايد در ثباتDI قرار گيرد. ثبات SI معمولاً با ثبات DS به صورت DS:SI و ثبات DI معمولاً با ثبات DS به صورت ES:DI بكار ميروند، لذا در بسياري از دستورالعملهاي رشتهاي هنگامي كه فايل EXE ايجاد ميشود ثبات ES بايد با آدرس موجود در ثبات DS مقدار دهي شوند.
;address of data segment Ax , datasg Mov
. Dx , ax Mov
. Es , ax Mov
تكرار اجراي دستورالعملهاي رشتهاي
دستورالعملهاي رشتهاي ميتوانند رشتههايي از يك بايت، يك كلمه يا يك كلمه مضاعف را پردازش كنند. اگر طول رشته بيش از يك كلمه مضاعف باشد، بايد اجراي دستورات رشتهاي براي پردازش تكرار شود. براي مثال، براي كپي كردن رشتهاي به طول10 ميتوان دستور movsb را 10 بار تكرار كرد. براي تكرار اجراي دستورات رشتهاي از پيشوند rep استفاده ميشود. تعداد دفعات تكرار بايد در ثبات cx قرار گيرد. پيشوند rep، دستور پردازش رشته را آنقدر تكرار ميكند تا ثبات cx به صفر برسد. تكرار اجراي دستورات با پيشوندهاي ديگري نيز امكانپذير است.
دستورات repz ,repnz ,repne ,repe ,rep
اين دستورات به صورت كلي repz ,repnz ,repne ,repe ,rep instruction
مورد استفاده قرار ميگيرند و باعث اجراي دستورجلوي آن تعداد مشخص ميشوند. ثبات CX تعداد تكرار اجراي دستور را مشخص ميكند و پس از اجراي هر بار اين دستورات يك واحد از ثبات CX كم ميشود.
:Rep دستور جلوي خود را تا صفر شدن ثبات CX تكرار ميكند
:Repe دستور جلوي خود را ماداميكه ثبات CX مخالف صفرباشد تكرار ميكند
: Repz دستور جلوي خود را ماداميكه ثبات ZF=0 باشد تكرار ميكند
:Repne دستور جلوي خود را ماداميكه ثبات CX=0 باشد تكرار ميكند
:Repnz دستور جلوي خود را ماداميكه ثبات ZF=0 باشد تكرار ميكند
تعيين جهت پردازش رشته
رشتهها را ميتوان از چپ به راست و يا از راست به چپ پردازش كرد. چهت پردازش رشته توسط فلگ DF مشخص ميشود. اگر اين فلگ برابر با صفر باشد، پردازش از چپ به راست است و اگر برابر يك باشد پردازش از راست به چپ است. دستور CLD مقدار صفر و دستور STD مقدار يك را در اين فلگ قرار ميدهد.
دستور CLD باعث ميشود كه بيت DF از ثبات وضعيت را صفر ميكند كه در عمليات روي رشتهها مانند movs,cmps و … مورد استفاده قرار ميگيرد. هنگام استفاده از اين دستور در هنگام انتقال رشتهاي عمل مورد نظر از چپ به راست انجام ميشود.
دستور STD باعث ميشود كه در بيت DF مقدار يك قرار گيرد. هنگام استفاده از اين دستور در عمليات رشتهاي عمل مورد نظر از راست به چپ انجام ميشود.
كپي كردن رشتهها
براي كپي كردن رشتهها از محلي از حافظه به محل ديگري در حافظه از دستور movs استفاده ميشود.
اين دستور به صورت كلي movs dest-string , source-string
movs
مورد استفاده قرار ميگيرد.
حالتهاي مختلف اين دستور به صورت زير به كار ميروند:
MOVSB
MOVSW
MOVSD
قبل از اجراي اين دستورالعملها، آدرس محلي از حافظه كه حاوي رشته است(منبع) در DI:SI و ادرس محلي از حافظه كه رشته در آنجا كپي ميشود در ES:DI قرار ميگيرد. در ابتداي يك برنامه EXE بايد ثبات ES را همراه ثبات DS مقداردهي كرد و با دستور LEA آدرس رشتهها را در ثبات SI و DI قرار داد. اگر جهت پردازش رشته از چپ به راست باشد، با هر با اجراي دستور movs يك بايت، يك كلمه، كلمه مضاعف به ثباتها SI و DI اضافه ميشود. ولي اگر جهت پردازش رشته از راست به چپ باشد، همين مقدار از اين ثباتها كسر ميگردد.
دستورالعمل LODS
اين دستور به صورت كلي LODS source
مورد استفاده قرار ميگيرد.
اين دستورالعمل با حالت LODSB يك بايت را به ثبات AL و با حالت LODSW يك كلمه را به ثبات AX و با حالت LODSD يك كلمه مضاعف را به ثبات EAX بار ميكند. آدرس حافظه منبع بايد در ثباتهاي DS:SI باشد در اين دستورات مقصد، ثباتهاي AL, AX يا EAX پس از اجراي اين دستورات بسته به فلگ جهت يك دو يا چهار واحد به ثبات SI اضافه يا از آنها كم ميشود.
در غالب موارد مي توان از دستور MOV براي اينكار استفاده كرد ولي دستور MOV كد ماشين سه بايتي و دستورالعمل LODS كد يك بايتي توليد ميكند چون اين دستورالعمل ثباتها را پر ميكند و نيازي به اجراي پيشوند REP نيست.
دستورالعملSTOS
اين دستور به صورت كلي Stos dest,string
مورد استفاده قرار ميگيرد.
اين دستورالعمل در حالت STOSB محتويات ثبات AL و در حالت STOSW محتويات ثبات AX و در حالت STOSD محتويات ثبات EAX را به ترتيب در يك بايت، يك كلمه و يك كلمه مضاعف بار مي كند. آدرس محل حافظه بايد در ثباتهاي ES:DI قرار داشته باشد. بر حسب اينكه مقدار فلگ DF چقدر باشد 1، 2، يا 4 واحد به ثبات DI اضافه و يا از آن كم ميگردد.
با استفاده از پيشوند REP در دستور STOS ميتوان محلي از حافظه را مقدار اوليه داد در اين صورت تعداد بايتها، كلمات يا كلمات مضاعف در ثبات CX قرار ميگيرد.
مقايسه رشته
براي مقايسه رشتهها از دستورالعمل CMPS استفاده ميشود.
اين دستور به صورت كلي Lable cmp operand1,operand2
مورد استفاده قرار مي گيرد.
آدرسهاي دو رشتهاي كه مقايسه ميشوند در ثباتهاي DS:SI و ES:DI قرار دارند. اين دستور شكل CMPSB يك واحد و در شكل CMPSW دو واحد و در شكل CMPSD چهار واحد به ثباتهاي SI و DI اضافه و يا از آنها كم ميكند. فلگهالي AF, CF, OF PF, SF و ZF با دستورات تاثير ميپذيرند. با استفاده از پيشوند REP و طولي كه در ثبات CX قرار ميگيرد اين دستورات ميتوانند رشتههاي با هر طول را با هم مقايسه كند. پيشوند REP شكلهاي ديگري نيز دارد كه معمولا در مقايسه رشتهها مورد استفاده قرار مي گيرند و عبارتند از :
REPE يا REPZ :
دستورالعمل مقايسه رشتهها را تا زماني اجرا ميكنند كه CX مخالف صفر بوده بايتها و كلمات مقايسه شده با هم مساوي باشند.
REPNE يا REPNZ:
دستورالعملهاي مقايسه رشتهها را تا زماني اجرا ميكند CX مخالف صفر بوده، بايتها و كلمات مقايسه شده مساوي نباشند.
مقايسه رشتهها الفبا عددي صورت ميگيرد. اين دستورالعملها براي مقايسه مقادير جبري كه حاوي علامت باشند مفيد نيستند براي مثال دو رشته “arbs” و “arbn” را در نظر بگيريد براي مقايسه اين دو رشته حرف “a” از رشته اول با حرف“a” از رشته دوم مقايسه ميشود كه با هم مساويند. سپس حرف “r” از رشته اول با حرف “r” در رشته دوم مقايسه ميشوند كه آنها نيز مساويند سپس حرف سوم رشته اول، “b” با حرف سوم رشته دوم “b” مقايسه ميشوند اين دو
حرف نيز با هم مساويند چهارمين حرف رشته اول “s” به چهارمين حرف رشته دوم “b” مقايسه ميشود كه حرف “s” در مرتبه بالاتري قرار دارد يعني اصطلاحا مي گويند s از n بزرگتر است لذا رشته “arbs” از رشته “arbn” بزرگتر تلقي ميشود.در مقايسه رشتهها كاراكترهاي دو رشته با هم مقايسه ميشوند و پس از رسيدن به اولين مورد اختلاف كاراكتري كه بزرگتر باشد، رشته حاوي آن كاراكتر بزرگتر است دستورالعمل مربوط به مقايسه يك بايتي، REPE CMPSB مي باشد.
جستجوي رشته
براي جستجو رشته از دستور SCAS استفاده ميشود.
اين دستور به صورت كلي Stos dest,string
مورد استفاده قرار ميگيرد.
اين دستور شباهت زيادي با دستور CMPS دارد و تفاوت آنها اين است كه در دستور SCAS يك بايت، كلمه يا كلمه مضاعف در يك رشته جستجو ميگردد. بايت، كلمه يا كلمه مضاعف مورد جستجو بايد در ثبات AL, AX يا EAX باشد. رشتهاي كه بايد عمل جستجو در آن صورت گيرد محلي از حافظه است كه آدرس آن در ES:DI قرار دارد با هر بار اجراي اين دستور 1 و 2 يا 4 واحد به ثبات DI اضافه يا از آن كم مي شود با اجراي اين دستور فلگهاي AF, CF, DF, PC, و ZF مقدار ميگيرند. وقتي دستورالعملهاي SCAS با پيشوندهاي REP به كار مي روند هر رشتهاي با هر طول را جستجو ميكنند.
نوشتن برنامه هاي مقيم در حافظه
يكي از دلايل اصلي عموميت يافتن زبان اسمبلي ،توانايي آن براي ساختن برنانامه هايي است كه در پشت صحنه اجرا شود ،كه به اصطلاح برنامه هاي pop_up يا مقيم در حافظه ناميده ميشود اين برنامه ها چندان رواج دارند كه نميتوان از آنها صرف نظر كر د،و نوشتنم اين برنامه ها هم مشكل نيست .
از مثالهاي متداول برنامه هاي مقيم در حافظه ميتوان به ماشين حسابي اشاره كرده كه حتي در هنگام اجراي يك برنامه ديگر ، مي توان با زدن كليدي آن را فعال كرده و استفاده نمود ، يا ساعتي كه هميشه در صفحه تصوير موجود است ، برنامه هاي كمكي كه شماره تلفن مي گيرند ، مطبي را روي كاغذ چاپ مي كنند ، اشكالات ديسك را برطرف مي نمايد و يا حتي امكان اجراي دستورات DOS را فراهم مي سازند و از اين قبيل برنامه ها.
تعريف برنامه مقيم در حافظه بسيار ساده است : اين برنامه ها حتي اگر برنامه ديگري را هم اجرا كنيد ذر حافظه باقي مي مانند عمو ماً COMMAND.COM برنامه ها را درست بعد از خود DOS در حافظه لود كرده و اجرا مي نمايد و بعد از اتمام برنامه حافظهاي را كه به آن اختصاص داده بود گرفته و آزاد مي نمايد در برنامه هاي مقيم در حافظه مرحله آخر به ترتيب فوق نيست در عوض فضاي اختصاص يافته به برنامه جزو فضاي مربوط به DOS در مي آيد و برنامه بعدي كه مي خواهيد اجرا كنيد نمي تواند از اين فضا استفاده كرده و در نتيجه بعد از آن قرار مي گيرد به اين ترتيب برنامه جزو DOS در ميآيد فقط فايلهاي COM را با توجه به ساختمان جمع و جورشان ميتوان مقيم در حافظه كرد مگر آنكه پيشبينيهاي لازم را بعمل آورده باشيد .
نوشتن برنامههاي مقيم در حافظه :
اگر كه ممكن است مشكل بظر بيآيد اما مقيم ساختن برنامهها در حافظه كاري آسان است مشكل اصلي كه بايد حل شود اين است : حتي اگر برنامهاي را به DOS ضميمه كنيد تا اين برنامه فرا خوانده نشود به خودي خود كاري انجام نميدهند فقط مقيم ساختن برنامه به معني اجرا شدن آن نيست – برنامه در حافظه باقي ميماند تا دوباره اجرا شود مثلاً تكه برنامه زير را ميتوان به سادگي با استفاده از يكي از دو وقفه DOS كه براي مقيم ساختن برنامهها طراحي شدهاند در حافظه مقيم كرد .
اين كار را به سادگي ميتوان با تنظيم چند رجيستر و استفاده از يكي از دو وقفه فوق بجاي وقفه INT 20H كه عموماً براي اتمام برنامه بكار ميرود انجام داد اگرچه با اين كار دستورات در حافظه جاي ميگيرند اما عملاً فقط بايتهاي در حافظه هستند تا CS:IP به اين دستورات اشاره نكند دليلي براي اجرا شدن وجود ندارد به همين ترتيب برنامههاي DOS و BIOS هم خودبه خود اجرا نميشوند بلكه بايد فراخواني گردند .
عملاً فقط يك راه حل براي اجراي چنين برنامههاي مقيم وجود دارد و آن راه عبارت است از وقفههاي سخت افزاري يا نرمافزاري ، وقفه هاي سخت افزاري توسط برنامه ايجاد نميشود بلكه موقعي توليد ميگردندكه وضعيت خاصي در دستگاههاي جانبي كامپيوتر بوجود آمده باشد مثلاً هنگامي كه كليدي را در صفحه كليد ميزنيد ، يك وقفه ، وقفه 9 ايجاد ميگردد ديسك درايو هم در اثر وقوع عمل خاص وقفه توليد ميكند و ساعت داخلي كامپيوتر هم به همين صورت ( عملاً وقفه ساعت هر ثانيه 2/18 بار اتفاق ميافتد ) .
وقفه سخت افزاري باعث ميشود كه كامپيوتر اجراي برنامه را موقتاً متوقف كرده – وقفه – و به وقفه رسيدگي كند وقفه هاي سخت افزاري را مي توان توسط برنامه با استفاده از دستور CLI از كار انداخت ( بجز تعدادي از وقفههاي سطح پايين ) اين فلاگ داخلي فقط براي اين كار طراحي شده است : مشخص كند كه آيا بايد به وقفه رسيدگي گردد يا از آن صرف نظر شود مثلاً اگر برنامه شما دستور CLI اجرا كند كليدهاي تايپ شده دريافت و ذخيره نخواهند شد با دستور STI ميتوان اين فلاگ را ست كرده و امكان پاسخ گويي مجدد به وقفهها را فراهم كرد .
از لحاظ تكنيكي برنامههاي مقيم در حافظه را ميتوان با فشار كليد فوري hot key كليدي كه با زدن آن مثلاً ماشين حساب يا هر برنامه ديگر مقيم در حافظه ظاهر مي گردد ، فعال نمود اين كار به دليل آن است كه برنامه هاي فوق از وقفه صفحه كليد استفاده مي كند . وفقه هاي سخت افزاري از انجهت كه با هر بار وقوع آنها مي توان برنامهاي را اجرا كرد بسيار شبيه به وقفه هاي نرم افزاري هستند . در اين صورت برنامه اجرا شده برنامه مقيم در حافظه مورد نظر ما خواهد بود . براي فعال كردن برنامه هاي مقيم در حافظه ما از وقفه هاي سخت افزاري استفاده ميكنيم نه وقفه هاي نرم افزاري .دليل اين امر ان است كه وقفه هاي نرم افزاري فقط هنگام اجراي برنامه ايجاد مي شود اما وقفه هاي سخت افزاري را مي توان در هر لحظه دل خواه با زدن يك كليد فوري ايجاد كرد .
وقفه هاي سخت افزاري و نرم افزاري از لحاظ اينكه ريز پردازنده چگونه آدرس برنامه مورد نظر را پس از وقوع وقفه پيدا مي كند مشابه هم هستند . مثلاً اگر برنامه شما يك دستور INT 10H را اجرا كند پردازنده عمل جستجوي آدرس را به همان ترتيب انجام مي دهد كه در صورت زدن يك كليد و دريافت وقفه 9 انجام خواهد داد .
وقفه چگونه كار ميكند
كار ي كه عملا در اثر بروز وقفه (سخت افزاري يا نرم افزاري ) انجام مي شود به شرح زير است :
آدرس برنامه مربوطه را از يك جدول تهيه شده براي اين منظور موسوم به جدول بردارهاي وقفه واقع در قسمت ابتداي حافظه لود مي كند اين جدول دقيقا در ابتداي حافظه قرار دارد و از آدرس 0000:0000 شروع ميشود .