PDA

View Full Version : سوال: inc dword PTR[SI] چیست و فرقش با inc x چیه!!؟!؟



mr_stone
سه شنبه 02 اردیبهشت 1393, 12:25 عصر
[inc dword PTR[SI
یا [inc byte PTR[SI
با inc x
چه فرقی دارن!؟!؟

vahid-p
چهارشنبه 03 اردیبهشت 1393, 21:16 عصر
خب خیلی فرق میکنه. گرچه از نظر من دو دستور اول معتبر نیست. حتی دستور سومتون هم معتبر نیست اگه منظورتون از x یک متغیر باشه. ولی اگر منظورتون یکی از ریجسترها باشه درسته.
یه نکته هم بگم، تو اسمبلی نمیتونیم خیلی با صراحت بگیم معتبر یا نامعتبر. من هم که میگم منظورمه نامتعارف هست. چرا؟ چون روز به روز CPU های پیشرفته تری ساخته میشه و دستورات مختلفی رو اجرا میکنند و شاید یه روز هم CPU ساخته بشه که مثلا دستور increment به صورت غیرمستقیم از حافظه انجام بده. الانش حتی مستقیم از حافظه هم انجام نمیده، حداقل برای کامپایلر های کنونی. اما ببینید ممکنه CPU خاصی این امکان رو داشته باشه و کامپایلترون هم مخصوص اون CPU ساخته شده باشه، این متفاوته، اما من معمولش رو میگم

معمولا منعطفترین دستور دستور MOV هست که چیزهایی که شما گفتید برای MOV قابل انجام هست اما برای inc یا همون افزایش نه.
اول اینکه dword ptr[] و byte ptr[] چی هستن، یعنی برو و از حافظه آدرس فلان رو با قالب word ( دو بایت ) یا byte ( یک بایت ) برام بخون. نحوه استفاده درست از این دستورات به این صورت هست :
MOV BX,450
MOV AX,DWORD PTR[BX]
INC AX
MOV [BX],AX
به همین راحتی. یعنی شما سعی کنید همه دستورات رو به غیر از MOV و یکی دو تای دیگه با ریجسترهای AX تا DX انجام بدید، و بعد نتیجه رو با MOV جابه جا کنید. حتی برای X در صورتی که X متغیر باشه هم باید اول تو یه ریجستر بریزید، اونو افزایش بدید، بعد دوباره به حافظه انتقال بدید. چون اگر قرار باشه INC با حافظه کار کنه، پیچیدگی سخت افزاریش زیاد میشه و اول باید بره از حافظه بخونه، اونو افزایش بده ( که برای افزایش یعنی جمع با یک نیاز به ریجستر داره ) و دوباره اونو تو حافظه بنویسه! خب اینکار ها رو میشه با کد بیشتر انجام داد، پس نیازی نیست برای INC و DEC و... دوباره سخت افزار جداگونه ای برای خوندن و کار با حافظه طراحی کنند.

امیدوارم واضح بوده باشه اگه سوالی بود بپرسین
موفق باشید

Delphi Coder
دوشنبه 08 اردیبهشت 1393, 23:52 عصر
دستور اول آدرس DS:SI رو یک عدد 4 بایتی در نظر میگیره و 1 واحد به اون اضافه میکنه.
دستور دوم همون آدرس رو 1 بایت در نظر میگیره و 1 واحد به اون اضافه میکنه.
در دستور سوم بستگی داره متغیر x رو از چه نوع تعریف کرده باشید
اگر با DB تعریف شده باشه بایت در نظر میگیره
اگر با DW تعریف شده باشه 2 بایتی در نظر میگیره
اگر با DD تعریف شده باشه 4 بایتی در نظر میگیره.