00B813C8 EB 0D jmp main+37h (0B813D7h)
00B813DE 73 3D jae main+7Dh (0B8141Dh)
00B813E7 72 1A jb main+63h (0B81403h)
00B81401 EB 18 jmp main+7Bh (0B8141Bh)
00B8141B EB AD jmp main+2Ah (0B813CAh)
Абсолютная адресация (путем смещения относительно процедуры main).
Обращение к локальным переменным
Обращение к переменной i:
00F813BE C7 45 C8 00 00 00 00 mov dword ptr [i],0
00F813C7 8B 45 C8 mov eax,dword ptr [i]
00F813CD 89 45 C8 mov dword ptr [i],eax
00F813D0 83 7D C8 09 cmp dword ptr [i],9
00F813D6 83 7D C8 04 cmp dword ptr [i],4
00F813E5 8B 4D C8 mov ecx,dword ptr [i]
Адресация не изменилась.
00F813E8 89 44 8D D4 mov dword ptr Mas[ecx*4],eax
Адресация не изменилась.
Обращение к массиву через указатель
#include "stdafx.h"
int Mas[10];
unsigned int i;
int *Mas2;
void main()
{
Mas2=&Mas[0];
for (i=0;i<9;i++)
{
if (i>=4)
*(Mas2+i)=13*i+7;
else
*(Mas2+i)=(i*8) ^ 0xC;
}
}
*(Mas2+i)=13*i+7;
009113FB A1 58 81 91 00 mov eax,dword ptr ds:[00918158h]
00911400 6B C0 0D imul eax,eax,0Dh
00911403 83 C0 07 add eax,7
00911406 8B 0D 58 81 91 00 mov ecx,dword ptr ds:[918158h]
0091140C 8B 15 5C 81 91 00 mov edx,dword ptr ds:[91815Ch]
00911412 89 04 8A mov dword ptr [edx+ecx*4],eax
В первых четырех строках производятся вычисления;
В пятой строке происходит запись в регистр edx адреса первого элемента массива Mas2;
В последней строчке в ячейку с адресом edx+ecx*4 записывается результат вычислений, хранящийся в регистре eax.
|
|
Выводы
В результате выполнения работы была написана программа на языке C, был дизассемблирован исходный код, по исходному коду было проанализировано, как компилятор реализует команды языка высокого уровня на ассемблере, разобраны способы адресации и способы обращения компилятора к различным переменным.