PDA

View Full Version : سوال: تفاوت حلقه ها از نظر اجرای زبان ماشین



احمد سامعی
چهارشنبه 26 تیر 1392, 15:00 عصر
سلام

دوستان تفاوت حلقه های مختلف از نظر رفتار در اجرا در زبان ماشین چیه آیا با هم فرق دارن یا در نهایت کمپایل همه شون یک جور ترجمه می کنه؟

من می خوام بدونم مثلا مقایسه ای که در شرط for صورت می گیره با while با do و با if ساده آیا فرق دارن با هم یا نه؟ منظورم اگر برنامه در حال اجرا رو از طریق اطلاعات CPU و سگمنت ها مانیتور کنیم تفاوت دارن با هم یا نه؟

Abbas Naghdi
چهارشنبه 26 تیر 1392, 15:24 عصر
While برای مواقعی هست که تعداد حلقه های اجرایی رو نمیدونید ... مثلا تا وقتی s = 0 بود !
for برای مواقعی هست که شما تعداد اجرای حلقه رو میدونید ...

do while هم برای زمانی هست که شما شرطی در حلقه ی while قرار میدیت ... این شرط اگر صحیح باشه که حلقه اجرا میشه اما اگر صحیح نباشه حلقه یک بار کد هاش اجرا میشن ... در واقع بعد از کد ها ی داخل حلقه شرط حلقه رو چک میکنه ...

از نظر کارایی و ترجمه و ... که فکر کنم فرق داشته باشه ... از لحاظ سرعت و ... فکر نکنم فرقی داشته باشه !

احمد سامعی
چهارشنبه 26 تیر 1392, 15:59 عصر
دوست عزیز اول سوال بخون بعد جواب بده اون چیزی که گفتی توی اولین صفحه کتاب و جزوه برنامه نویسی هست و اولین چیزی که یادت می دن

من رفتار در زبان ماشین می خوام بدونم برای استفاده در طراحی قفل برنامه چون می گن if سریع شناسی می شه اما while نه؟ اما ظاهرا در اجرا در اسمبلی یکی هست و کرکر با اسمبل برنامه در ارتباط هست

IamOverlord
چهارشنبه 26 تیر 1392, 16:10 عصر
سلام دوستان!
تو زبان اسمبلی در نهایت یه سری پرش شرطی باقی می مونه و دستورات مقایسه و اینا... که می تونید با CMP یا TEST مقایسه تون رو انجام بدید... و برای پرش شرطی هم اینا هست مثلا:
JA, JAE, JB, JBE, JC, JE, JG, JGE, JL, JLE, JNA, JNAE, JNB, JNBE, JNC, JNE, JNG, JNGE, JNL, JNLE, JNO, JNP, JNS, JNZ, JO, JP, JPE, JPO, JS, JZ
دز ضمن JMP هم هست که بدون چک کردن هیچ شرطی می پره و JCXZ هم هست که چک می کنه CX صفر باشه...
در واقع تحت تاثیر یه سری flag اینا عمل می کنن... که اون flag ها هم تحت تاثیر مقایسه ی شما بودن... jmp هم یه چیزی تو مایه های GOTO در BASIC هست... یعنی شرطی نیست پرشش...
حالا هر ساختار شرطی یا حلقه ای رو با همین جور چیزا پیاده سازی می کنن... یه جورایی اینا به IF-GOTO شبیه تر هستن تا چیز دیگه...
ضمنا حرفام رو برای x86 زدم...

pcrlth0n
چهارشنبه 26 تیر 1392, 16:17 عصر
پیاده سازی حلقه ها در کامپایلرهای مختلف متفاوته و به میزان بهینه بودن اون هم بستگی داره.
توی این مقاله دقیق متوجه میشی چی به چیه.

لینک دانلود (http://sp-hr.persiangig.com/document/loop-pdf.rar)

این 2 تا مثال رو disassemble کن تا به تفاوتشون پی ببری

لینک دانلود (http://sp-hr.persiangig.com/document/loop.rar)

در مورد اینکه بخوای با این دستورها ایمنی برنامت رو تامین کنی, باید بدونی که امکانش نیس.
این دستور ها با نگاهی ساده به کدهای dissasm شدشون قابل تشخیص هستن و به سادگی توسط کرکر میتونه با حلقه های دیگر هم پیاده سازی بشه.

alaveh
چهارشنبه 26 تیر 1392, 16:23 عصر
سلام

دوستان تفاوت حلقه های مختلف از نظر رفتار در اجرا در زبان ماشین چیه آیا با هم فرق دارن یا در نهایت کمپایل همه شون یک جور ترجمه می کنه؟

من می خوام بدونم مثلا مقایسه ای که در شرط for صورت می گیره با while با do و با if ساده آیا فرق دارن با هم یا نه؟ منظورم اگر برنامه در حال اجرا رو از طریق اطلاعات CPU و سگمنت ها مانیتور کنیم تفاوت دارن با هم یا نه؟
اگر منظورت برای کرک شدن برنامه هست که هیچ فرقی نمیکنه . اونی که بلد باشه کرک کنه حتما بلده دنبال دستورات پرش هم بگرده . اینا صرفا برای سادگی برنامه نویسی هست و بس . قطعا هم هیچ کدوم امنیت رو تامین نمیکنن و اینجور نیست که کسی بیاد بگه برنامه ای که با While نوشته شده از برنامه ای که با For نوشته شده ایمن تره .

احمد سامعی
چهارشنبه 26 تیر 1392, 18:18 عصر
ممنون از همه دوستان
من نمی تونستم پنجره اسبلی برنامه در حال دیباگ پیدا کنم یادم رفته بود که پیدا کردم خودم هم با یک برنامه ساده مقایسه کردم همین رو فهمیدم در واقع یک عده از دوستان در سایت های مختلف در بخش امنیت نظر داده بودن که در بخش بررسی درستی برنامه از if استفاده نشه چون افرادی که برنامه رو به روش دی کمپایل کرکر می کنن اول می رن سراغ if بنابراین ازش استفاده نکنید من هم می خواستم ببینم واقعا در زمانی که طرف پراسزهای برنامه رو چک می کنه از نظر رفتاری فرقی داره که خودم هم به این نتیجه رسید م فرقی نداره و این حرفها بی خوده فقط فرقشون توی همون جامپ ها هست

آیا برنامه ای رو برای پروتکت کردن پیشنهاد می کنید؟(می دونم جاش تو این تاپیک نیست)

باز هم ممنون

Mahmoud.Afrad
چهارشنبه 26 تیر 1392, 20:15 عصر
بهتره توی بخش اسمبلی مطرح میکردی.
if یک CMP ساده است و حلقه ها یک CMP به همراه جامپ پس برای کسی که وارد باشه هیچ فرقی نمکنه.