- •Высшая школа интеллектуальных систем и суперкомпьютерных технологий лабораторная работа №6 «Команды и способы адресации для x86 в 32-битном режиме»
- •Void main() {
- •2: Unsigned long I;
- •3: Void main() {
- •8: Else
- •00D8178b 83 3d 4c a1 d8 00 03 cmp dword ptr [I (0d8a14Ch)],3
- •00D81794 83 3d 4c a1 d8 00 05 cmp dword ptr [I (0d8a14Ch)],5
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 – значение нуля