Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная 6.docx
Скачиваний:
11
Добавлен:
18.07.2022
Размер:
40.64 Кб
Скачать

Void main() {

i = 9;

while (i > 0) {

if ((i >= 3) && (i != 5))

*Mas[i] = (3 * i) ^ 0x18;

else

*Mas[i] = (27 * i) / 8;

i--;

}

}

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

1: short *Mas[10];

2: Unsigned long I;

3: Void main() {

00B81750 55 push ebp

00B81751 8B EC mov ebp,esp

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

00B81759 53 push ebx

00B8175A 56 push esi

00B8175B 57 push edi

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

00B81762 B9 30 00 00 00 mov ecx,30h

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

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

00B8176E B9 00 C0 B8 00 mov ecx,offset _F9F5C317_LAB_6@cpp (0B8C000h)

00B81773 E8 8F FB FF FF call @__CheckForDebuggerJustMyCode@4 (0B81307h)

4: i = 9;

00B81778 C7 05 1C A5 B8 00 09 00 00 00 mov dword ptr [i (0B8A51Ch)],9

5: while (i > 0) {

00B81782 83 3D 1C A5 B8 00 00 cmp dword ptr [i (0B8A51Ch)],0

00B81789 76 57 jbe main+92h (0B817E2h)

6: if ((i >= 3) && (i != 5))

00B8178B 83 3D 1C A5 B8 00 03 cmp dword ptr [i (0B8A51Ch)],3

00B81792 72 25 jb main+69h (0B817B9h)

00B81794 83 3D 1C A5 B8 00 05 cmp dword ptr [i (0B8A51Ch)],5

00B8179B 74 1C je main+69h (0B817B9h)

7: *Mas[i] = (3 * i) ^ 0x18;

00B8179D 6B 05 1C A5 B8 00 03 imul eax,dword ptr [i (0B8A51Ch)],3

00B817A4 83 F0 18 xor eax,18h

00B817A7 8B 0D 1C A5 B8 00 mov ecx,dword ptr [i (0B8A51Ch)]

00B817AD 8B 14 8D F4 A4 B8 00 mov edx,dword ptr Mas (0B8A4F4h)[ecx*4]

00B817B4 66 89 02 mov word ptr [edx],ax

00B817B7 EB 1A jmp main+83h (0B817D3h)

8: Else

9: *Mas[i] = (27 * i) / 8;

00B817B9 6B 05 1C A5 B8 00 1B imul eax,dword ptr [i (0B8A51Ch)],1Bh

00B817C0 C1 E8 03 shr eax,3

00B817C3 8B 0D 1C A5 B8 00 mov ecx,dword ptr [i (0B8A51Ch)]

00B817C9 8B 14 8D F4 A4 B8 00 mov edx,dword ptr Mas (0B8A4F4h)[ecx*4]

00B817D0 66 89 02 mov word ptr [edx],ax

10: i--;

00B817D3 A1 1C A5 B8 00 mov eax,dword ptr [i (0B8A51Ch)]

00B817D8 83 E8 01 sub eax,1

00B817DB A3 1C A5 B8 00 mov dword ptr [i (0B8A51Ch)],eax

11: }

00B817E0 EB A0 jmp main+32h (0B81782h)

12: }

00B817E2 33 C0 xor eax,eax

00B817E4 5F pop edi

00B817E5 5E pop esi

00B817E6 5B pop ebx

00B817E7 81 C4 C0 00 00 00 add esp,0C0h

00B817ED 3B EC cmp ebp,esp

00B817EF E8 3C FA FF FF call __RTC_CheckEsp (0B81230h)

00B817F4 8B E5 mov esp,ebp

00B817F6 5D pop ebp

00B817F7 C3 ret

Появились две новые строки, отмеченные серым цветом. Это произошло потому что присвоение значения Mac[i] потребовалось дополнительное действие – разыменование. Значение из массива с индексом i сохраняется в одном из регистров общего назначения и позже происходит команда mov, которая записывает результат выполненной операции из ax в место с адресом, хранящемся в ax.

Вывод

В ходе проделанной лабораторной работы был дизассемблирован исходный код и изменненный код с указателями. Команды дизассемблированного кода были разобраны, также были проанализированы способы адресации и способы обращения компилятора к глобальным переменным.

00D81782 83 3D 4C A1 D8 00 00 cmp dword ptr [i (0D8A14Ch)],0

83(10000011) – compare

3D(00111101):

MOD(00) = 0 – displacement only addressing mode

REG(111) = 7 – edi (data size is 32 bits)

R/M(101) = 5 – displacement only addressing mode

4C A1 D8 00 - адрес i (0D8A14C)

00 – значение нуля