Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

Share what I know............... learn what I don’t

(انجام پروژه های مرتبط، برای اطلاعات بیشتر به صفحه "ارتباط با من" مراجعه کنید)

آخرین نظرات

آنالیز و کشف الگوریتم (1) پیوست

سه شنبه, ۶ مرداد ۱۳۹۴، ۱۲:۱۶ ق.ظ

با سلام.

یکی از دوستان توی نظری که داده بودند از نحوه ی تحلیل sample سوم در پست قبل ایراد گرفته بودند. ایشون از جواب خلاصه نشده هم از توضیح ندادن در مورد اعداد شناور و رجیسترها و امکانات CPU برای این منظور ایراد گرفتن.

همونطور که این دوستمون گفتند باید از یک مثال دیگه ای که فعلا این دستورات داخلش نباشه استفاده میکردم. ولی حالا که این اتفاق افتاده توی این پست قصد دارم در مورد Floating point توضیحاتی رو بدم.

 


X87 FPU

 

دستورات floating point توسط یک پروسسور کمکی که x87 coprocessor نامیده میشه اجرا میشن. در هنگام رویایویی با دستورات floating point , پروسسور x86 دستورات رو به x87 منتقل میکنه. در عین حال دستور x86 اجرای خودشون رو ادامه میدند مگر اینکه دستور بعدی هم یک دستور floating point باشه یا نیاز به نتیجه این دستورات داشته باشه.

در این موارد دستور WAIT برای متوقف کردن پروسسور اجرا میشه.

کامپایلرهای مختلفی هستند که دستورات x87 رو emulate میکنند, این emulation ازطریق وقفه صورت میگیره. در هنگام رخدادن چنین وقفه ای, تابع interrupt hanlder اجرا میش و این دستورات رو emulate میکند.

 

8 تا رجیستر floating point وجود داره که ازST(0)  تا ST(7)  هستند و 10 بایت (80بیت) سایز دارند. البته اینا رجیسترهای واقعی نیستند و از پشته برای این منظور استفاده میشه. بغیر از این 8 رجیستر یه رجیستر دیگه هم وجود داره که 16 بیت سایز داره که رجیستر وضعیت ( FPU status register ) نامیده میشه.

مقادیر در این رجیسترها (8 رجیستر) بصورت double extended-precision نگهداری میشن و وقتی که یه عدد صحیح,عدد اعشار یا اعداد BCD قراره از حافظه به داخل این رجیسترها لود بشن بصورت اتوماتیک به double extended-precision تبدیل میشه.

نتیجه محاسبه متعاقبا از این رجیسترها به حافظه انتقال داده میشه .نتیجه محاسبه میتونه از حالت double extended-precision خارج بشه یا به یه shorter floating point یا عدد صحیح یا عدد BCD تبدیل بشه.



دستورات floating point با این 8 رجیستر مثل رجیستر پشته (register stack) رفتار میکنند. همه ی آدرس دهی های این 8 رجیستر وابسته رجیستر بالای پشته است. register number رجیستر بالای پشته جاری در فیلد TOP نگهداری میشه (stack TOP) که این فیلد داخل status register است.

عملیات لود, TOP را کاهش میده و مقدار را در رجیستر بالای پشته جدید لود می کنه.

عملیات store, مقدار رو از رجیستر TOP جاری در حافظه store می کنه و TOP را افزایش میده.(مثل push و pop )



میدونم که تا اینجا درک مطالب واستون سخته پس با مثال جلو میریم:


1- دستور FLD value1:

توی شکل زیر می بینید که value1 برابر با 5.6 هستش پس با اجرای این دستور TOP کاهش پیدا کرده و مقدار 5.6 از حافظه به داخل (0)ST لود میشه.نتیجه ی این عملیات شکل (a).

 

2- دستور بعدی مقدار  (0)ST  رو با مقدار 2.4 که در حافظه است ضرب می کنه و نتیجه رو در  (0)ST  نگهداری می کنه.نتیجه ی این عملیات شکل (B)

 

3- دستور سوم TOP رو کاهش میده و مقدار 3.8 رو در  (0)ST  لود می کنه

 

4- دستور بعدی مقدار داخل  (0)ST رو با مقدار داخل حافظه یعنی 10.3 ضرب می کنه و نتیجه رو در   (0)ST  نگهداری می کنه.شکل (c)

 

5- دستور پنجم مقدار   (0)ST  رو به  (1)ST  اضافه می کنه و نتیجه رو در  (0)ST  نگهداری می کنه. شکل (d)




x87 FPU Status Register

 

همونطور که گفتیم این رجیستر 16بیت هستش و نشان دهنده ی وضعیت x87 FPU جاری هستش.


فیلد TOP:

 

گفتیم که این فیلد اشاره گری به یکی از 8 رجیستری است

که در حال حاضر در بالای x87 FPU register stack است.

بیت های 11تا 13 این رجیستر متعلق به این فیلد هستش که جمعا 0 تا 7 رو میشه باهاش نشون داد.

 

 

دستورات floating point رو میشه بصورت زیر طبقه بندی کرد:

data movement instruction

conversion

arithmetic instruction

comparison constant instructions

transcendental instructions

miscellaneous instructions

 

 

FPU ها خیلی چیزای دیگه داره که نگفتم و فک کنم همین مطالب شمارو با این مبحث آشنا بکنه.

پست قبل هم با اطلاعات جدید بروز شدش.

موفق باشید.


نظرات (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی