تا اونجایی که من اطلاع دارم بله .
یعنی چی کلی کلیک میکنید؟ این ربطی به far و near نباید داشته باشه قاعدتا یک جای کارتون میلنگه . باید دید چه بخشی از کدتون باعث این ناهماهنگی هست .
وقتی شما تابع رو فراخونی کردید و فرضا کار تابع تموم شد کنترل برنامه باید برگرده به ابتدای حلقه نه اینکه بپره بره پایین . !
کد خودتون رو با کد زیر مقایسه کنید .
کد شما:
تو خط هفتم بعد از مقایسه هاتون باید یه جامپ میزاشتید که اگر چیزی غیر از حالات فوق اتفاق افتاد ( یا بعبارت ساده تر هیچ کدوم از مقایسه های بالا معتبر نبود ) چه اتفاقی بیوفته! اگه اینجا جامپی نزارید . وقتی مقایسه ها یکی یکی چک میشدن و به انتها میرسیدن برنامه شروع میکرد کدهای بعد از مقایسه رو اجرا کردن . یعنی میومد اول تابع ماشین حساب رو فراخونی میکرد و بعد چون زیر این تابع هم شما مشخص نکرده بودید که وقتی تابع فراخونی شد و کارش تموم شد برنامه چیکار کنه! در نتیجه برنامه همینجور ادامه میده و میره سراغ فایل و اونو فراخونی میکنه و وقتی کارش تموم شد ادامه میده تا میخوره به جامپ و میاد بالا!
من تو کد زیر اومد گفتم اگر هیچ کدوم از حالات بالا نبود ( نه 13 ونه 14 ) از برنامه خارج شو ( میتونستم jmp mouse کنم و تصمیم دیگه ای بگیرم ) . و بعد بعد از هر فراخونی تابع هم وقتی کارش تموم شد jmp mouse کنم . تا کنترل برنامه تو دست من باشه و همینطور خط به خط نره جلو و برنامه کرش نکنه .
کد تصحیح شده:
CMP AL,14
JE TOOLFILE
CMP AL,13
JE TOOLCALCULATE
JMP EX
TOOLCALCULATE:
CALL CALCULATE
JMP MOUSE
TOOLFILE:
CALL FILE
JMP MOUSE
EX:
اولا وقتی یک تابع مینویسید حتما Ret رو بنویسید آخر تابع .
دوما وقتی تابع شما از نوع far هست .باید از retf استفاده کنید بجای ret
آقای حسنپور واقعا ازتون ممنونم، خیلی لطف کردین، اصلا باورم نمیشه
اون چیزی که گفتین رو انجام دادم و کار کرد ، خیلی برام جالب بود
بازم ازتون نهایت تشکر رو دارم
فقط ازتون خواهش داشتم این پست رو تا قبل از پنجشنبه این هفته نبندین تا اگه سوالی دوباره پیش اومد از خدمتتون بپرسیم
خیلی ازتون ممنونم....
بااحترام و سپاس
ویرایش توسط NIIT : 22nd August 2011 در ساعت 05:55 PM
آقای حسنپور واقعا ازتون ممنونم، خیلی لطف کردین، اصلا باورم نمیشه اون چیزی که گفتین رو انجام دادم و کار کرد ، خیلی برام جالب بود بازم ازتون نهایت تشکر رو دارم فقط ازتون خواهش داشتم این پست رو تا قبل از پنجشنبه این هفته نبندین تا اگه سوالی دوباره پیش اومد از خدمتتون بپرسیم خیلی ازتون ممنونم.... بااحترام و سپاس
آقای حسنپور از خدمتتون سوالی داشتم
اینکه در برخی از برنامه ها دیدم یک کدی قبل از stack segment ، نوشتن و اگه اون رو برداریم چندین خطا در قسمت تعاریف data segment میده و نمیدونم این کد برای چی بکار میره ، ممنون میشم درموردش توضیحی بفرمایین
286C.
بااحترام
اینکه در برخی از برنامه ها دیدم یک کدی قبل از stack segment ، نوشتن و اگه اون رو برداریم چندین خطا در قسمت تعاریف data segment میده و نمیدونم این کد برای چی بکار میره ، ممنون میشم درموردش توضیحی بفرمایین 286C. بااحترام
اینها یک سری دستورات دایرکتیو هستن که با استفاده از اونها میتونید از یک سری از دستورالعمل ها و ویژگی های خاص پردازندتون استفاده کنید .
بعنوان مثال این دایرکتیو بشما اجازه میده تا از دستورالعمل های پردازنده های سری 80286 8086 و 80186 در حالت بلادرنگ یا real modeاستفاده کنید
در این بخش میتونید اطلاعات بیشتری در مورد دایرکتیو ها پیدا کنید . directives
علاقه مندی ها (Bookmarks)