pejman نوشته شده:من فقط منزورم تعكيد بر مفهوم مقيم در حافظه بود
athlon64x2,
خيلي ممنون از توزيحاتتون
ببخشيد ولي يك سوال ذهنم رو مشغول كرده ميخواستم بدونم چطور وچرا اين قدر دنبال اسمبلي رفين و از كجا اينارو ياد گرفتين؟
خواهش ميکنم دوست عزيز
اميدوارم در مورد مفهوم مقيم شدن در حافظه توضيح کافي بوده باشه . الان کمي بيشتر توضيح ميدم.
ببينيد وقتي برنامه عادي داس تموم ميشه کل حافظه اي که alloc کرده بود آزاد ميشه و در واقع جزو حافظه آزاد ميشه . پس براي اينکه برنامه اي مقيم شه 2 مسئله مهم داريم که بايد حل بشه
1. برنامه از حافظه پاک نشه در واقع داس به محدوده حافظه اون به شکل حافظه غير قابل استفاده نگاه کنه . تمام درايور هاي sys که خودشون در واقع exe هستند و ... هم همينجوري عمل ميکنند و قبل از خروج مقداري حافظه رو نگه ميدارند که توضيح ميدم حالا
2. روشي براي اجراي همزمان کد پيدا کنيم . آسونترين و مرسوم ترين راه ها يکي استفاده از تايمره که هر ثانيه 18 بار تيک ميکنه (بين برنامه نويس ها به تيکر معروفه تا تايمر چون تايم رو نگه نميداره) و يا استفاده از وقفه کيبرد تا با زدن همزمان چند کليد که اصلاحا hotkey ميگيم فعال شه. در اين حالت هم برنامه فعاله عملا و هر کليدي که ميزنيد رو چک ميکنه و اگر ترکيب مناسب رو بزنيد کار خاصي ميکنه مثلا يک کپي از صفحه بفرستيم پرينتر يا هر کار ديگه.
براي مشکل اول راه حل در خود داس و حتي بيوس هست . سرويس 31 از وقفه داس و وقفه 27 هردو ميتونن اينکارو کنن که وقفه 27 قديمي تره فرقشون اينم که در سرويس 31 سايز حافظه اي که ميخوايد نگه داريد رو به پاراف ميدين و ميشه کد برگشت هم برگردوند اما در 27 فقط آدرس جايي که از از اون به بعد بايد آزاد شه . معمولا براي برنامه کوچيک مثل بالا همين 27 جواب ميده اما اگر بخواين قشنگتر بشه بايد تو لودر يک بخش حافظه به سايز کافي alloc کنيد کد جديد وقفه رو توش کپي کنيد البته psp براي stack فراموش نشه و اونوقت با سرويس 31 فقط همين بلوک رو حفظ کنيد که اصلا جاش ربطي به برنامه اصلي نداره بعدم کل برنامه اول از حافظه پاک ميشه و اينجوري مقداري در مصرف حافظه صرفه جويي ميشه . وقفه 27 نه فقط دم برنامه اول يعني همون لودر رو ميچينه.
اين کل قضيه مقيم شدن در حافظه از بعد چگونگي حفظ حافظه است و روشهاي ديگه هم اساسا همين هستن فقط براي سيو حافظه ارزشمند داس ميشه کارهايي مثل کمپرس کردن و بردن بدنه برنامه تو ems يا xms و لود کردنش زمان لازم واسه برنامه هاي بزرگ و ... رو هم اضافه کرد که البته اساس گفتم يکيه .
اما چرا دنبال اسمبلي رفتم . جواب سادست چون واقعا زيباترين زبان برنامه نويسيه . من متاسفانه اين تاپيک رو نديده بودم با ديدنش شديدا دچار حس نوستالژي شدم
دوستاني که همسن من هستن خوب يادشونه با چطوري کد Z80 واسه اسپکتروم مينوشتيم با اون استراکچر عجيب الخلقه کاراکتري حافظه گرافيکيش بعدش صاحب يه کومودر 64 شدم که بيسيکش حتي 30 دستور هم نداشت و حتي نميشد وارد مود گرافيکش شد چه برسه يه پيکسل رو روشن کرد! و تقريبا هرکاري به اسمبلي ختم ميشد با 6510 يک مگاهرتزي (در واقع 920 کيلوهرتز!) که ضرب و تقسيم هم نداشت و چيپ vic گرافيکش که واقعا شاهکار طراحي بود . با اين سرعت هر يک تيک سي پي يو هم ارزش داشت و البته من اون موقع محصل بودم کار حرفه اي نميکرديم مثلا من عاشق استفاده از حاشيه صفحه بودم بهش ميگفتم bordelss بعدا فهميدم اسمش بوده overscan بوده. اون موقع کلا 2 تا منوال و يک جزو بود که فتوکپي دست صدمش بيرنگ دست به دست ميچرخيد. حتي اسمبلرش هم پيدا نميشد . کد رو مينوشتيم بعد خط به خط دستورا رو با مقادير و آدرس ها تبديل با ماشين کد ميکرديم اونم دسيمال! برنامه ميشد يه لوپ که از يه بلوک هيولاي read , data عددا رو ميخوند تو حافظه poke ميکرد بعدم sys به اولش . دو سه سال بعد تازه کپي کارتريج اسمبلر رو ساختن . اين کارتريج جديده مونيتور کامل واسه ديباگ داشت که يعني فراتر از آرزو و خيال چون تا قبلش ديباگ وسط اون هزارها عدد دسيمال بايد انجام ميشد اونم با کارتريج هاي فريز بازي مثل اکشن و ...
چند سال بعد آميگا اومد با سي پي يو 16/32 بيتي 68k موتورول با 16 تا رجيستر ديتا و آدرس 32 بيتي و امکان ضرب و تقسيم و 7 مگاهرتز و .... شاهکار بود و تازه 3 تا کوپروسسور هم داشت که کاملا موازي بودن من البته فقط با گرافيکش کار کردم . اسمبلي آميگا دنيايي بود ميشد هم مستقيم به کوپروسسورها برنامه داد و هم ميشد از سيستم عاملش استفاده کرد که تصور کنيد کتابخونه در دست شما در حد api ويندوز باشه و حتي بسيار کاملتر در زمينه گرافيک و همه اش تو اسمبلي قابل دسترس کاري که تو ويندوز براي نوشتن برنامه اسمبلي بايد با os کشتي گرفت. آميگا واقعا حيرت انگيز بود از همه بهتر آرشيو برنامش تو ايران کامل بود چون ديسکتي بود همه چيز و کپي اسون البته همون سالي بود که C معرفي شد روي آميگا و من ديگه به سمت سي کشيده شدم چون تمام amigaos رو با سي نوشته بودن و صدا زدن روتينهاش از سي بسيار راحت تر بود .
بعدم روي پي سي ادامه دادم اون موقع در ازمنه داس 3 يه دستور debug پيزوري بود باهاش کدهاي کوچک تست ميکرديم بازم يادش به خير تا بعده ها با توربو اسمبلر آشنا شدم اونم با واسطه توربو سي البته ماکرو اسمبلر و توربو اسمبلر نميشه بهشون اسمبلر گفت واقعا امکاناتشون با اين همه امکان تعريف پروسه و ماکرو و ... مثل يه زبون سطح بالا ميمونن.
ياد دوران جووني به خير واقعا جمله جناب مهدي طلاست برنامه نويسي پايه اي يعني درک آنچه در سطح اسمبلي روي سي پي يو اتفاق ميفته. بعد از همه اين سالها و زبونهاي مختلف ميتونم بگم تمامشون يکطرف و اسمبلي يکطرف ديگه اسمبلي واقعا زيباترين زبان برنامه نويسي است. خيلي شرمده هستم سرتون رو درد آوردم اگر محبت کرديد تا اينجا خونديد يک دنيا از شما سپاسگزارم.
ارادتمند
نعيمي