Дизассемблированный код

Исходная программа на языке С

#include "stdafx.h"

long lA;

unsigned long ulA;

long Fn(long A, unsigned long B)

{

long temp1;

temp1 = 1;

long temp2;

temp2 = 2;

temp1 = temp1 + temp2;

temp1 = temp1 - A;

temp1 = temp1 * B;

return temp1;

}

void main()

{

long result;

lA = 10;

ulA = 100;

result = Fn(lA, ulA);

}

Дизассемблированный код

#include "stdafx.h"

long lA;

unsigned long ulA;

long Fn(long A, unsigned long B)

{

013313A0 55 push ebp

013313A1 8B EC mov ebp,esp

013313A3 81 EC D8 00 00 00 sub esp,0D8h

013313A9 53 push ebx

013313AA 56 push esi

013313AB 57 push edi

013313AC 8D BD 28 FF FF FF lea edi,[ebp-0D8h]

013313B2 B9 36 00 00 00 mov ecx,36h

013313B7 B8 CC CC CC CC mov eax,0CCCCCCCCh

013313BC F3 AB rep stos dword ptr es:[edi]

В данном фрагменте происходит сохранение информации содержащейся в регистрах ebx, esi, edi, esp и т.д.

long temp1;

temp1 = 1;

013313BE C7 45 F8 01 00 00 00 mov dword ptr [temp1],1

Инициализация переменной temp1 путем перевода адресной части в двойное машинное слово и записи туда 1.

long temp2;

temp2 = 2;

013313C5 C7 45 EC 02 00 00 00 mov dword ptr [temp2],2

Инициализация переменой temp2 путем перевода адресной части в двойное машинное слово и записи туда 2.

temp1 = temp1 + temp2;

013313CC 8B 45 F8 mov eax,dword ptr [temp1]

013313CF 03 45 EC add eax,dword ptr [temp2]

013313D2 89 45 F8 mov dword ptr [temp1],eax

Запись значения переменной temp1 в регистр eax;

Прибавление значения переменной temp2 к значению, хранящемуся в регистре eax;

Запись в переменную temp1 значения регистра eax.

temp1 = temp1 - A;

013313D5 8B 45 F8 mov eax,dword ptr [temp1]

013313D8 2B 45 08 sub eax,dword ptr [A]

013313DB 89 45 F8 mov dword ptr [temp1],eax

Запись значения переменной temp1 в регистр eax;

Вычитание значения переменной А из значения в регистре eax;

Запись в переменную temp1 значения регистра eax.

temp1 = temp1 * B;

013313DE 8B 45 F8 mov eax,dword ptr [temp1]

013313E1 0F AF 45 0C imul eax,dword ptr [B]

013313E5 89 45 F8 mov dword ptr [temp1],eax

Запись значения переменной temp1 в регистр eax;

Умножение значения переменной В на значение в регистре eax;

Запись в переменную temp1 значения регистра eax.

return temp1;

013313E8 8B 45 F8 mov eax,dword ptr [temp1]

Запись значения переменной temp1 в регистр eax.

}

013313EB 5F pop edi

013313EC 5E pop esi

013313ED 5B pop ebx

013313EE 8B E5 mov esp,ebp

013313F0 5D pop ebp

013313F1 C3 ret

В этих строках происходит возврат из функции и восстановление из стека сохранённых значений регистров.

void main()

{

01331400 55 push ebp

01331401 8B EC mov ebp,esp

01331403 81 EC CC 00 00 00 sub esp,0CCh

01331409 53 push ebx

0133140A 56 push esi

0133140B 57 push edi

0133140C 8D BD 34 FF FF FF lea edi,[ebp-0CCh]

01331412 B9 33 00 00 00 mov ecx,33h

01331417 B8 CC CC CC CC mov eax,0CCCCCCCCh

0133141C F3 AB rep stos dword ptr es:[edi]

В данном фрагменте происходит сохранение информации содержащейся в регистрах ebx, esi, edi, esp и т.д.

long result;

lA = 10;

0133141E C7 05 30 81 33 01 0A 00 00 00 mov dword ptr ds:[1338130h],0Ah

Запись в переменную lA значения 10 (0Ah).

ulA = 100;

01331428 C7 05 34 81 33 01 64 00 00 00 mov dword ptr ds:[1338134h],64h

Запись в переменную ulA значения 100 (64h).

result = Fn(lA, ulA);

01331432 A1 34 81 33 01 mov eax,dword ptr ds:[01338134h]

01331437 50 push eax

01331438 8B 0D 30 81 33 01 mov ecx,dword ptr ds:[1338130h]

0133143E 51 push ecx

0133143F E8 92 FD FF FF call Fn (013311D6h)

01331444 83 C4 08 add esp,8

01331447 89 45 F8 mov dword ptr [result],eax

Запись в регистр eax значения переменной lA;

Помещение значения регистра eax в стек;

Запись в регистр ecx значения переменной ulA;

Помещение значения регистра ecx в стек;

Вызов подпрограммы Fn;

Запись в переменную result значения регистра eax;

}

0133144A 33 C0 xor eax,eax

0133144C 5F pop edi

0133144D 5E pop esi

0133144E 5B pop ebx

0133144F 81 C4 CC 00 00 00 add esp,0CCh

01331455 3B EC cmp ebp,esp

01331457 E8 84 FD FF FF call __RTC_CheckEsp (013311E0h)

0133145C 8B E5 mov esp,ebp

0133145E 5D pop ebp

0133145F C3 ret

Здесь происходит восстановление сохраненного в начале процедуры в стеке содержимого регистров и возврат из процедуры main.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: