نمایش نتایج 1 تا 24 از 24

نام تاپیک: عدد Hex معادل هر دستور

  1. #1

    عدد Hex معادل هر دستور

    سلام، یه سوال به نظر خودم جالب داشتم:
    معادل هر دستور اسمبلی یک عدد Hex وجود داره. مثلا دستور nop معادل 0x90 است . دستورات دیگر را چطور باید بدونم که معادل Hex اونها چی هست؟ آیا منبع خاصی وجود داره؟ مثلا معادل دستور jmp far، jmp near ، call و ... چی هست؟

  2. #2
    مسلمه که منبع خاصی وجود داره....
    برنامه های Debug و Dissassemble و کتاب های مرجع CPU ها.

  3. #3
    یکی به من گفت: EA معادل jmp far هست، حال ممکنه یک داده دیگه ای مقدار EA رو داشته باشه. وقتی من کد EA رو وارد می کنم، چطور مشخص کنم که این EA دستوره نه مقدار

  4. #4
    اگه درس معماری کامپیوتر رو میخوندی خیلی از مشکلاتت حل میشد اونجا با کامپیوترهای تک و چند سیکله آشنا میشی و میفهمی که چرا و چطور به یه دستور مثل Jump Near کد E9 رو میدن.

    ببین بالام جان!
    کامپیوتر از چند مرحله واسه واکشی و دیکود و اجرای دستور استفاده میکنه و برای اینکارها از چندین ثبات استفاده میکنه. مشهور ترین اینها Instruction Register, Program Counter هست که IR دستور العمل جاری رو در خودش نگه میداره وPC به دستور العمل بعدی اشاره میکنه.
    کافیه بدونی که هر ثبات IR از چند قسمت تشکیل شده
    ۱) Field (تک بیتی)
    ۲) آپ کد
    ۳) عملوند ها
    وقتی قراره دستور شما اجرا بشه... ابتدا میفهمه دستور ، فوری هستند یا غیر فوری(Field) بعد کد دستور شما( در اینجا EA) رو میخونه و اون رو واسه خودش تفسیر میکنه(OP Code) بعد میفهمه که که این دستور چند تا عملوند داره. و میره اونها رو واکشی میکنه.(Operands)
    در نتیحه هیچوقت EA که به معنی Jump باشه با EA که یه عدد ساده باشه اشتباه نمیشه چون مکان قرارگیری اونها فرق داره.

    واسه اینکه کنجکاو بشی:
    اگه از اندازه حافظه درمبنای ۲ لگاریتم بگیری اندازه PC به دست میاد
    و ۲ به توان op-code تا هم دستورالعمل داری

  5. #5
    کاربر دائمی آواتار ICEMAN
    تاریخ عضویت
    تیر 1383
    محل زندگی
    Hyper-V
    پست
    476
    سلام ...
    این میتونه به دردت بخوره ولی کافی نیست .
    ساختار سیستم هم باید بدونی .
    http://www.barnamenevis.org/sh...ad.php?t=65018

    موفق باشی

  6. #6
    در نتیحه هیچوقت EA که به معنی Jump باشه با EA که یه عدد ساده باشه اشتباه نمیشه چون مکان قرارگیری اونها فرق داره.
    خوب من چطور مشخص کنم که این EA بره تو opcode قرار بگیره نه جای دیگه؟ نمی دونم مطالب شما رو کمی تا قسمتی گرفتم، حالا اگه جملاتی برای بیشتر توضیح دادن وجود داره، لطف کنید بیان کنید. مرسی

  7. #7
    خوب من چطور مشخص کنم که این EA بره تو opcode قرار بگیره نه جای دیگه؟
    با یه برنامه debugger کارکن. اونوقت میبینی که چطور آپکدها رو دستکاری میکنن

  8. #8
    خوب من چطور مشخص کنم که این EA بره تو opcode قرار بگیره نه جای دیگه؟
    تو برای اجرا کردن کدت باید باینری مناسب سیستم عامل بسازی. در یک فایل باینری اجرائی قسمتهای مختلفی وجود دارد ، قسمت کد حاوی دستورات است و قسمت داده حاوی داده ها که داده ها توسط کدها مورد ارجاع قرار میگیرند پس داده بجای کد اجرا نمیشود . وظیفه تشخیص تفاوت کد و داده بر عهدهء فراخوان باینری های سیستم عامل است و برای درک بهتر مسئله باید فرمتهای اجرائی باینری مانند PE یا ELF را بخوانی
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  9. #9
    این برنامه هم برای پیدا کردن opcode ها می تونه مفید باشه

    http://rapidshare.com/files/28895724...pcode.rar.html

  10. #10
    نقل قول نوشته شده توسط Inprise مشاهده تاپیک
    تو برای اجرا کردن کدت باید باینری مناسب سیستم عامل بسازی. در یک فایل باینری اجرائی قسمتهای مختلفی وجود دارد ، قسمت کد حاوی دستورات است و قسمت داده حاوی داده ها که داده ها توسط کدها مورد ارجاع قرار میگیرند پس داده بجای کد اجرا نمیشود . وظیفه تشخیص تفاوت کد و داده بر عهدهء فراخوان باینری های سیستم عامل است و برای درک بهتر مسئله باید فرمتهای اجرائی باینری مانند PE یا ELF را بخوانی
    البته ممکنه EA یک آدرس باشه مثلا jmp به آدرس EA ، اونوقت دستور ما به این شکل می شه:
    mov eax EA
    jmp eax

    پس EA در قسمت کدها قرار می گیره و باید مشخص باشه که یه آدرسه نه دستور !!!



    با یه برنامه debugger کارکن. اونوقت میبینی که چطور آپکدها رو دستکاری میکنن
    دقیقا!! می خوام بدونم یه debugger (مثلا ollyDbg) چطور تشخیص می ده و دستورها رو درست آنالیز می کنه. و در خواندن یک فایل، آدرس یا داده EA رو با دستور EA اشتباه نمی گیره

  11. #11
    با سلام
    تا آنجا که من می دانم ازهر کجا که IP مقدار بگیرد CPU آن آدرس را آدرس دستور گرفته و هر مقداری که در حافظه مربوطه باشد سعی میکند decode کرده و اجرا نماید. حال اگر ما داده ای را تعریف می کنیم باید جایی باشد که روال اجرا به آن نرسد . یعنی ما حتی میتوانیم وسط کد برنامه هم داده تعریف کنیم بشرطی که برنامه را بگونه ای بنویسیم که روال اجرا هیچوقت به آن بایت یا بایتهای مربوطه نرسد(مثلا با استفاده از پرش) . بصورت کلی یعنی اینکه cpu فرقی بین EA بعنوان کد دستورالعمل یا داده نمی گذارد اما اینکه cpu در چه وضعیتی این عدد را میبیند برایش مشخص میشود که داده است یا قسمتی از یک دستورالعمل .
    امیدوارم واضح گفته باشم

  12. #12
    پس EA در قسمت کدها قرار می گیره و باید مشخص باشه که یه آدرسه نه دستور
    بالام جان مطالب رو درست نمیخونی؛
    با 0EAh کاری نداریم. با آپکد movو jump کار داریم. هر آپکد مشخص میکنه چه دستوریه و از چند عملوند تشکیل شده و مقدار انها چه جوره (مثلا کد شما آدرس دهی ثباتی مستقیمه)و در نهایت اقدام به واکشی عملوندها و اجرای دستور میکنه.

  13. #13
    پس EA در قسمت کدها قرار می گیره و باید مشخص باشه که یه آدرسه نه دستور !!!
    خوب طبیعی است که این مشخص هست . بعد از پردازش باینری توسط سیستم عامل و ارجاع دستورات به پردازنده ، تو در حال صحبت کردن به زبانی هستی که پردازنده اون رو میفهمه . یعنی لازم نیست که در گزارهء mov eax smtng توضیح بدهی که smtng یک دستور نیست ، چون وقتی تکلیف mov مشخص است همه میدانند که مقدمه و موخره اش چیست .
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  14. #14
    می خوام بدونم یه debugger (مثلا ollyDbg) چطور تشخیص می ده و دستورها رو درست آنالیز می کنه. و در خواندن یک فایل، آدرس یا داده EA رو با دستور EA اشتباه نمی گیره
    دیباگر اینکار رو انجام نمیده ، مسئله ای که در موردش سوال میکنی به Disassembler مربوط است . در مورد انواع دیباگرها و نحوهء عملکردشون در بخش امنیت نرم افزار مطالبی وجود داره .

    Disassembler با توجه به ساختار باینری دستورات رو ترجمه میکنه . ساختار باینری مشخص میکنه که نحوهء آماده کردن فضای آدرسی پروسه برای آغاز به کار چطور هست و دستورات و داده ها چطور مرتب و سازماندهی میشوند . نکته مهم این هست که به دلیل وجود فاکتورهای متعدد ، هیچ Disassembler ای ادعا نمیکند که همیشه خروجی مناسبی تولید میکند . به هر Disassembler ای که علاقه داشته باشی کافیه بگردی تا موارد متعددی از گزارشهای خطا و نقص عملکرد رو در موردش پیدا کنی
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  15. #15
    دارم یه چیزهایی می فهمم مرسی

    لازم نیست که در گزارهء mov eax smtng توضیح بدهی که smtng یک دستور نیست ، چون وقتی تکلیف mov مشخص است همه میدانند که مقدمه و موخره اش چیست .
    +
    ازهر کجا که IP مقدار بگیرد CPU آن آدرس را آدرس دستور گرفته و هر مقداری که در حافظه مربوطه باشد سعی میکند decode کرده و اجرا نماید.
    +
    هر آپکد مشخص میکنه چه دستوریه و از چند عملوند تشکیل شده و مقدار انها چه جوره
    =
    من یک فایل رو میخونم مثلا ببینم که در فلان آدرس این فایل نوشته شده EA ، حالا برای اینکه بدونم این EA دستوره یا مقدار داده: باید فایل رو از ابتدای کدش، آنالیز کنم تا برسم به این EA، و در اینجاست که می تونم بفهمم به یه دستور رسیدم یا عملوندی از یک دستور
    درسته؟

  16. #16
    درسته؟
    با کمی دقت به جواب صفحه قبل جواب این سوال واضح هست .
    "فرمت باینری" مهمترین ابزار برای شناسائی معنا و مفهوم عناصر مختلف اون فایل باینری اجرائی هست . پس اگر فایل باینری ای گرفتی که دارای فرمت نبود و اصطلاحا" Raw Binary بود ، در صورتیکه بدانی برای کدام ماشین با چه معماری ای تولید شده باید از ابتدا ، و با Disassembler مناسب تحلیل اش کنی ، و اگر باینری ات دارای فرمت بود باید از فرمت تبعیت کنی
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  17. #17
    اگر فایل باینری ای گرفتی که دارای فرمت نبود و اصطلاحا" Raw Binary بود ، در صورتیکه بدانی برای کدام ماشین با چه معماری ای تولید شده

    من فقط با فایلهای exe ویندوز کار دارم، این فایلها فرمت باینری دارن دیگه؟

  18. #18
    EXE های ویندوز از دو فرمت PE32 و PE64 استفاده میکنن که این فرمت بر اساس فرمت باینری COFF است . اگر Disassembler ای بنویسی ، یا داشته باشی ، که این فرمت رو بشناسه ، بعد از دریافت باینری ، Parse اش میکنه و Section های مختلفش رو جدا میکنه و بعد هر Section رو بر اساس مقتضیات با امکانات جانبی ای که داره به گویش سطح بالا و قابل درکی ترجمه میکنه . به عنوان مثال این روزها بهترین Disassembler موجود ، IDA Pro است که حدود صد فرمت باینری برای حدود پنجاه معماری مختلف رو میشناسه ، و از کامپایلرها و Class Library های مختلفی حمایت میکنه . این محیط بعد از دریافت فایل باینری - مثلا exe - سعی میکنه طی مراحل مختلفی قسمتهای مختلف اون رو به وضعیت بهتری ترجمه کنه . مثلا کدهای ماشین به اسمبلی ترجمه میشن و در صورت وجود افزونه های مناسب ساختارهای تصمیم گیری و چرخه ها و ...نیز قابل شناسائی هستند و داده ها هم بسته به نوع ، به اشکال سطح بالا و قابل درکی ترجمه میشن . همه این ترجمه ها در سایهء وجود اطلاع از ساختار باینری ممکن است . من سعی کردم مسئله رو برات کلی توضیح بدم که به نظر میاد بیخود پیچیده شد . بحث را ساده ببین . دستوراتت در قالبی که همان فایل exe است برای فراخوانی به سیستم عامل داده میشن ، سیستم عامل قسمت کد اون فایل باینری رو برای اجرا آماده میکنه و طبیعتا پردازنده هم اون رو اجرا میکنه . Disassembler ها تلاش میکنند عکس این فرآیند رو انجام بدن .
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  19. #19
    کاربر دائمی آواتار Delphi Skyline
    تاریخ عضویت
    دی 1383
    محل زندگی
    شیراز
    پست
    1,174
    Inprise جان یک سوال داشتم . اونم اینه که در سیستم عامل ویندوز چه چیزی EXE را اجرا می کنه ؟ و با این وجود دیگه اون فایلی که EXE رو به زبان ماشین تبدیل می کنه باید مستقل از پلات فرم باشه ؟ چطوریه ؟ با تشکر .

  20. #20
    سوال دومت رو نفهمیدم . سوال اولت :
    بستگی داره . اجرای برنامه تحت ویندوز در عمل یعنی اجرا تحت یکی از ساب-سیستمهای ویندوز . مثلا Win32 Subsystem یا POSIX subsystem یا Native subsystem و غیره . وقتی برنامه ای اجرا میشه یعنی یا سرویس هست یا از طریق اکسپلورر یا کنسول فراخوانی میشه ابتدا مشخص میشه که به کدام ساب سیستم تعلق داره و بعد ساب سیستم مورد نظر وظایف خودش رو - که توضیحش از حد این تاپیک خارجه - انجام میده . برای مطالعه بیشتر به فصل Process Management کتاب Windows Internals مراجعه کن
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  21. #21
    کاربر دائمی آواتار Delphi Skyline
    تاریخ عضویت
    دی 1383
    محل زندگی
    شیراز
    پست
    1,174
    اول که تشکر . منظور من از سوال دوم اینه که کد ماشین خالص (منظورم اینه که کدی که دیگه CPU می تونه اونو اجرا کنه) مستقل از Platform میشه دیگه ؟
    باز هم تشکر !!! .... !!!!!!

  22. #22
    "کدی که دیگه CPU میتونه اجرا کنه" مفهومی نداره . منظورت رو میفهمم و میدونم داری سعی میکنی چی بگی و اصولا این نوع نگاه به مسئله از اساس غلطه . کدی که پردازنده اجرا میکنه حاوی معادلات ساده ریاضی و ارجاعات حافظه است که در کنار سیستم عامل معنی پیدا میکنه . یعنی در حقیقت در اغلب لحظات عمر یک پردازنده اون در حال اجرای خود سیستم عامل هست چون برنامه های تو در انتهای منهای منطق ریاضی و ارجاعات حافظه حاوی فراخوانی توابع سیستم عامل هستن تا فرامین لازم به پورت ها ارسال بشه و چیزی روی صفحه نقاشی بشه یا پیامی به رابطی ارسال بشه و الی آخر .
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  23. #23
    کاربر دائمی آواتار Delphi Skyline
    تاریخ عضویت
    دی 1383
    محل زندگی
    شیراز
    پست
    1,174
    با تشکر . شاید این سوال کمی ضعیف و غیر فنی به نظر برسه اما می پرسم :
    آیا مفهوم دو سیستم عامل در یک زمان معنی داره یا نه . منظورم اینه که Machine Emulator ها توابع سیستم عامل فعلی رو فراخوانی می کنند ؟ ( پس در این صورت سی پی یو کدام سیستم عامل رو میشناسه و در این حالت سیستم عامل سیموله شده مثل یک برنامه عادی اجرا میشه ؟ )

  24. #24
    اگه این سوالاتت ادامه داشت لطفا براشون تاپیک جدید بزن .

    VM ها از توابع سیستم عامل استفاده میکنن تا باینری های داخلشون به پردازنده برسن و اجرا بشن که اینو بهش میگن Software Virtualization مثلا Vmware همینطوره اما Emulator ها خود پردازنده رو مجددا پیاده سازی کردن و باینری های داخلشون بصورت مستقیم توسط پردازنده میزبان پردازش نمیشن مثلا Boches اینطوریه . این دسته دوم شبیه سازی واقعی رو انجام میدن و به همین دلیل تفاوتهائی دارن و خیلی هم کند تر هستن . وقتی در مورد شبیه سازی و مجازی سازی و ...حرف میزنیم بهر حال ما کماکان یه سیستم عامل داریم : سیستم عامل میزبان . ( در مورد Hardware Virtualizatiion مثلا AMD Pacifica و Intel VT‌ چیزی ننوشتم چون بحثشون جداست )

    آره - دو سیستم عامل قابل اجرا در یک زمان روی یک پردازنده هم با معنیه . اما اصلا یه موضوع متفاوت هست . فناوری N1 شرکت سان یکی از قابلیتهاش همینه .
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •