بالاخره كسي كه داره برق مي خونه بايد اسمبلي بلد باشه.انم از نوع خيلي پيشرفته ش
این که من پایم (پایه خنده!!!) من که خودم برق خوندم... تا تهش برو اون دکتراش هم چیزی از اسمبلی مدرن سر در نمیارن
دانشجويان الكترونيك كه دروس پايه ساخت و طراحي ميكروپروسسور رو ميخونن
بوق!!!!!
ببخشید؟؟؟؟
برنامه نويس اسمبلي تحت ويندوز چقدر با اسمبلي تحت لينوكس فرق مي كنه و اصولا يه همچين تقسيم بندي وجود داره؟اگه اينطوريه كدومش رو پيشنهاد ميكني و قدرت و كارايي كدومشون بالاتره
این سوال یه کم یه جوریه!! - میگم چرا ... بذار این QUOTE بازی رو تموم کنم.
برنامه نويس عادي يا اسمبلي اصلا نميدونه يا اگر هم بدونه باندازه مهندس الكترونيك نميدونه دليلش هم اينه كه اسمبلي معمولا وقتي نياز ميشه كه شما نياز به يك برنامه نزديك به سخت افزار پيدا ميكني. مهندس الكترونيك اگر قراره درايور براي سخت افزار بنويسه
مطمئنی؟؟؟ من که نیستم.
--------------------------------------
1- اولا اینکه تمام این بحثها یه چیزی کم داره. اونم اینه که رو کدوم Platform????
2- برنامه نویسی برای سیستم های میکرو پروسسور و ... همه این کوفت و زهر ماریها بستگی مستقیم به دستوراتی داره که وندور -بذارید پای کلاس گذاشتن من : vendor - اون قطعه معرفی میکنه. اما برای برنامه نویسی روی یک سیستم عامل قضیه فرق میکنه
3- وقتی میگی سیستم عامل ، خیلی صریح اعلام میکنی که میخوای وابسته به یک نرم افزار (سیستم عامل ) برنامه بنویسی و کمتر با سخت افزار کار داری. منظورم از سیستم عامل ، سیستم عاملهای Posix Base یا دست کم سیستم عاملهای پدر و مادر دار (مثل XP/2000 و نه 9X ) هست. در این صورت باید مشخص کنی کدوم طرف میخوای برنامه نویسی کنی(مانیتور یا کاربر؟؟).
البته هنوز یه سری دستورات هستن که مستقیم جواب میدن و شما باید اونا رو بشناسید و تا حد زیادی به سخت افزار بستگی دارن. مثلا سی پی یو های مدل قدیمی تر اینتل ، دستور CPUID یا دستور شماره (آدرس اگه بگم بهتره) A20F رو ندارن. (قسمت مقالات رو نگاه کنید یه جا توضیح دادم که چطور میشه این تابع رو استفاده کرد. ) البته اینتوابع خیلی کمن. و الان تقزیبا یه استاندارد رعایت میشه و همه سی پی یو ها یه سری دستور رو حتما دارن و بعضی بیشتر دارن.
4-یک سیستم عامل استاندارد (همونا که بالاتر گفتم سیستم عاملهای Posix Base یا دست کم سیستم عاملهای پدر و مادر دار (مثل XP/2000 و نه 9X )) دو مود داره. Mod - یکی مود مانیتور یکی مود کاربر. برنامه نویسی این دو قسمت کمی (یا حقیقتا : خیلی!!!) با هم فرق میکنند. الان سی پی یو ها همه از یک فلگ پشتیبانی برای کنترل این قضیه برخوردارند و به هیچ وجه نمیشه -اگه بشه یه باگ محسوب میشه- برنامه مود کاربر رو با اختیارات مود مانیتور اجرا کرد. اما مود مانیتور چیه؟ وقتی سی پی یو تو سیستم عاملهایی که چند وظیفه ای هستن میره روی کاری که مربوط به سیستم عامله اون فلگ ست میشه و کلیه دستوراتی که مستقیما با سخت افزار سر و کار دارن مجاز میشن. اما وقتی برمیگرده رو برنامه من و شما -تو Task Manager ببینید برنامه هایی که Owner اونا کاربره- کلیه اون فراخوانی ها ممنوع میشن. بازم میگم سیستم عاملهای پدر و مادر دار و مدرن. مثلا تو 9X میتونی با دو تا خط اسمبلی با پورتها بازی کنی. اما تو XP یا 2000 خطا میگیره.
5- حالا پس چطوری میتونی تو مود کاربر با سخت افزار ارتباط برقرار کنی؟ سادست. شما یک سری Api داری که وقتی فراخوانی میشن از اول فراخوانی تا آخرش میرن تو مود مانیتور. مثلا برای دسترسی به یک پورت باید (تو ویندوز از لینوکس در این مورد چیزی نمیدونم) با فراخوانی CreateFile که یه تابع kernel هست ، اونو به صورت یک فایل باز کنی (ویندوز اینها رو به صورت فایل در اختیار شما میذاره همون طور که Pipe ها و Disk devices -مثلا سی دی رام رو به صورت سکتور به سکتور و نه به صورت فایل به فایل-رو به صورت فایل باز میکنه) حالا این فایل با همون فراخوانی ها عادی Read و Write قابل استفادست. یا اینکه میتونی فراخوانی ها یپیشرفته تر رو مثل DeviceIoControl رو استفاده کنی. مثلا من یه برنامه نوشتم که از سی دی Image میگیره (بدون ForceApi و فقط با Api خود ویندوز و pure delphi) اگه میبینید به کار میاد بگید (البته فقط NT/2K/XP هست) -من که هر چی داشتم و نداشتم اتچ کردم اینم روش!!!! -
6- اما برنامه نویسی مود مانیتور. اونجا شما دیگه یا برنامه نویس سیستم عاملید و یا اینکه دارید درایور مینویسید. اونجا باید بگم که قضیه فرق میکنه. فعلا بی خیال برنامه نویسی سیستم عامل، اما برای درایور نویسها ویندوز یه سیستم داره به نام DDK که راهنمای همین کاره. میتونی دانلودش کنی( اما بدردت نخواهد خورد - اشتباه منو تکرار نکن!!!) یه تیکه هایی رو میتونی تو MSDN هم پیدا کنی.
7- برگردیم به بحث: همونطور که گفتم همه میکرو ها (پروسسورهای بدون سیستم عامل ) دستوراتی رو دارن که وندورشون بهتون میده. مثلا من یه زمان لازم شد و یک پروگرامر برای 8051 ساختم(ساختیم). (بازم بووووووقق!!! یادش بخیر بر وبچ ،فتل و ابی... و اصولا دورانی که دانشجو بودم!) یه سری دستور + یه سری راهنما که وقت پروگرام شدن این پایه باید ست باشه اون یکی ..... بعد هم یه فایل هگز ساده که با دستم میتونی ترجمش کنی هر دستور یه دو بایت و بعد آرگومانهاش. معمولا هم 256 تا دستورم ندارنکار کامپایلرش حتی به یک گذر هم نمیرسه. چه برسه به اینکه واسش دو گذره کامپایلر بنویسی!
به هر صورت این کار یه اسمبلی ساده داره که شما به عنوان یه مهندس الکترونیک و اصولا برق باید بشناسید و مسلط باشید. اما برنامه نویسی برای سیستم عامل حقیقتا فرق داره.
یه فایل اجرایی سیستم عامل (که شما میخواید با اسمبلی ایجادش کنید) خیلی مکافات داره! برای اینکار
الف : باید PE Coff رو فول باشی! -واسه لینوکس هم مربوط به خود اون- میتونی بری تو سایت MS و همین PE Coff رو سرچ کنی. من خیلی وقت پیش گرفتمش (وقتی داشتم یه ادیتور فایلهای PE مینوشتم یه چیزی تو مایه های eXe Scope یا Resource Hacker البته برای کاربردهای دیگه. اگه بر و بچ برنامه SS Builder منو دیده باشن میفهمن منظورم چیه) اینجا دستورات رو وندور سیستم عامل (در این مورد MS ) معین میکنه و شما باید تابع اون باشید.
مثلا تو Windows همه توابع stdcall هستند. یعنی آرگومانها از طریق پشته فرستاده میشن و از راست به چپ (به خدا یادم نیست !!! شاید غلط باشه) اما تو لینوکس برعکسه همه cdecl هستن. در اینجا وقتی شما میخواید یه تابع سیستمی رو صدا بزنید باید بدونید قبل از فزاخوانی آرگومانها رو از طریق پشته بفرستید یا رجیسترها؟؟ از چپ به راست باید بذاریدشون تو پشته یا از راست به چپ؟ -مشکلاتی که تو زبانهای برنامه نویسی سطح بالا ندارید. - اینحاست که شما باید بگی سیستم عامل عزیز هر چی شما بفرمایید!!! من که ..... شدم !! تا یکی دو تا برنامه نوشتم (یکی و نصفی!!) بعدشم تا ابد قیدشو زدم. الانم فقط برای دیباگ از اون چیزایی که یاد گرفتم استفاده میکنم (من دیباگر SoftIce رو پیشنهاد میکنم که نرم افزار های ایرانی مثل سگ ازش میترسن! مثلا پارسا 2001 تا اینو میبینه هشدار میده و میپره بیرون. زرشک!ا بچه ترسو.گه حوصله داشتم و این نوشته جا داشت مینویسم این کوفتی چی هست ولی حقیقتا قاط زدم اینقدر نوشتم!)
ب : با یه نرم افزار مدرن مثل Tourbo Assembler نسخه های آخرش آشنایی کامل داشته باشی.
ج : واسه خودت یه کتابخانه کامل بنویسی. چون دیگه نه Header فایل هست و نه....
حالا اینجا باید مشخص کنی برای کدوم Platform? ویندوز یا لینوکس یا اصلا بدون سکو میخوای بری سراغ یه میکرو بدون سیستم عامل؟
برنامه نويس اسمبلي تحت ويندوز چقدر با اسمبلي تحت لينوكس فرق مي كنه و اصولا يه همچين تقسيم بندي وجود داره؟اگه اينطوريه كدومش رو پيشنهاد ميكني و قدرت و كارايي كدومشون بالاتره.
وقتی داری با یه سیستم عامل کار میکنی لازمه که بدونی آیا احتیاج به فراخوانی سیستمی داری یا نه؟ مثلا UCL یا LZO یه پیاده سازی اسمبلی هم دارن. (هر دوتا متد های کمپرس هستن کار این بابایی که UPX رو نوشته و اسمش به تنهایی اندازه تمام اسامی همه افراد خانواده منه!) اما اونها اصلا نیازی به سیتم عامل ندارن. یه سری بایت میگیرن و کمپرس میکنن. بنابراین این نوع کد روی لینوکس یا روی ویندوز عین همن و راحت هم رو هر دوتا کامپایل میشن. اما وقتی با سیستم عامل کار داری هر دو تا متفاوتن. در اون صورت شما خوب بالاخره اول سیستم رو انتخاب میکنی یا نه؟ یعنی خودت از اول میدونی با کدوم کار داری دیگه! در کل اونقدرها فرق ندارن. اما فرقهایی که دارن به اندازه کافی آزار دهنده هست.
-----------------------------------------------------------------
از اینجا به بعد نظر شخصی منه و اصلا هیچ بحثی رو -اگه احساس کنم بیفایدست - جواب نمیدم.
شما مهندس برقی یا میشی (انشالله) -خودمو قاطی نمیکنم. چون من یه جورایی خائنم به این رشته- اما ببین لازم نیست شما به عنوان مهندس برق از همه چیز سر در بیاری. مثلا اگه قرار باشه یه سخت افزار بسازی مطمئن باش که تکی کارت راه نمیفته. اینجا شما یه تیم برنامه نویس هم میخوای. دیگه لازم نیست که هم کارها رو خودت انجام بدی مثلا اسمبلی بیشتر از اشنایی با سیستمهای میکرو پروسسور برای شما لزومی نداره و وقت تلف کردنه. البته اگه صرفا محض علاقه داری کار میکنی که قضیه یه چیز دیگست. حیفه IQ الکی حروم کنی. (میدونی من خودم دو بیت مغز دارم که تا چهار کلمه بیشتر نمیتونم آدرس دهی کنم اگه جمله بیشتر از چهار کلمه باشه به آخرش برسم اولش یادم میره!!! یه بیتشم نیمسوزه! اینه که دلم میسوزه!! قبول داری منم میتونم شاعر بشم یا نه؟) بذار وقتتو رو چیزایی که حقیقتا بدرد میخورن. و برنامه نویسی رو هم تا حدی یاد بگیر که لازم داری. دونستن زیاد خوبه اما کسی که به اندازه میدونه از اون کسی که زیاد میدونه ولی همه چیزو نیمه تموم کار آمد تر میتونه باشه. مثلا یه مهندس برق دیباگ کردن برنامه های کامپیوترو میخواد چی کار؟دیگه دوره ابن سینا نیست که یه تنه بتونی هم دکتر باشی هم ستاره شناس هم فیزیکدان هم شیمیدان بعد هزار سال بعد هم واست هزاره بگیرن. البته قصدم این نیست که نصیحت کنم (لعنت به هر چی ناصح الکیه) ولی این تجربه منه که هنوزم پیرهنم پارست و وقت نکردم عوضش کنم! زلیخای نامرد! حقیقتا افتادم به دری ور گفتن آخه وقت خوابمه.
اما بقیه قضایا :
SoftIce یه دیباگره که من وقتی عصبی میشم میرم سراغش. البته برنامه های خودمو کاری ندارم چون سورس دارم راحت تر میتونم دیباگشون کنم.
اما یه چز خیلی کوچیک اینه که مثلا در یه ثانیه یه چیزی بیشتر از 100 تا پیغام برای یه پنجره ارسال میشه. (برنامه Spy++ رو که با ویژوال استدیو هست اجرا کن و یه پنجره رو چک کن میفهمی. ) وقت دیباگ ،همه اینها میشن فراخوانی یه تابع. یعنی اگه بخوای با یه دیباگری مثل ویژوال سی یا دلفی عمل کنی سرسام میگیری! هر ثانیه n تا تابع. ده روزباید Trace کنی تا تازه به Entry Point برسی .... اما این برنامه کلا سیستم رو منجمد میکنه و فقط با یه سری دستوراتی که داره میتونی یه دستور یه دستور یا ... جلو بری. اینم بگم : لطفا از من نپرسید برنامه کجاست و کرکش کجاست و .... این چیزا رو میتونید تو قسمت کرک مطرح کنید. اگه اینجا ببینم مجبور میشم برخورد کنم. (باور کنید تو این یه ماه دو سه تا برخورد خفن داشتم همین که زنده ام خیلیه!! ) و البته فکر نکنید یه برنامه مثل این میتونه از شما یه کرکر بسازه ... یه کم منطقی باشید و به جای خراب کاری فکر ساختن باشید)
یه اخطار دیگه !!! اگه کس دیگه ای بیاد و بازم از این سوالها رو بپرسه و منو مجبور کنه اینهمه تایپ کنم، اونم فارسی دعا میکنم یا کامپیوترش بسوزه یا اینکه (اگه پسره) زودتر زنش بدن و اگه دختره من که با دخترا شوخی ندارم!
....
حقیقت اینه که خیلی دوستت داشتم که اینهمه نوشتم واست! اگه حرفی میزنم بدل نگیر.