دستورالعمل پردازش دادههای رشتهای
رشته عبارتاز مجموعهای از کاراکترهای به هم پیوسته و متوالی است.
رشته میتواند حاوی هر کارکتر قابل چاپ باشد.
مقایسه رشتهها، کپیرشتهها، جستجو در رشته و انتقال آنها نمونههای از اعمال رشتهای هستند.
معرفی دستورالعملهای رشتهای
این دستورالعملها عبارتنداز 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 مقدار دهی شوند.
تکرار اجرای دستورالعملهای رشتهای
دستورالعملهای رشتهای میتوانند رشتههایی از یک بایت، یک کلمه یا یک کلمه مضاعف را پردازش کنند.
اگر طول رشته بیش از یک کلمه مضاعف باشد، باید اجرای دستورات رشتهای برای پردازش تکرار شود.
برای مثال، برای کپی کردن رشتهای به طول10 میتوان دستور movsb را 10 بار تکرار کرد.
برای تکرار اجرای دستورات رشتهای از پیشوند rep استفاده میشود.
تعداد دفعات تکرار باید در ثبات cx قرار گیرد.
پیشوند rep، دستور پردازش رشته را آنقدر تکرار میکند تا ثبات cx به صفر برسد.
تکرار اجرای دستورات با پیشوندهای دیگری نیز امکانپذیر است.
دستورات repz ,repnz ,repne ,repe ,rep
این دستورات به صورت کلی repz ,repnz ,repne ,repe ,rep instruction
مورد استفاده قرار میگیرند و باعث اجرای دستورجلوی آن تعداد مشخص میشوند.
ثبات CX تعداد تکرار اجرای دستور را مشخص میکند و پس از اجرای هر بار این دستورات یک واحد از ثبات CX کم میشود.
مورد استفاده قرار میگیرند و باعث اجرای دستورجلوی آن تعداد مشخص میشوند.
ثبات CX تعداد تکرار اجرای دستور را مشخص میکند و پس از اجرای هر بار این دستورات یک واحد از ثبات CX کم میشود.
تعیین جهت پردازش رشته رشتهها را میتوان از چپ به راست و یا از راست به چپ پردازش کرد.
چهت پردازش رشته توسط فلگ DF مشخص میشود.
اگر این فلگ برابر با صفر باشد، پردازش از چپ به راست است و اگر برابر یک باشد پردازش از راست به چپ است.
دستور CLD مقدار صفر و دستور STD مقدار یک را در این فلگ قرار میدهد.
دستور CLD باعث میشود که بیت DF از ثبات وضعیت را صفر میکند که در عملیات روی رشتهها مانند movs,cmps و … مورد استفاده قرار میگیرد.
هنگام استفاده از این دستور در هنگام انتقال رشتهای عمل مورد نظر از چپ به راست انجام میشود.
دستور STD باعث میشود که در بیت DF مقدار یک قرار گیرد.
هنگام استفاده از این دستور در عملیات رشتهای عمل مورد نظر از راست به چپ انجام میشود.
کپی کردن رشتهها برای کپی کردن رشتهها از محلی از حافظه به محل دیگری در حافظه از دستور movs استفاده میشود.
مورد استفاده قرار میگیرد.
حالتهای مختلف این دستور به صورت زیر به کار میروند: MOVSB MOVSW MOVSD قبل از اجرای این دستورالعملها، آدرس محلی از حافظه که حاوی رشته است(منبع) در DI:SI و ادرس محلی از حافظه که رشته در آنجا کپی میشود در ES:DI قرار میگیرد.
در ابتدای یک برنامه EXE باید ثبات ES را همراه ثبات DS مقداردهی کرد و با دستور LEA آدرس رشتهها را در ثبات SI و DI قرار داد.
اگر جهت پردازش رشته از چپ به راست باشد، با هر با اجرای دستور movs یک بایت، یک کلمه، کلمه مضاعف به ثباتها SI و DI اضافه میشود.
ولی اگر جهت پردازش رشته از راست به چپ باشد، همین مقدار از این ثباتها کسر میگردد.
دستورالعمل LODS مورد استفاده قرار میگیرد.
این دستورالعمل با حالت LODSB یک بایت را به ثبات AL و با حالت LODSW یک کلمه را به ثبات AX و با حالت LODSD یک کلمه مضاعف را به ثبات EAX بار میکند.
آدرس حافظه منبع باید در ثباتهای DS:SI باشد در این دستورات مقصد، ثباتهای AL, AX یا EAX پس از اجرای این دستورات بسته به فلگ جهت یک دو یا چهار واحد به ثبات SI اضافه یا از آنها کم میشود.
در غالب موارد می توان از دستور MOV برای اینکار استفاده کرد ولی دستور MOV کد ماشین سه بایتی و دستورالعمل LODS کد یک بایتی تولید میکند چون این دستورالعمل ثباتها را پر میکند و نیازی به اجرای پیشوند REP نیست.
دستورالعملSTOS مورد استفاده قرار میگیرد.
این دستورالعمل در حالت STOSB محتویات ثبات AL و در حالت STOSW محتویات ثبات AX و در حالت STOSD محتویات ثبات EAX را به ترتیب در یک بایت، یک کلمه و یک کلمه مضاعف بار می کند.
آدرس محل حافظه باید در ثباتهای ES:DI قرار داشته باشد.
بر حسب اینکه مقدار فلگ DF چقدر باشد 1، 2، یا 4 واحد به ثبات DI اضافه و یا از آن کم میگردد.
با استفاده از پیشوند REP در دستور STOS میتوان محلی از حافظه را مقدار اولیه داد در این صورت تعداد بایتها، کلمات یا کلمات مضاعف در ثبات CX قرار میگیرد.
مقایسه رشته برای مقایسه رشتهها از دستورالعمل CMPS استفاده میشود.
مورد استفاده قرار می گیرد.
آدرسهای دو رشتهای که مقایسه میشوند در ثباتهای 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 استفاده میشود.
این دستور شباهت زیادی با دستور 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 شروع میشود .
برای هر وقفه دو کلمه اختصاص یافته است :آدرس سگمنت و آدرس آفست برنامه ای که باید بعد از وقوع وقفه اجرا شود .
برای پیدا کردن روتین وقفه پردازنده از جدول بردارهای وقفه استفاده می کند به این ترتیب که شماره وقفه را در 4 ضرب می کند (عملا آن را دو بار به سمت چپ شیفت می دهد) و آدرسی به دست می آیدکه بردار وقفه (یعنی آدریس کاملی که روتین وقفه در آنجا قرار دارد ) در آنجا ذخیره شده است هر بردار وقفه چهار بایت جا می گیرد.
سپس پردازنده سه کلمه را برای استفاده بعدی به پشته انتقال می دهد : مقادیر فعلی تمام فلاگها (این فلاگها به صورت بیتهای مجزای رجیستر 16 بیتی فلاگ هستند.) محتوای فعلی IP و با لا خره محتوای فعلی CS .
بعد از آن روتین وقفه را اجرا میکند بعد از اتمام وقفه پردازنده میتواند مقادیر زخیره شده را از پشته برداشته و برنامه را از همان جایی که وقفه رخ داده بود دنببال کند (حتی با همان مقادیر قبلی فلاگها ) .این روش هم برای وقفه های سخت افزاری انجام می شود و هم برای وقفه های نرم افزاری.
اگر پروسه هایی برای وقفه بنویسید باید آن را با دستور IRET تمام کند و دستور RET دستور IRET باعث میشود که سه کلمهمورد بحث از پشته برداشته شود به این ترتیب برنامه اصلی بدون اشکال ادامه می یابد.
مثلا فرض کنید برای فعال کردن یک برنا مه یاد داشت ،کلیدی را فشار میدهیم.
در این صورت یک وقفه imt9 تولید میشود و باید تکه برنامه ای به برنامه اصلی اضافه کنیم تا تمام وقفه های int9را به منظور تشخیس کلید فوری مورد نظر،مورد برسی قرار دهد .
اگر کلیدرده شده،کلید فوری مورد نظر نباشد یک وقفه int9 مختوم به iret اجراءمیشود اگر کلید فوری زده شده باشد بر نامه یاد داشت فعال میشود .
خود این برنامه هم میتواند بخشی داشته باشد که کلیدهای رده شده را دریافت کند ،باز هم باید با دستور iret تمام شود .
منحرف کردن بردار وقفه : یک برنامه حساب شده خودش را در حافظه قرار داده و بردار وقفه مشخصی را چنان عوض میکند که با وقوع وقفه مربوطه پردازنده به جای روتین وقفه ،خود برنامه را اجراکند.به این ترتیب است که برنامه های مقیم در حافظه اجرا میگردند .
معمولاًبرنامهای که جای روتین وقفه قرار میگیرد ، تمام اعمال ان را انجام نمی دهد بلکه در صورت لزوم کارهائی را که نمی خواهد انجام بدهد به روتین قبلی وقفه ارجاع می نماید .
به همین دلیل آدرس CS و IP روتین وقفه در ناحیه داده های برنامه ذخیره می شود .
اینها کارهائی بود که در این قسمت باید انجام می شد .
هنگامی که وقفه رخ دهد ، کنترل به برنامه ما انتقال می یابد نه به روتین اصلی وقفه .
برنامه PROG ما که توسط COMMAND .
COM به ابتدای فضای خالی و قابل استفاده حافظه لود شده است .
هنگامی که برنامه به صورت مقیم در میاید ، در جای خود باقی می ماند و آدرسی که برنامه ها را می توان از آنجا به بعد لودکرد به برنامه PROG منتقل می گردد حال به جائی رسیدیم که باید ببینیم چگونه می توانیم مقدار بردار وقفه مورد نظر را با آدرس CSو IP برنامه خود عوض کرد بردارهای وقفه در ابتدای حافظه قرار دارند .
چگونه می توان به آنها دسترسی یافت ؟
سویسهای دریافت و تنظیم مقدار بردار وقفه از وقفه INT21H : وقفه 21H از DOS دارای سرویسی است .
سرویس 35H ، که می توند مقدار های فعلی یک بردار وقفه را مشخص کند .
و یک سرویس دیگر هم موجود است ، سرویس 25H ، که قادر به تعویض این بردار با هر مقدار جدید است .
از آنجائی که ما عموما از روتین اصلی وقفه به منظور خاصی استفاده خواهیم کرد لازم است که قبل از تنظیم بردار وقفه به نقطه مورد نظر ، مقدار قبلی آن را در جای مناسبی ذخیره کنیم .
این کار را میتوان با ذخیره کردن بردار قبلی وقفه در ناحیه داده های برنامه انجام دارد .
در این ناحیه ما باید دو کلمه که مثلاً با برچسب OLD-INTERRUPT شروع میشود .
کنار بگذاریم حال میتوانیم مقدار قبلی بردار وقفه را در این دوکلمه ذخیره کنیم .
برای به دست آوردن مقدار بردار وقفه از سرویس 35H و وقفه INT21H ، سرویس دریافت بردار ، استفاده می کنیم .
به دست آوردن بردار وقفه قبلی : برای به دست آوردن بردار وقفه قبلی ، سرویس 35H را به کار می بریم .
فرض کنید که می خواهیم وقفه 9 مربوط به صفحه کلید را عوض کنیم .
برای این کار یک کار ثابت مثلاً INTRRUPT را برابر 9 قرار داده و بردار وقفه را به دست می آوریم .
سرویس 35H بردار وقفه را از طریق ES:BX بر می گردانیم و ما می خواهیم که این بردار را در دو کلمه ای که قبلاً در ناحیه داده های برنامه کنار گذاشته ایم ذخیره نمایم بعداً با این دو کلمه ، به صورت یک عدد دو کلمه ای برخورد خواهیم کرد .
حتماً به یاد دارید که پردازنده 80در86 برای ذخیره مقدار بزرگتر از یک بایت در حافظه ، از روش نسبتاً عجیبی استفاده می کنند .
تنظیم مجدد بردار وقفه : حال نوبت ان رسیده که به جدول بردارهای وقفه بپردازیم .
می خواهیم برداروقفه را به آدرس مورد نظر خود تنظیم کنیم .
یعنی اینکه با آدراس IP و CX برنامه را به بردار وقفه لود نماییم برای این کار از سرویس 25H وقفه INT21H سرویس تنظیم بردار وقفه کمک می گیریم لازم است که آدرس جدید آدرس برنامه خودمان را از طریق DS:DX در اختیار سرویس 25H قرار دهیم چون در فایل COM محتوای DS عوض نمی شود آن را به حال خود می گزاریم ، اما باید ادرس افست برنامه را PROG می نامیم – را به دست بیاوریم ودر DX قرار دهیم .
این کار را نمی توان با دستور LEA انجام داد در این مرحله محتوای بردار وقفه مورد نظر را چنان عوض شده است که به برنامه ما اشاره می کند هر بار که وقفه اجرا شود ما کنترل را به دست خواهیم گرفت .
مقیم ساختن برنامه در حافظه : حال برنامه ما می تواند بردار وقفه را چنان تغییر دهدکه در صورت بروز وقفه به جای روتین اصلی وقفه برنامه ما اجرا شود .
اما چگونه می توان اطمینان یافت که برنامه در حافظه باقی می ماند ،دو روش برای این کار وجود دارد استفادا از وقفه IMT27 یا سرویس 31H از وقفه INT21H سیستم عامل DOS .
برای استفاده از INT27 آخرین آدرسی را که می خواهید در حافظه بماند در DS:DH قرار داده و قفه INT27H را اجرا کنیید .
سرویس 31H از INT21H می تواند یک کد برگشت ایجاد کند که می توان از ان در دستور ERRORLEVEL فایلهای دسته ای یا سرویس 4DH وقفه INT21H استفاده کرد .
روشی که ما از وقفه INT27H استفاده می کنیم به صورت زیر است .
مثل اغلب برنامه هیی که خود را در حافظه جای می دهند ما هم یک قسمت کوچک برای مقدار دهی اولیه در انتهای برنامه ایجادمیکنیم .
این قسمت فقط برای مقیم کردن برنامه در حافظه بود ه و پس از انجام این کار به دور انداخته خواهد شد .
به همین جهت اغلب این قسمت را بخش انتقالی برنامه می نامند برنامه ما PROG نام دارد بگذارید قسمت انتقالی را هم LOD PROG بنامیم در فایل ASM وظیفه برنامه ما IK’HL H[VHD H,G FVKHLI COM آن است که بردار وقفه را چنان تغیر دهد که به prog اشاره کند .
ما نمی خواهیم که هنگام اجرای فایل com برنامه prog اجرا گردد .
پس بار اول lod prog اجرا می گردد .
بعد از تنظیم مجدد بردار وقفه به ادرس prog برنامه lod prog توسط ds:dx به آدرس ابتدای خود اشاره کرده و وقفه int 27h اجرا می کنند .
به این ترتیب وقفه int27h برنامه را تا جای که lodprog شروع می شود در حافظه مقیم می سازد هنگامی که برنامه بعدی لود شود بعد از انتهای prog قرار گرفته و عملاً روی lod prog نوشته خواهد شد نوشتن بر نامه ای که می تواند به وقفه ها پاسخ میگوید : نوشتن قسمت انتقالی برنلمه را تمام کردیم حال به قسمت نسبتاً آشنای کار یعنی خود برنامه جایی که بای کار مورد نظر را در اثر بروز وقفه انجام دهیم رسیدهام بگذارید به جزئیات این قسمت هم بپردازیم ، بعد از این که برنامه توسط قسمت انتقالی آن در حافظه قرار گرفت به صورت یک برنامه در می آید این تغیرات عبارت اند از در برنامه مقیم در حافظه عموماً روتین اصلی وقفه هم فرا خوانده میشود تا بعضی از کارها را انجام دهد دلیل ذخیره کردن و برگرداندن محتوای ریجیسترها بسیار واضح است فرض کنید که کلید برنامه ماشین حساب مقیم د رحافظه را فشار داده اید بعد از اتمام کار و ترک ماشین حساب برنامه قبلی از همان جایی که متوقف شده بود اجرا می شود .
فراخوانی روتین قبلی وقفه : عموماً روتین قبلی هم برای انجام کارهای مورد نیاز است ،همان طوری که قبلاً اشاره شد وقفه صفحه کلید از طریق پرت 60h واقع در a/o می خواند اطلاعات مربوط به چگونگی این کار عملاًبرای ما فایده ای ندارد .
وقفه صفحه کلید برای تبدیل کلید زده شده به کد اسکی کارهای زیادی انجام می دهد و این کارهای است که ما نمی خواهیم مجدد انجام دهید .
کمک پردازنده ( هم پردازنده ) : پردازندهای که جدای از ریزپردازنده اصلی عملیاتی را انجام داده و به آن کمک میکند متداولترین نوع کمک پردازنده نماد علمی یا ریاضی است که برای انجام محاسبات عددی با سرعت و کیفیت بیشتر از ریزپردازنده موجود در کامپیوترهای شخصی مورد استفاده قرار میگیرد .
نماد ممیز شناور ( نماد علمی ) : یک قالب عددی است که برای نشان دادن اعداد خیلی بزرگ و خیلی کوچک مورد استفاده قرار میگیرد اعداد با نماید علمی در دو قسمت ذخیره میشوند : مانتیس و نماد .
مانتیس رقمهای عدد و نماد محل ممیز را مشخص میکند به عنوان مثال اعداد 0.000067 و 246000000 در روش نماد علمی بترتیب با اعداد 6 - e67 و 6e246 نشان داده میشوند بیشتر ریز پردازندهها مستقیماً نمیتوانند از عددهای با نماد علمی استفاده کنند و بنابراین محاسبات اعداد با نماد علمی به وسیله نرم افزار یا پرداشگر نماد علمی صورت میگیرد .
پردازشگر نماد علمی ( پردازشگر ممیز شناور ) یک کمک پردازنده عددی یا همان کمک پردازندهای است که در کنار ریز پردازنده اصلی سیستم محاسبات اعداد با نماد علمی را انجام میدهد افزودن این پردازنده باعث افزایش قابل توجه سرعت عملیات محاسباتی و گرافیکی میشود به استثنای ریز پردازندههای i486dx و پنتیوم اینتل و 68040 موکرولا در کنار ریز پردازندههای خانواده 80x86 اینتل و 680x0 موتورلا میتوان از پردازنده نماد علمی استفاده نمود .
در این مبحث کمک پردازنده 8087 مورد بررسی قرار میگیرد .
مشخصات کلی کمک پردازنده 8087 : بدنبال ساخت 8086 در سال 1978 که ریزپردازنده نسل بعدی 8088 بوده و به علت عدم وجود عدم وجود بعضی دستور العملهای ریاضی در سری دستور العملهای 8088/8086 و 80188/80186 شرکت اینتل یک کمک پردازنده محاسباتی برای این ریزپردازنده ها طراحی کرد این کمک پردازنده که به نام کمک پردازنده 8087 معروف است در سرعتهای 5 و 8 و 10 مگا هرتز موجود بوده و در صورت پشتیبانی نرم افزار با ارائه دستورالعملهای ریاضی، مثلثاتی، لگاریتمی جهت استفاده برنامه می تواند باعث افزایش چشمگیر عملکرد سیستم گردد.
بدین ترتیب عملیات مذکور توسط 8087 انجام شده و ریز پردازنده اصلی به امور دیگر می پردازد.
8087 توانایی کار با اعداد صحیح 16 ، 32 ، 64 بیتی، اعداد با نماد علمی 42 ، 64 و 80 بیتی و عملوندهای BCD 18 بیتی را داشته و همچنین با استاندارد 754 IEEE محاسبات با نماد علمی دودوئی مطابقت دارد.
طراحی پردازنده کمکی 8087 : پردازنده کمکی ریاضی یک مدار مجتمعی است که برای گسترش مجموعه دستور العملهای یک واحد پردازنده اصلی بکار میرود بطوری که سیستم کامپیوتری با دو پردازنده میتواند علاوه بر دستورالعملهای معمولی دستورالعملهای با ممیز شناور را نیز انجام دهد .
پردازنده کمکی ریاضی 8087 مشخصاً برای کار با پردازنده های 8088 و 8086 طراحی شده است.
این پردازنده دارای ثباتهای داخلی مخصوص بخود بوده که کاملاً از ثباتهای معمولی 8088 جدا می شود.
این پردازنده دستور العملهای مربوط به انجام محاسبات با اعداد اعشاری از جمله دستور العملهای معمولی مانند جمع، ضرب و عملیات پیچیده تر مانند محاسبه بعضی توابع غیر جبری را اجرا می کند.
این پردازنده نه تنها می تواند داده های با ممیز شناور را به حافظه و بالعکس انتقال دهد، بلکه می تواند داده های صحیح یا BCD را به پردازندذه کمکی ریاضی و بالعکس انتقال دهد.
اگر داده های غیر اعشاری به پردازنده کمکی 8087 انتقال یابند، همیشه به صورت اعشاری تبدیل می شوند؛ یک عدد در قالب داخلی اعداد با ممیز شناور می تواند در حین انتقال به حافظه به قالب عدد صحیح یا BCD تبدیل می شود.
پردازنده کمکی 8087 دارای هشت ثبات داده است که هر کدام بطول 80 بیت میباشد .
برای اعداد ذخیره شده در این ثباتها ، از قالب ده بایتی IEEE برای اعداد با ممیز شناور استفاده میشود .
این ثباتها اساساً به صورت یک پشته ساخته شدهاند بعنوان مثال ، زمانی که از دستورالعمل fld (load floating ) برای انتقال مقداری در حافظه به پردازنده 8087 استفاده میشود ، مقدار مورد نظر به داخل ثبات واقع در بالای پشته بار شده و دادههای واقع در بالای پشته و سایر ثباتها به اندازه یک ثبات بطرف پائین انتقال داده میشود .
با وجود این ، بعضی دستورالعملهای 8087 میتوانند هرکدام از 8 ثبات آنرا دستیابی کنند که در نتیجه ساختمان ثباتها بصورت یک پشته محض نمیباشد .
اسامی هشت ثبات داده پردازنده 8087 عبارتند از : ST ، بالای پشته که همچنین ST(0) نامیده میشود ، ST(1) ، که بلافاصله در زیر بالای پشته قرار دارد ST(2) ، ثباتی که بلافاصله در زیر ثبات ST(1) قرار دارد ST(3) ، ST(4) ، ST(5) ، ST(6) ST(7) ثباتی که در ته پشه قرار دارد .
علاوه بر 8 ثبات داده پردازنده 8087 دارای 8 ثبات کنترلی 16 بیتی است .
این ثباتها را که کلمه کنترل ، کلمه وضعیت ، کلمه نشان ، اشارهگر دستورالعمل (دو ثبات ) ، اشارهگر عملوند ( همچنین دو ثبات ) مینامند .
اسامی دستورالعملهای پردازنده 8087 با حرف F شروع میشوند که حرف اول هیچکدام از دستورالعملهای 8088 برابر F نمیباشد در اغلب دستورالعملهای 8087 ، یکی از عملوندها برابرST یعنی بالای پشته بوده و عملوند دیگر در داخل ثبات دیگر 8087 یا در حافظه قرار دارد هیچ کدام از دستورالعملهای 8087 نمیتواند ثباتهای 8088 را دستیابی کند – برای انتقال دادن هرگونه دادهای بین 8088 و 8087 بایستی داده مورد نظر توسط یک پردازنده در حافظه ذخیره شده و سپس توسط پردازندهای دیگر دستیابی گردد .
دستورالعملهای بار کردن دادهها در 8087 : این دستورالعملها عملوندها را بر روی پشته مینشانند که جدول زیر نشان دهنده این دستورالعملها و عمل آنها است .
دستورالعملهای ذخیرهسازی در دادهها در 8087 : این دستورالعملها برای کپی کردن داده از بالای پشته بر حافظه یا بداخل ثباتهای دیگر 8087 بکار میرود که جدول زیر نشان دهنده آنهاست .
دستورالعملهای جمع در 8087 : با این دستورالعملها میتوان محتوای محتوای 62 را به یک ثبات دیگر اضافه کرده محتوای هر ثباتی را به st اضافه کرده و یک عدد حقیقی با یک عدد صحیح از حافظه را به محتوای st اضافه نمود .
با این دستورالعمل نمیتوان از یک عدد BCD استفاده کرد .
دستور العملهای مقایسه در 8087 : در پردازنده 8087 دستورالعملهائی برای مقایسه بالای پشته ST با یک عملوند دیگر وجود دارد .
پردازنده 8087 دارای هفت ثبات کنترلی 16 بیتی میباشد .
دستورالعملهای مقایسه مقادیری را به بیتهای 11 ، 10 ، 8 در ثبات کنترلی بنام کلمه وضعیت تخصیص میدهند ، این بیتهای کد شرطی را بترتیب C3 و C2 و CO مینامند .
این نشانهها بصورت زیر تعیین میشوند .
حالت دیگر زمانی است که عملوندها قابل مقایسه نباشند .
این حالت میتواند زمانی اتفاق بیفتد که یکی از عملوندها نمایش IEEE برای بینهایت بوده و یا عدد نباشد .
در این حالت هر سه بیت برابر 1 قرار داده میشوند ، اگر از یک مقایسه برای تعیین جریان اجرای برنامه استفاده شود تغییر دادن نشانهها در کلمه وضعیت 8087 کمکی نمیکند .
پرسشهای شرطی براساس بیتهای ثبات نشانههای 8088 صورت گرفته و براساس کلمه وضعیت 8087 صورت نمیگیرند .
در نتیجه کلمه وضعیت قبل از اینکه بیتهای آن بتواند توسط دستورالعملهای 8088 مورد آزمایش قرار گیرند بایستی احتمالاً با دستورالعمل fstsw در پردازنده 8087 کلمه وضعیت را در داخل کلمهای در حافظه ذخیره میکند .
بعنوان مثال ، اگر سگمنت دادهها شامل دستور زیر باشد status_word DW ?
در این صورت یک برنامه میتواند از دستورالعمل زیر استفاده کند .