اسمبلي چيست ؟

در اين بخش مي‌توانيد در مباحث مربوط ديگر زبانهاي برنامه نويسي به بحث بپردازيد

مدیران انجمن: Azadi.Isatis, abbas.m.k, athlon64x2, شوراي نظارت

Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج‌شنبه ۹ شهریور ۱۳۸۵, ۹:۱۵ ب.ظ
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 »

sohrab_poet نوشته شده:با سلام
كسي از دوستان ميتونه راجع به ساعت مقيم در حافظه به من كمكي بكنه؟
من اين پروژه رو بايد هفته ديگه تحويل بدم :lol: :?
يا اينكه مقيم كردن در حافظه چطوريه؟


سلام دوست خوبم

من تازه پست شما رو ديدم . اگر منظورتون صرفا مقيم کردن يک برنامه نشون دادن ساعت رو صفحست اين برنامه هدفتون رو انجام ميده. البته چون مطمئن نبودم کاملش نکردم و خيلي ناقصي داره مثل اينکه چک نميکنه يک نسخه اش تو حافظه باشه و هر بار تيکر صدا زده ميشه اجرا ميشه يعني 18 بار در ثانيه و ... از همه بدتر ديباگ هم مناسب نشده . خيلي سريع انجام دادم که اگر همين چيزيه که ميخواين ميشه کاملترش کرد اگرم نيست بيشتر توضيح بدين تا بتونم در حد توانم کمکتون کنم.

Please Login or Register to see this code

ارادتمند
نعيمي
Captain II
Captain II
نمایه کاربر
پست: 825
تاریخ عضویت: جمعه ۲۰ مرداد ۱۳۸۵, ۸:۴۵ ق.ظ
محل اقامت: pejman.daie@gmail.com
سپاس‌های دریافتی: 20 بار
تماس:

پست توسط pejman »

بايد يك برنامه مقيم در حافظه باشه كه اين ساعت هم زمان كه كار ميكنه ما بتونيم بقيه كاراموت رو تو dos انجام بديم
Empty spaces - what are we living for?


از دی که گذشت هیچ از او یاد مکن
فردا که نیامده است فریاد مکن
برنامده و گذشته بنیاد مکن
حالی خوش باش و عمر بر باد مکن
Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج‌شنبه ۹ شهریور ۱۳۸۵, ۹:۱۵ ب.ظ
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 »

pejman نوشته شده:بايد يك برنامه مقيم در حافظه باشه كه اين ساعت هم زمان كه كار ميكنه ما بتونيم بقيه كاراموت رو تو dos انجام بديم


خوب بديهيه دوست من آنچه فرموديد تعريف برنامه مقيم در حافظه است . همونطور که گفتم انواعي از برنامه هاي مقيم در حافظه وجود داره . يکسي فعال نيستن و با ترکيب خاص کليد ها فعال ميشن که اينا رو معمولا روي وقفه کيبورد ميگذاريم . يکسي هم هستن که بعد از زمان خاصي يا سر ساعت خاصي فعال ميشن که روي وقفه تايمر ميگذاريم. يکسري هم که هميشه فعال هستن مثل برنامه بالا که اتفاقا ساده ترين شکل هست و خيلي راحت روي وقفه تايمر هر ثانيه 18 بار صدا زده ميشه . البته ناقصه چون داشتم پست طولاني در همين سايت ميخوندم و جواب ميدادم و متاسفانه نه ديباگ شد و نه غير فعال سازي و حذف از حافظه و چک کردن instance هاي قبلي و .. رو نداره . توضيح متاسفانه کامل نبود و صرفا به عنوان پايه برنامه اي که درخواست شده بود ارسال کردم.

ارادتمند
نعيمي
Old Moderator
Old Moderator
نمایه کاربر
پست: 763
تاریخ عضویت: دوشنبه ۸ خرداد ۱۳۸۵, ۱۰:۵۲ ب.ظ
محل اقامت: مشهد
سپاس‌های دریافتی: 196 بار
تماس:

پست توسط sohrab_poet »

من فكر كنم همين برنامش خوبه.
فقط اگر ممكنه يكم راجع به اون و قسمت هايي كه برنامه رو مقيم در حافظه كرده و در كل راجه به برنامه توضيح بديد ممنون ميشم. :(
تصویر
Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج‌شنبه ۹ شهریور ۱۳۸۵, ۹:۱۵ ب.ظ
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 »

sohrab_poet نوشته شده:من فكر كنم همين برنامش خوبه.
فقط اگر ممكنه يكم راجع به اون و قسمت هايي كه برنامه رو مقيم در حافظه كرده و در كل راجه به برنامه توضيح بديد ممنون ميشم. :(


دوست خوبم من اين برنامه رو صرفا براي اينکه سر بحث رو باز کنيم نوشتم و خواهيد ديد که خيلي کم و کسر داره.
تمام اين برنامه ها دو بخش دارن
يکي بخشي که بعد از مقيم شدن در حافظه ميمونه و دوم بخشي که قسمت اول رو در حافظه لود ميکنه و ادرس وقفه رو به اون ست ميکنه . طبق عادت بخش دوم رو گذاشتم load که منظور لودر هست. اما چرا لودر زو در انتها ميگذاريم ؟ براي اينکه وقتي دستور مقيم شدن و خروج رو ميديم بتونيم بيشترين حجم حافظه رو آزاد کنيم. البته اين روش بالا بدوي ترين شکلشه اگر بخواين تميز ترين روش اينه که يک بلوک مجزا بگيريد و وکتور وقفه جديدو توش کپي کنيد و ... اگر مجالي بود توضيح ميدم

در لودر
-------
1. آدرس وقفه اصلي تايمر رو ذخيره ميکنيم تا صداش بزنيم وگرنه ساعت پي سي ديگه جلو نميره
2. حالا آدرس روتين خودمون رو جايگزين وکتور وقفه اصلي ميکنيم
3. دوباره وقفه ها رو روشن ميکنيم
4. خارج ميشيم از برنامه به شکلي که فقط از لودر به بعد از حافظه آزاد بشه . البته من اينجا بدوي ترين روش خروج از برنامه مقيم يعني int 27 رو استفاده کردم تا هم حجم کد کمتر باشه و هم عملکرد واضح تر.

در روتين وقفه
--------------
1. وقفه تايمر اصلي رو صدا ميزنيم تا ساعت پي سي جلو بره
2. محل نوشتن ساعت رو در سطر اول و ستون 76 انتخاب ميکنيم. يادتون هست که 0b800 آدرس شروع فريم متن اي جي آ هست که ديفالت داسه.
3. ساعت رو از پورت 71 ميخونيم ساعت و دقيقه رو ميخونيم با فرمت bcd و روي حافظه ويدئو به ترتيب مينويسيم (دهگان ساعت يکان ساعت و ... ) بينشون هم يک : ميگذاريم جمعا 4 رقم که ميشه 5 کاراکتر.
4. از وقفه برگشت ميکنيم

در مورد ديرکتيوهاي masm اون بالا هم
مود 286 واسه اينکه PUSHA و POPA داشته باشيم
,CODE واسه اينکه از سگمنت کد پيش فرض موجود استفاده کنيم و ديگه سگمنت تعريف نکنيم
,MODE SMALL هم يعني کد و ديتا در يک سگمان (64 کيلوبايت) جاميشن که اجازه استفاده از سگمنت هاي پيش فرض کوچک masm يعني .CODE و DATA. رو ميده.
ORG 100h هم واسه اينکه 256 بايت اول برنامه خالي بگذاره براي PSP و STACK تا بشه به COM تبديلش کرد. دفت کنيد که برنامه stack segement نداره و موقع لينک warning ميگيريد که درسته.
بعد از کمپايل و لينک exe2bin کنيد يا اصلا با توربو اسمبلر کمپايل کنيد مستقيم به com و مود tiny . اگر با masm کار ميکنيد حتما با لينکر 16 بيتي لينک شه نه 32 بيني که همراه masm 6 به بعده.

همين!

ارادتمند
نعيمي
Captain II
Captain II
نمایه کاربر
پست: 825
تاریخ عضویت: جمعه ۲۰ مرداد ۱۳۸۵, ۸:۴۵ ق.ظ
محل اقامت: pejman.daie@gmail.com
سپاس‌های دریافتی: 20 بار
تماس:

پست توسط pejman »

من فقط منزورم تعكيد بر مفهوم مقيم در حافظه بود
athlon64x2,
خيلي ممنون از توزيحاتتون
ببخشيد ولي يك سوال ذهنم رو مشغول كرده ميخواستم بدونم چطور وچرا اين قدر دنبال اسمبلي رفين و از كجا اينارو ياد گرفتين؟
Empty spaces - what are we living for?


از دی که گذشت هیچ از او یاد مکن
فردا که نیامده است فریاد مکن
برنامده و گذشته بنیاد مکن
حالی خوش باش و عمر بر باد مکن
Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج‌شنبه ۹ شهریور ۱۳۸۵, ۹:۱۵ ب.ظ
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 »

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 پيزوري بود باهاش کدهاي کوچک تست ميکرديم بازم يادش به خير تا بعده ها با توربو اسمبلر آشنا شدم اونم با واسطه توربو سي البته ماکرو اسمبلر و توربو اسمبلر نميشه بهشون اسمبلر گفت واقعا امکاناتشون با اين همه امکان تعريف پروسه و ماکرو و ... مثل يه زبون سطح بالا ميمونن.

ياد دوران جووني به خير واقعا جمله جناب مهدي طلاست برنامه نويسي پايه اي يعني درک آنچه در سطح اسمبلي روي سي پي يو اتفاق ميفته. بعد از همه اين سالها و زبونهاي مختلف ميتونم بگم تمامشون يکطرف و اسمبلي يکطرف ديگه اسمبلي واقعا زيباترين زبان برنامه نويسي است. خيلي شرمده هستم سرتون رو درد آوردم اگر محبت کرديد تا اينجا خونديد يک دنيا از شما سپاسگزارم.

ارادتمند
نعيمي
آخرین ويرايش توسط 1 on athlon64x2, ويرايش شده در 0.
Old Moderator
Old Moderator
نمایه کاربر
پست: 763
تاریخ عضویت: دوشنبه ۸ خرداد ۱۳۸۵, ۱۰:۵۲ ب.ظ
محل اقامت: مشهد
سپاس‌های دریافتی: 196 بار
تماس:

پست توسط sohrab_poet »

به نظر شما ميتونيم ما اين برنامه رو به عنوان پروژه ارائه كنيم؟
من نميخوام برنامه خيلي سنگين باشه.
ميخوام از ساده ترين نو عمقيم در حافظه باشه و ساعتم باشه .
همين.
از شما متشكرم.
تصویر
Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج‌شنبه ۹ شهریور ۱۳۸۵, ۹:۱۵ ب.ظ
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 »

sohrab_poet نوشته شده:به نظر شما ميتونيم ما اين برنامه رو به عنوان پروژه ارائه كنيم؟
من نميخوام برنامه خيلي سنگين باشه.
ميخوام از ساده ترين نو عمقيم در حافظه باشه و ساعتم باشه .
همين.
از شما متشكرم.


بله دوست عزيز حتما ميتونيد استفاده کنيد و به همين دليل هم در جواب درخواست شما ارسالش کرده بودم چون ديدم نوشتيد محدوديت زماني دارين
فکر نميکنم از اين ساده تر بشه نوشت يا حداقل من بلد نيستم همين الانم سورس خيلي کوچکي است البته ممکنه دوستان روشهاي آسونتري نيز اطلاع داشته باشند که من بي خبرم
همين الان هم ساعته دوست خوبم :shock: توضيح که دادم اون 5 بخش تحت ليبل newvector اولي دهگان ساعت دومي يکان ساعت سومي ":" چهارمي دهگان دقيقه و پنجمي يکان دقيقه است . شايد من منظور شما رو از ساعت متوجه نميشم ميشه دقيق تر توضيح بفرماييد ؟
اين برنامه الان يک برنامه مقيم حافظه است که وقتي اجراش کنيد يک ساعت گوشه بالا راست صفحه نشون ميده و شما ميتونيد به کارتون در داس ادامه بدين اما رونين غير فعال کردن و يا پاک کردنش از حافظه رو نداره و فقط ساعت رو مقيم ميکنه همين .
براي استفاده کافيه ابتدا کمپايلش کنين (من اينو با ماکرو اسمبلر 5.1 که دم دست بود کمپايل کردم و مشکل نداره ولي چيزي نداره که با توربو اسمبلر کار نکنه) بعد لينکش کنيد و بعد از اون exe2bin و به فايل com تبديل کنه اين مهمه چون بصورت exe کار نخواهد کرد. در واقع به اين ترتيب
masm clock
link clock
exe2bin clock clock.com

ارادتمند
نعيمي
Old Moderator
Old Moderator
نمایه کاربر
پست: 763
تاریخ عضویت: دوشنبه ۸ خرداد ۱۳۸۵, ۱۰:۵۲ ب.ظ
محل اقامت: مشهد
سپاس‌های دریافتی: 196 بار
تماس:

پست توسط sohrab_poet »

من اين برنامه مقيم در حافظه رو تو emulator 8086 اجرا كردم به INT27hگير داد.
Masm 8 رو هم از تو سايت مايكروسافت دانلود كردم ميگه كه بايد ويژوال سي پلاس پلاس 2005 بايد داشته باشم.

بايد چه كار كنم.؟
اگر ممكنه اون اسمبلري كه خودتون اين برنامه رو توش اجرا كرديد به من هم معرفي كنيد.
باتشكر.
تصویر
Captain II
Captain II
نمایه کاربر
پست: 825
تاریخ عضویت: جمعه ۲۰ مرداد ۱۳۸۵, ۸:۴۵ ق.ظ
محل اقامت: pejman.daie@gmail.com
سپاس‌های دریافتی: 20 بار
تماس:

پست توسط pejman »

منم به مشكل هاي sohrab_poet, بر خورد كردم اگر ممكنه كمك كنيد
Empty spaces - what are we living for?


از دی که گذشت هیچ از او یاد مکن
فردا که نیامده است فریاد مکن
برنامده و گذشته بنیاد مکن
حالی خوش باش و عمر بر باد مکن
Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج‌شنبه ۹ شهریور ۱۳۸۵, ۹:۱۵ ب.ظ
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 »

سلام دوستان عزيز pejman و sohrab_poet

قبلا که پاسخ داده بودم که دوستان گلم :(
چون مشکل شايعي است هنگام استفاده از برنامه هايي که اجبارا به کمپايل 16 بيتي نياز دارند . ببينيد ...

براي استفاده کافيه ابتدا کمپايلش کنين (من اينو با ماکرو اسمبلر 5.1 که دم دست بود کمپايل کردم و مشکل نداره ولي چيزي نداره که با توربو اسمبلر کار نکنه) بعد لينکش کنيد و بعد از اون exe2bin و به فايل com تبديل کنه اين مهمه چون بصورت exe کار نخواهد کرد.


بعد از کمپايل و لينک exe2bin کنيد يا اصلا با توربو اسمبلر کمپايل کنيد مستقيم به com و مود tiny . اگر با masm کار ميکنيد حتما با لينکر 16 بيتي لينک شه نه 32 بيني که همراه masm 6 به بعده.


براي امولاتور هم توجه کنيد که اين وقفه مال داس هست نه بيوس البته جزو وقفه مشهور 21 نيست . emulator 86 با وقفه هاي داس در ويندوز ايکس پي مشکل داره. بهترين راه نصب يک vmware و نصب dos 7.1 داخل اونه (يا حتي ورژن هاي قديمي تر داست هرچي دم دست داريد) که يک داس پي سي 99.9% واقعي به شما ميده .

ماکرو اسمبلر از ورژن 6 صاحب يک لينکر شد که 32 بيتي است و ساپورت کمپايل کدهاي مود محافظت شده و ويندوز به اون ضافه شده بود . اين لينکر قابليت لينک برنامه هاي realdos رو به درستي نداره. بايد از يک لينکر 16 بيتي استفاده کنيد که اگر در گوگل هم جستجو کنيد به تعدا زياد هست . ميکروسافت آخرين ورژن واقعي از ماکرو اسمبلر رو همراه cpu package ويژوال استوديو 6 داد که البته لينکرش 32 بيتي است . در اين نسخه ميشه کد داس رو هم باهاش کمپايل کرد اما حتما با لينکر نسخه هاي قبلي بايد لينک کنيد . نسخه هاي بعدي تا 9 هم اومده (البته نه بصورت مجزا بلکه همراه ويژوال استوديو و قبلا همراه ddk ميومد) فاقد پشتيباني کامل/بي نقص از کد real mode هستند .

من براي در امان بودن کلا در masm 5.1 براي داس کار ميکنم که آخرين ورژني بود که بصورت پکيج مستقل منتشر شد . براي داونلودش هم ميتونيد از اين آدرس استفاده کنيد . در همين سايت داکومنت هاي جامعي در مورد استفاده از دستورات نسلهاي جديد سي پي يو ها خواهيد يافت که البته نيازمند کمپايلر جديد هستند .
[External Link Removed for Guests]

اگر هم نياز مند يک اسمبلر مدرن هستيد من به شدت nasm رو توصيه ميکنم و به معني واقعي کلمه کامل بي نقص و مدرن هست
[External Link Removed for Guests]

ارادتمند شما
نعيمي
ارسال پست

بازگشت به “Other Programming”