تشخیص ساختارهای برنامه نویسی در اسمبلی - قسمت دوم
انواع مختلفی از عملیات ریاضی رو میشه توی زبان سی پیاده سازی کرد در اینجا هم ما چند نمونه از این عملیات رو مثل جمع و تفریق, - - , ++ و % رو مورد بررسی قرار میدیم.
کد برناممون هم بصورت زیر هستش:
int a = 0;
int b = 1;
a = a + 11;
a = a - b;
a--;
b++;
b = a % 3;
کد دیس اسمبل شده بالا بصورت زیر هستش:
00401006 mov [ebp+var_4], 0
0040100D mov [ebp+var_8], 1
00401014 mov eax, [ebp+var_4] 1
00401017 add eax, 0Bh
0040101A mov [ebp+var_4], eax
0040101D mov ecx, [ebp+var_4]
00401020 sub ecx, [ebp+var_8] 2
00401023 mov [ebp+var_4], ecx
00401026 mov edx, [ebp+var_4]
00401029 sub edx, 1 3
0040102C mov [ebp+var_4], edx
0040102F mov eax, [ebp+var_8]
00401032 add eax, 1 4
00401035 mov [ebp+var_8], eax
00401038 mov eax, [ebp+var_4]
0040103B cdq
0040103C mov ecx, 3
00401041 idiv ecx
00401043 mov [ebp+var_8], edx 5
خط اول:
مقدار 0 به متغیر اول انتقال داده میشه (جلسه قبل در مورد انواع متغیرها توضیح دادم پس فک نکنم نیاز به توضیح در مورد این متغیر محلی باشه)
پس a = 0
خط دوم:
مقدار 1 به متغیر دوم انتقال داده میشه پس b = 1
خط سوم:
متغیر a به رجیستر eax انتقال داده میشه تا بشه روش عملیات محاسباتی انجام داد
خط چهارم:
0Bh (یا همون 11 خودمون) به eax اضافه میشه و نتیجه توی eax نگهداری میشه
پس eax = a + 11
خط پنجم:
مقدار eax به متغیر a انتقال داده میشه
یعنی a = eax که در کل میشه a = a + 11
خط ششم:
متغیر a به رجیستر ecx انتقال داده میشه
خط هفتم:
متغیر دوم یعنی b از ecx کم میشه و نتیجه توی ecx نگهداری میشه
پس یعنی ecx = ecx – b
خط هشتم:
مقدار ecx به متغیر a انتقال داده میشه پس نتیجه a – b به a انتقال داده میشه
خط نهم:
متغیر a به رجیستر edx انتقال داده میشه
خط دهم:
از edx یک واحد کم میشه
خط یازدهم:
رجیستر edx به متغیر a انتقال داده میشه که یعنی a = a – 1 یا همون a – خودمون
خط دوازدهم:
مقدار متغیر b به eax انتقال داده میشه
خط سیزدهم:
یه واحد به رجیستر eax اضافه میشه
خط چهاردهم:
حالا رجیستر eax به متغیر b انتقال داده میشه که یعنی b = b + 1 یا همون b++ خودمون
خط پانزدهم:
متغیر a به رجیستر eax انتقال داده میشه
خط شانزدهم:
CDQ 4بایت رو به 8 بایت ارتقاء میده
در اینجا هم از edx:eax ایجاد میشه
خط هفدهم:
عدد 3 به ecx انتقال داده میشه
خط هجدهم:
زمانی که دستور idiv اجرا میشه مقدار eax بر ecx تقسیم میشه ( a / 3) و نتیجه در eax و باقیمانده در edx نگهداری میشه
خط نوزدهم:
مقدار رجیستر edx که باقیمانده هستش به متغیر b انتقال داده میشه که نتیجه ی اجرای این چند دستور a = a % 3 میشه
با رنگ از هم دیگه جدا کردم که راحتتر متوجه بشید.
موفق باشید.
pcrlth0n