PDA

View Full Version : assembly development



SoloMo
سه شنبه 15 آذر 1384, 23:36 عصر
سلام دوستان
من دارم سعی میکنم از راهنماها و ایبوکهای که رو اینترنت هست استفاده کنم اما یه چیزی رو نفهمیدم زبان اسمبلی مگه یه تعریف استاندارد نداره ؟ چرا تو بعضی از کدها یا اکسپلویتا اسمبلی رو یهجور مینویسن و بعضی جاها جور دیگه ؟ چطوری برنامه ای که تو masm نوشته شده ببرم رو لینوکس یا کدهای اسمبلی لینوکس رو بیارم به ویندوز ؟ اگر در این موارد راهنمائی کنین ممنون میشم

seyedof
چهارشنبه 16 آذر 1384, 09:39 صبح
سلام
اسمبلی یک زبان نیست. املاهای اسمبلی های مختلف داریم. حتی روی PC هم ما چندین زبان اسمبلی داریم. چیزی که ثابته زبان ماشین است (روی یک سخت افزار خاص) و املای اسمبلی میتونه متفاوت باشه. شما اصلا یک زبان ایجاد کنید که به جای mov eax,ebx توش بنویسیم beriz eax,ebx.
ممنون علی

Inprise
جمعه 18 آذر 1384, 03:39 صبح
شما اصلا یک زبان ایجاد کنید که به جای mov eax,ebx توش بنویسیم beriz eax,ebx.

خوب این دیگه ربطی به اسمبلی نداره ، میشه زبان what-ever-u-want .


زبان اسمبلی مگه یه تعریف استاندارد نداره ؟

نه مانند C یا جاوا . اما همیشه یک سری قواعد مشخص و روشن هست که ازشون استفاده میشه . معمولا" توسعه گران پردازنده ، برای اینکه برنامه نویسان بتونن روی سکوهای آنها کد بنویسند یک راهنمای آپکد به زبان اسمبلی منتشر میکنند ؛ یعنی راهنمائی که مشخص میکنه هر واحد زبان ماشین رو چطور میشه به یک معادل مناسب به زبان اسمبلی تبدیل کرد ؛ مثلا" اینتل سالهاست که یک راهنمای توسعه گر داره که ضمن معرفی قابلیتهای پردازنده هاش ، کمک میکنه برنامه نویسان بتونن با استفاده از "یک شکل صوری از اسمبلی" با پردازنده ارتباط برقرار کنند . بعد از این مرحله ، توسعه گران کامپایلر/اسمبلر ، با استفاده از اون قواعد اسمبلرهائی تولید میکنند که کدهای سطح بالا/یا کد اسمبلی دریافت میکنه و کد ماشین تولید میکنه و البته نهایتا" این کد ماشین در قالب یک فایل اجرائی سازگار با بستر و سکو ( مثلا" PE برای Wintel/IA32 ) بسته بندی میشه و تو اجراش میکنی . پس برای درک تفاوت بین کدهای اسمبلی که میبینی باید از دو بعد بهشون نگاه کنی : الف) برای کدام معماری سخت افزاری ؟ ب)توسط کدام توسعه گر اسمبلر ؟ و علاوه بر این توضیحات یه مورد جیم هم من اضافه میکنم : ج)با تبعیت از کدام "قاعدهء نمود" ؟

الف: کد اسمبلی برای کدام معاری در نظر گرفته شده ؟ x86 یا PowerPC یا Alpha RICS یا ...؟بسته به اینکه کد برای کدام معماری در نظر گرفته شده باشه میتونه تفاوتهائی با سایر کدهای بکنه . برای اینکه به زبان اسمبلی برای یکی از این معماریها مسلط بشی بی تردید باید مرجع توسعه گری اون کمپانی رو تهیه کنی .

ب : کد اسمبلی برای کدام اسمبلر نوشته شده ؟ MASM یا BASM ؟ TASM - FASM - NASM - PASM یا ..؟ هر کدام از این اسمبلرها علاوه بر مشخصه های خاص پردازنده و سکو ، علائم و افزونه های به خصوصی برای هوشمند تر کردن روند توسعه و خوانا تر شدن کد و بهینگی نگهداری و اشکالزدائی و ...دارند که با بقیه متفاوته . MASM یا Macro Assember روی ویندوز خیلی متداوله . ماکروهای زیادی داره و میشه باهاش سریعتر کد نوشت ، هر چند خروجی اش به خوبی خروجی TASM و FASM نیست . TASM یا Turbo Assembler متعلق به بورلند بود تا نهایتا" به Paradigm فروختش و حالا فقط به عنوان یکی از محصولات کلاسیکش میفروشتش و توسعه اش در اختیار Paradigm است که اونهم با تغییراتی در TASM اونو با نام PASM عرضه کرده که ضمن سازگاری با MASM امکانات بیشتری داره . FASM یا Flat Assembler عمر طولانی نداره اما پروژه موفقیه و پلتفرمهای زیادی رو میشناسه . BASM یا Borland Assembler یک نگارش خاص از TASM است که همراه با دلفی منتشر میشه و در واقع اسمبلر داخلی دلفی هم هست . NASM یا Netwide Assembler هم سورس آزاد است و مالتی پلتفرم و کدهای خوبی هم تولید میکنه . GAS یا GNU Assembler هم اسمبلر استاندارد GNU است که لینوکس و توسعه گرانش ازش استفاده میکنند و GCC هم برای اسمبل کد از GAS استفاده میکنه .

ج:بدون توجه به سکو و بستر و اسمبلر ، کد اسمبلی از قواعد اینتل تبعیت میکنه یا AT&T . این روزها کد اسمبلی رو بدون توجه به اینکه برای کدوم سخت افزار و اسمبلر نوشته میشه ، دو جور مینویسند . یکی شبیه به استانداردی که اینتل منتشر کرد و دیگری شبیه به استاندارد قدیمی AT&T . کدهائی مانند کد زیر در حال تبعیت از استاندارد نمود اینتل هستند :


mov eax, 4

و کد زیر معادل کد فوق است اما با مدل AT&T :


movl $4, %eax

طبق یه قاعده نا نوشته و غیر رسمی معمولا" کسانی که برای ویندوز و اینتل کد مینویسند از مدل اینتل استفاده میکنند و اغلب توسعه گران یونیکس/لینوکس از مدل AT&T استفاده میکنند . هر چند [ اغلب] میشه براحتی روی هر محیطی بین این دو سوئیچ کرد مثلا" میشه براحتی با افزودن یک دایرکتیو ، روی GCC یا با GAS‌ ( همان GNU Assembler ) با مدل اینتل کد نوشت .


تو بعضی از کدها یا اکسپلویتا اسمبلی رو یهجور مینویسن و بعضی جاها جور دیگه ؟

چند روز قبل یکی از پسرکوچولوهای فامیل وقتی دید دود سیگار رو آروم آروم میدم بیرون ازم پرسید چرا بعضیها یهو دود سیگار رو میدن بیرون ؟ و بعضی ها یواش یواش ؟ و من درسته که چطوری دود سیگار رو بدم بیرون ؟ گفتم تو بگذار ریه ات اونقدر بزرگ بشه که بتونی پک اول رو بزنی ، بعدا" در مورد اینکه چطوری دودش رو میدی بیرون تصمیم بگیر .

روز خوش