Переменные и способы адресации

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

#include "stdafx.h"

int Mas[10];

unsigned int i;

void main()

{

for (i=0;i<9;i++)

{

if (i>=4)

Mas[i]=13*i+7;

else

Mas[i]=(i*8) ^ 0xC;

}

}

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

#include "stdafx.h"

int Mas[10];

unsigned int i;

void main() {

00B813A0 55 push ebp

00B813A1 8B EC mov ebp,esp

00B813A3 81 EC C0 00 00 00 sub esp,0C0h

00B813A9 53 push ebx

00B813AA 56 push esi

00B813AB 57 push edi

00B813AC 8D BD 40 FF FF FF lea edi,[ebp-0C0h]

00B813B2 B9 30 00 00 00 mov ecx,30h

00B813B7 B8 CC CC CC CC mov eax,0CCCCCCCCh

00B813BC F3 AB rep stos dword ptr es:[edi]

Запись текущей информации (содержимого регистров ebp, ebx, индексных регистров esi, edi и т.д.) в стек.

for (i=0;i<9;i++) {

00B813BE C7 05 58 81 B8 00 00 00 00 00 mov dword ptr ds:[0B88158h],0

00B813C8 EB 0D jmp main+37h (0B813D7h)

00B813CA A1 58 81 B8 00 mov eax,dword ptr ds:[00B88158h]

00B813CF 83 C0 01 add eax,1

00B813D2 A3 58 81 B8 00 mov dword ptr ds:[00B88158h],eax

00B813D7 83 3D 58 81 B8 00 09 cmp dword ptr ds:[0B88158h],9

00B813DE 73 3D jae main+7Dh (0B8141Dh)

Инициализация переменной i следующим образом: в ячейку памяти, зарезервированную под четырехбайтовую переменную i, записывается значение 0.

Переход к началу цикла путем смещения адреса main на 37h.

Запись значения i в регистр eax;

Увеличение значения, помещенного в регистр eax, на 1;

Запись в переменную i результата сложения;

Сравнение значения переменной i с 9 и, если I больше либо равно 9, то переход в конец цикла путем смещения адреса main на 7Dh.

if (i>=4)

00B813E0 83 3D 58 81 B8 00 04 cmp dword ptr ds:[0B88158h],4

00B813E7 72 1A jb main+63h (0B81403h)

Сравнение значения переменной i с 4 и, если i меньше 4, то переход к команде else путем смещения адреса main на 63h.


Mas[i]=13*i+7;

00B813E9 A1 58 81 B8 00 mov eax,dword ptr ds:[00B88158h]

00B813EE 6B C0 0D imul eax,eax,0Dh

00B813F1 83 C0 07 add eax,7

00B813F4 8B 0D 58 81 B8 00 mov ecx,dword ptr ds:[0B88158h]

00B813FA 89 04 8D 30 81 B8 00 mov dword ptr [ecx*4+0B88130h],eax

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

Умножение значения, хранящегося в eax на 0Dh и помещение результата в eax;

Прибавление 7 к значению в eax;

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

Запись в ячейку массива, расположенную по адресу ecx*4+0B88130h, значения регистра eax.

else

00B81401 EB 18 jmp main+7Bh (0B8141Bh)

Переход к первой команде блока else по адресу main+7Bh.

Mas[i]=(i*8) ^ 0xC;

00B81403 A1 58 81 B8 00 mov eax,dword ptr ds:[00B88158h]

00B81408 C1 E0 03 shl eax,3

00B8140B 83 F0 0C xor eax,0Ch

00B8140E 8B 0D 58 81 B8 00 mov ecx,dword ptr ds:[0B88158h]

00B81414 89 04 8D 30 81 B8 00 mov dword ptr [ecx*4+0B88130h],eax

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

Сдвиг помещенного в регистр значения влево на 3 разряда;

Побитовое исключающее или значения регистра eax и 0Сh;

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

Запись в ячейку с адресом ecx*4+0B88130h значения регистра eax.

}

00B8141B EB AD jmp main+2Ah (0B813CAh)

Переход к началу цикла по адресу main+2Ah.

}

00B8141D 33 C0 xor eax,eax

00B8141F 5F pop edi

00B81420 5E pop esi

00B81421 5B pop ebx

00B81422 8B E5 mov esp,ebp

00B81424 5D pop ebp

00B81425 C3 ret

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

Переменные и способы адресации

Глобальные переменные:

· I типа unsigned int; адрес: 0B88158h

· Mas[10] – массив из 10 элементов типа int; адрес: 0B88130h -0B88154h

Карта памяти:

i 0B88158h
Mas[0] 0B88130h
Mas[1] 0B88134h
Mas[2] 0B88138h
Mas[3] 0B8813Ch
Mas[4] 0B88140h
Mas[5] 0B88144h
Mas[6] 0B88148h
Mas[7] 0B8814Ch
Mas[8] 0B88150h
Mas[9] 0B88154h

00B813BE C7 05 58 81 B8 00 00 00 00 00 mov dword ptr ds:[0B88158h],0

Обращение к переменной i;

Источник: Непосредственная адресация;

Приемик: Абсолютная адресация.

00B813CA A1 58 81 B8 00 mov eax,dword ptr ds:[00B88158h]

Обращение к переменной i;

Источник: Абсолютная адресация;

Приемник: Регистровая адресация.

00B813D2 A3 58 81 B8 00 mov dword ptr ds:[00B88158h],eax

Обращение к переменной i;

Источник: Регистровая адресация;

Приемник: Абсолютная адресация.

00B813D7 83 3D 58 81 B8 00 09 cmp dword ptr ds:[0B88158h],9

Обращение к переменной i;

Источник: Непосредственная адресация;

Приемник: Абсолютная адресация.

00B813E0 83 3D 58 81 B8 00 04 cmp dword ptr ds:[0B88158h],4

Обращение к переменной i;

Источник: Непосредственная адресация;

Приемник: Абсолютная адресация.

00B813F4 8B 0D 58 81 B8 00 mov ecx,dword ptr ds:[0B88158h]

Обращение к переменной i;

Источник: Абсолютная адресация;

Приемник: Регистровая адресация.

00B813FA 89 04 8D 30 81 B8 00 mov dword ptr [ecx*4+0B88130h],eax

Обращение к переменной Mas;

Источник: Регистровая адресация;

Приемник: Косвенно-регистровая адресация со смещением:

· 0B88130h – адрес первого элемента массива

· Ecx*4 – смещение относительно адреса первого элемента

Все команды содержат 2 операнда в адресной части.


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



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