PDA

View Full Version : سوال: سوال



PEYMAN002
جمعه 02 آبان 1399, 11:51 صبح
سلام
چنتا سوال در خصوص اسمبلی دارم.
چطور میشه فایل های ترجمه شده توسط اسمبلر را مشاهده کرد مثل فایل obj ؟ میخوام کد ماشین برنامه رو ببینم.
برای تبدیل فایل obj به برنامه exe توسط لینکر نیاز به فایل های دیگه داره که توسط اسمبلر تولید شده مثل lst ؟
ایا میشه برنامه ای را تحت بیوس اجرا کرد بدون نیاز به سیستم عامل مثل داس و ویندوز ؟ یعنی کامپیوتر روشن میشه به جای سیستم عامل برنامه بالا بیاد مثل سیستم عامل.
من تو تمام اموزش ها که دیدم به طور پیشفرض برای کاراکترها از اسکی داره استفاده میشه. ایا میشه از یونیکد استفاده کرد تو اسمبلی، اسمبلی که تحت بیوس بالا میاد نه ویندوز و داس؟
من جایی خوندم که برنامه با دو فرمت com و exe میشه تولید کرد. تفاوت این دو چیه؟

the king
جمعه 02 آبان 1399, 14:12 عصر
سلام
چنتا سوال در خصوص اسمبلی دارم.
چطور میشه فایل های ترجمه شده توسط اسمبلر را مشاهده کرد مثل فایل obj ؟ میخوام کد ماشین برنامه رو ببینم.

در حالت کلی با استفاده از ابزار هایی مثل IDA Pro و W32Dasm که Disassembler های تخصصی هستند و کارشون همینه.
اما برای فایل های obj می توانید از ابزار های ساده تری مثل OBJ2ASM هم استفاده کنید.



برای تبدیل فایل obj به برنامه exe توسط لینکر نیاز به فایل های دیگه داره که توسط اسمبلر تولید شده مثل lst ؟

خیر.



ایا میشه برنامه ای را تحت بیوس اجرا کرد بدون نیاز به سیستم عامل مثل داس و ویندوز ؟ یعنی کامپیوتر روشن میشه به جای سیستم عامل برنامه بالا بیاد مثل سیستم عامل.

بله. ولی اولا باید مدل حافظه اش Tiny باشه، یعنی خروجی فایل های کوچک و ساده COM، نه EXE. چون دیگه سیستم عاملی وجود نداره که فایل EXE رو تفسیر کنه.
ثانیا داخلش فقط می توانید از وقفه های BIOS استفاده کنید، از وقفه های DOS نمی توانید استفاده کنید چون موقعی که کد شما اجرا میشه وجود ندارند.
ثالثا فایل، فولدر، پارتیشن و ... برای برنامه شما معنی نداره و اگر با دیسک کاری می کنید خودتون باید در کدتون سکتور به سکتور داده بخونید.



من تو تمام اموزش ها که دیدم به طور پیشفرض برای کاراکترها از اسکی داره استفاده میشه. ایا میشه از یونیکد استفاده کرد تو اسمبلی

بله، اما برای کد اسمبلی که قراره با استفاده از توابع ویندوز کار کنه، نه MS-DOS. مگر اینکه کتابخانه تخصصی ای برای نمایش متن Unicode در DOS باشه که ازش استفاده کرده باشید.
مشکل این نیست که نتوانید در کدتون رشته Unicode داشته باشید، مساله اینجا است که برای تایپ یا نمایش رشته های Unicode تون باید سرویس مناسب Unicode ای باشه که در BIOS و MS-DOS نیست. اگر برای ویندوز کد اسمبلی می نویسید و از فراخوانی توابع API ویندوز کمک می گیرید، بله، می توانید از Unicode استفاده کنید.
اما چون اغلب کد های اسمبلی که می بینید برای MS-DOS و بر اساس وقفه های BIOS و MS-DOS طراحی شده اند، طبعا نمی توانند با رشته های Unicode کاری انجام بدهند.



من جایی خوندم که برنامه با دو فرمت com و exe میشه تولید کرد. تفاوت این دو چیه؟
فایل های COM که خیلی ساده هستند، یک مدل حافظه Tiny دارند که کد و داده هر دو کنار هم در یک سگمنت قرار میگیره و فراتر از اون سگمنت نمیره که برای برنامه های خیلی کوچیک و کم حجم مناسب ئه. فایل های COM پردازش خاصی لازم ندارند، آدرس های داخل فایل همونطور که نوشته شدن در حافظه قرار می گیرند و دستکاری خاصی لازم ندارند.

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

PEYMAN002
جمعه 02 آبان 1399, 16:16 عصر
تشکر بابت جواب خوبتون.
پس نمیشه برنامه سنگین و پیچیده ای ساخت که با بیوس اجرا کرد چون قابلیتش رو نداره؟ و از جهتی با ویندوز میشه هم برنامه سنگین و بزرگ اجرا کرد و یونید هم ساپورت میکنه، درسته ؟
چطور خود ویندوز به این سنگینی داره اجرا میشه ؟ منظورم اینکه مگه سیستم عامل از طریق بیوس اجرا نمیشه ؟
من دنبال اجرای برنامه با بیوس بودم چون خود سیستم عامل داره بخش از منابع سخت افزار رو استفاده میکنه، خواستم ببینم میشه همچین کاری کرد که گفتین برای کارای سنگین و یونیکد نمیشه.

یه سوال دیگه من هرچی اموزش از اسمبلی دیدم هیچ اشاره ای از هسته های سی پی یو نمیکنه. اینکه مثلا سی پی یو چند هسته ای میتونه همزمان به تعداد هسته هاش به صورت همزمان و موازی اطلاعات را پردازش کنه. ایا در این خصوص مطلب اموزشی هست که معرفی کنید ؟
باتشکر

the king
جمعه 02 آبان 1399, 16:59 عصر
تشکر بابت جواب خوبتون.
پس نمیشه برنامه سنگین و پیچیده ای ساخت که با بیوس اجرا کرد چون قابلیتش رو نداره؟ و از جهتی با ویندوز میشه هم برنامه سنگین و بزرگ اجرا کرد و یونید هم ساپورت میکنه، درسته ؟
من دنبال اجرای برنامه با بیوس بودم چون خود سیستم عامل داره بخش از منابع سخت افزار رو استفاده میکنه، خواستم ببینم میشه همچین کاری کرد که گفتین برای کارای سنگین و یونیکد نمیشه.

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



یه سوال دیگه من هرچی اموزش از اسمبلی دیدم هیچ اشاره ای از هسته های سی پی یو نمیکنه. اینکه مثلا سی پی یو چند هسته ای میتونه همزمان به تعداد هسته هاش به صورت همزمان و موازی اطلاعات را پردازش کنه. ایا در این خصوص مطلب اموزشی هست که معرفی کنید ؟
باتشکر
معمولا برنامه شما تحت یک سیستم عامل مثل ویندوز اجرا میشه و پردازنده منبعی است که متعلق به اون سیستم عامل ئه. برنامه ها نباید و نمی توانند خودشون مستقیما با پردازنده و سایر منابعی که مالک شون سیستم عامل هست کار کنند. برای اینکه از پردازنده چند هسته ای استفاده بیشتری بکنید با توابع API سیستم عامل پروسه (Process) و نخ (Thread) میسازید و سیستم عامل طبق زمان بندی خودش بخشی از وقت هسته های پردازنده رو برای اجرای اونها اختصاص میده.

بعید میدونم بخواهید همچین کاری انجام بدهید اما اگر بخواهید در محیطی که سیستم عامل و محدودیت هاش وجود نداره با پردازنده کار کنید، مثلا بخواهید خودتون یک سیستم عامل طراحی کنید، هم مستندات فنی پردازنده ها بدردتون میخوره و هم مستندات اسمبلی که "چند هسته ای" هم جزو مطالبشون باشه :
https://www.codeproject.com/Articles/1273844/The-Intel-Assembly-Manual-3

PEYMAN002
جمعه 02 آبان 1399, 19:46 عصر
من که در توانم نیست همچین کاری کنم که بخوام سیستم عامل درست کنم . من به برنامه نویسی علاقه دارم دیدم اسمبلی حس خوبی بهش دارم نسبت به c . ولی اون جوری که میگین حتی خود حرفه ای ترین برنامه حتی همین ویندوز هم نمیتونه از تمام ظرفیت cpu و سخت افزار استفاده کنه. شما مطالب اموزشی اسمبلی رو ببینین همش درباره نقل و انتقالات تو cpu صحبت میشه ولی در عمل نمیشه از ظرفیت کامل سخت افزار استفاده کرد.
من یه مطلبی خوندم که دلیل عدم تولید cpu ۱۲۸ بیت همین عدم استفاده و کارایی اون در حال حاضر بود. ولی انصافا برنامه نویسی چیز شاخیه. اینده یعنی برنامه نویسی. پول تو برنامه نویسیه.
از راهنماییتون ممنون و تشکر

farhad_shiri_ex
جمعه 30 آبان 1399, 15:54 عصر
ولی اون جوری که میگین حتی خود حرفه ای ترین برنامه حتی همین ویندوز هم نمیتونه از تمام ظرفیت cpu و سخت افزار استفاده کنه.
که همچنین حرفی زده؟ اصلا مسئله توان استفاده ویندوز از تمام ظرفیت پردازشگر نیست، مسئله اصلی زمان اجرا و سرعت پردازش و خیلی از موارد سطح پایین هست که باید توسط سیستم عامل کنترل شود که یک بحث خیلی فنی و پیچیده ای هست.
و در ضمن عدم تولید پردازشگرهای 128 بیتی اول به علت sram هایی که در پردازشگر باید اضافه کنند که قیمت تمام شده به شدت زیاد میشه دوم هم به خاطر اور کلاک شدن پردازشگر هست که باعث گرمای شدید میشه برای همین سازندگان پردازشگر را با چالش های زیادی رو به رو کرده
سوما همین الان هم پردازشگرهای جدید رجیسترهای 512 بیتی هم دارند ولی اگر منظورتون از 128 بیت نحوه آدرس دهی هست بله آدرس دهی های همین پردازشگرها همچنان 64 بیتی هست و البته وقتی تکنولوژی های جدید ایجاد شده اند که می توان از سیستم های توزیعی و کلاستر شده استفاده کرد خیلی مقرون به صرفه نیست که پردازشگرها را با هزینه های بیشتری تولید کنند
در ضمن فناوری کوانتوم ها پا به عرصه ظهور گذاشتند، به طوریکه تا 5-10 سال آینده تقریبا پردازشگرهای باینری برای استفاده های تجاری بزرگ منسوخ خواهند شد